正确使用 numpy 与图像的卷积

Suh*_*pta 3 python numpy image-processing convolution conv-neural-network

我在 CNN 上观看Andrew Ng 的视频,想用滤波器6 x 6对图像进行卷积3 x 3。我用 numpy 处理这个问题的方法如下:

image = np.ones((6,6))
filter = np.ones((3,3))

convolved = np.convolve(image, filter)
Run Code Online (Sandbox Code Playgroud)

运行此命令会出现错误:

ValueError: object too deep for desired array
Run Code Online (Sandbox Code Playgroud)

我可以从convolve 的 numpy 文档中理解如何正确使用该convolve方法。

另外,有没有办法可以用 numpy 进行跨步卷积?

gmd*_*mds 5

np.convolve不幸的是,该函数仅适用于维卷积。这就是为什么你会收到错误;您需要一个允许您执行二维卷积的函数。

然而,即使它确实起作用了,你实际上还是操作错误了。机器学习中的卷积在数学中更恰当地称为互相关。它们实际上几乎是一样的;卷积涉及翻转滤波器矩阵,然后执行互相关。

要解决您的问题,您可以查看scipy.signal.correlate(另外,不要用作filter名称,因为您会隐藏内置函数):

from scipy.signal import correlate

image = np.ones((6, 6))
f = np.ones((3, 3))

correlate(image, f)
Run Code Online (Sandbox Code Playgroud)

输出:

array([[1., 2., 3., 3., 3., 3., 2., 1.],
       [2., 4., 6., 6., 6., 6., 4., 2.],
       [3., 6., 9., 9., 9., 9., 6., 3.],
       [3., 6., 9., 9., 9., 9., 6., 3.],
       [3., 6., 9., 9., 9., 9., 6., 3.],
       [3., 6., 9., 9., 9., 9., 6., 3.],
       [2., 4., 6., 6., 6., 6., 4., 2.],
       [1., 2., 3., 3., 3., 3., 2., 1.]])
Run Code Online (Sandbox Code Playgroud)

这是完全互相关的标准设置。如果您想删除依赖于零填充的元素,请传递mode='valid'

from scipy.signal import correlate

image = np.ones((6, 6))
f = np.ones((3, 3))

correlate(image, f, mode='valid')
Run Code Online (Sandbox Code Playgroud)

输出:

array([[9., 9., 9., 9.],
       [9., 9., 9., 9.],
       [9., 9., 9., 9.],
       [9., 9., 9., 9.]])
Run Code Online (Sandbox Code Playgroud)