正确使用numpy与图像卷积

问题描述 投票:1回答:1

我正在观看Andrew Ng's videos on CNN,并希望用6 x 6滤镜对3 x 3图像进行卷积。我用numpy接近这个的方式如下:

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

convolved = np.convolve(image, filter)

运行此命令会出错:

ValueError: object too deep for desired array

我可以从numpy documentation of convolve了解如何正确使用convolve方法。

另外,有没有办法我可以用numpy进行大步调整?

python numpy image-processing conv-neural-network convolution
1个回答
1
投票

遗憾的是,np.convolve函数仅适用于一维卷积。这就是你得到错误的原因;您需要一个允许您执行二维卷积的功能。

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

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

from scipy.signal import correlate

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

correlate(image, f)

输出:

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.]])

这是完全互相关的标准设置。如果你想删除rely on the zero-padding的元素,请传递mode='valid'

from scipy.signal import correlate

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

correlate(image, f, mode='valid')

输出:

array([[9., 9., 9., 9.],
       [9., 9., 9., 9.],
       [9., 9., 9., 9.],
       [9., 9., 9., 9.]])
© www.soinside.com 2019 - 2024. All rights reserved.