scipy.signal.convolve2d计算什么?

时间:2017-01-12 12:23:23

标签: python scipy

我目前对

的输出感到困惑
Products

#!/usr/bin/env python

import scipy.signal

image = [[1, 2, 3, 4, 5, 6, 7],
         [8, 9, 10, 11, 12, 13, 14],
         [15, 16, 17, 18, 19, 20, 21],
         [22, 23, 24, 25, 26, 27, 28],
         [29, 30, 31, 32, 33, 34, 35],
         [36, 37, 38, 39, 40, 41, 42],
         [43, 44, 45, 46, 47, 48, 49]]

filter_kernel = [[-1, 1, -1],
                 [-2, 3, 1],
                 [2, -6, 0]]

res = scipy.signal.convolve2d(image, filter_kernel,
                              mode='same', boundary='fill', fillvalue=0)
print(res)

我希望左上角的元素为[[ -2 -8 -7 -6 -5 -4 28] [ 3 -7 -10 -13 -16 -19 14] [ -18 -28 -31 -34 -37 -40 0] [ -39 -49 -52 -55 -58 -61 -14] [ -60 -70 -73 -76 -79 -82 -28] [ -81 -91 -94 -97 -100 -103 -42] [-101 -61 -63 -65 -67 -69 -57]] (省略填充的零)。

我认为这会通过在左/右和上/下添加一个0来将R ^ {7x7}中的矩阵图像扩展为R ^ {9x9}。然后我认为3*1 + 1*2 + (-6) *8 + 0*9 = -43将通过"滑动"来计算。它超过了filter_kernel。在每个位置,图像中的数字逐点乘以内核中的数字。这9个产品总结并写入image

但是,它是res。显然,会发生一些不同的事情。

1 个答案:

答案 0 :(得分:1)

Convolution会反转其工作的某个功能的方向。检查definition on Wikipedia:一个函数用τ参数化,另一个函数用-τ参数化。这同样适用于2D卷积。

您需要镜像内核以获得预期的resut:

filter_kernel = [[0, -6, 2],
                 [1, 3, -2],
                 [-1, 1, -1]]

res = scipy.signal.convolve2d(image, filter_kernel,
                              mode='same', boundary='fill', fillvalue=0)
print(res[0, 0])
# -43