我想了解卷积是如何工作的。 下面是一些代码:
import numpy
from scipy import misc
data = misc.imread("path_to_a_512x512_grayscale_image.png")
data = data/255.0
masque = numpy.array([[-1,0,1],
[-2,0,0],
[-1,0,1]],numpy.double)
def my_convolution(image, masque):
hauteur,largeur = image.shape
resultat = numpy.empty((hauteur,largeur))
for y in range(1,hauteur-1):
for x in range(1,largeur-1):
pixel = 0.0
for ym in range(3):
for xm in range(3):
pixel += masque[ym,xm]*image[y-1+ym,x-1+ym]
resultat[y,x]=pixel/9.0
return resultat
my_result = my_convolution(data,masque)
plt.imshow(my_result, cmap='gray')
结果与下面这个基本方法不完全相同。 我之前的方法给出了一张似乎更暗的图片
from scipy import signal
result2 = signal.convolve2d(data, masque)
result2 = result2[1:-1,1:-1]
plt.imshow(result2, cmap='gray')
任何打电话给我解释这两个代码的人不会给出相同的结果吗? 我不想知道哪种方法最快,我知道第一种方法很丑,我只是想了解。
谢谢
卷积需要向后返回其中一个卷积函数,这意味着减去内部索引,而不是添加它们。此外,image
访问表达式中的第二个索引具有不匹配的术语。所以
pixel += masque[ym,xm]*image[y-1+ym,x-1+ym]
应该更像
pixel += masque[ym,xm]*image[y-1-ym,x-1-xm]
为了进行确认,请查看调用signal.convolve2d
时运行的代码(特别是此处和此处)。内部索引与其各自的外部索引匹配,并且在卷积过程中减去它们,而不是相加。