奇怪的卷积结果

时间:2017-07-06 17:35:49

标签: 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')

任何人打电话给我解释这两个代码都没有给出相同的结果? 我不想知道哪种方法最快,我知道第一种方法非常难看,我只想了解。

由于

1 个答案:

答案 0 :(得分:0)

卷积要求在一个卷积函数上倒退,这意味着减去内部索引,而不是添加它们。此外,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时运行的code(具体为herehere)。内部索引与它们各自的外部索引匹配,并且在卷积期间减去它们,而不是添加。