大家好,又见面了,我是你们的朋友全栈君。
写了那么久的博客,始于Python爬虫,目前专于Java学习,终于有了属于自己的小窝,欢迎各位访问我的个人网站,未来我们一起交流进步。
在爬虫处理验证码的过程中接触到矩阵卷积运算,关于该类运算,记录一下自己的心得。
理论知识
在讲述卷积过程前,我们来了解一下卷积公式。根据离散二维卷积公式:

其中A为被卷积矩阵,K为卷积核,B为卷积结果,该公式中,三个矩阵的排序均从0开始。
现在对于上面卷积过程进行分析:我们用来做例子的 A 矩阵为 m×m(3×3)二维矩阵(被卷积矩阵),K 为 n×n(2×2)的二维矩阵(卷积核)。






实际应用
关于卷积计算,在 Python 中存在于 scipy 的 signal 模块,这里需要介绍一下 scipy.signal.convolve2d 函数。
scipy.signal.convolve2d(in1,in2,mode ='full',boundary ='fill',fillvalue = 0 )from scipy import signal
import numpy as np
x = np.array([[1, 2],
[3, 4]])
b = []
a = []
for i in range(1,10):
if i%3 == 0:
a.append(i)
b.append(a)
a = []
continue
else:
a.append(i)
print(np.array(b))
h = np.array(b)
print(signal.convolve2d(h, x, mode='same'))
print(signal.convolve2d(h, x, mode='full'))
print(signal.convolve2d(h, x, mode='valid'))输出结果为:
[[ 1 4 7]
[ 7 23 33]
[19 53 63]]
[[ 1 4 7 6]
[ 7 23 33 24]
[19 53 63 42]
[21 52 59 36]]
[[23 33]
[53 63]]结合程序与图片分析,被卷积矩阵(m×m)和卷积核(n×n)做卷积运算时,当 scipy.signal.convolve2d 函数中 mode 参数值为 full(默认值)时,得到是完全卷积结果;当 mode 参数值为 valid 时,输出计算过程中没有扩充的 0 参与计算的值;当 mode 参数值为 same 时,输出与被卷积矩阵大小相同的矩阵,按照我的理解是,当卷积结果矩阵的大小(m+n -1)为偶数时,same 输出的矩阵从左上角按照 m 大小截取。当卷积结果矩阵的大小(m+n -1)为奇数时,same 输出的矩阵从正中间截取大小为 m d的矩阵。

注意:假如被卷积矩阵(3×3)和卷积核(3×3)做卷积运算时,6×6 矩阵扩充时,扩充结果如下:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/223454.html原文链接:https://javaforall.cn