奇怪的卷积结果

  • 本文关键字:结果 卷积 numpy
  • 更新时间 :
  • 英文 :


我想了解卷积是如何工作的。 下面是一些代码:

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时运行的代码(特别是此处和此处)。内部索引与其各自的外部索引匹配,并且在卷积过程中减去它们,而不是相加。

最新更新