为什么我的手动卷积与scipy.ndimage.convolve不同

gkl3eglg  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(149)

我提前道歉,我可能只是不理解卷积。
我正在努力使scipy.ndimage.convolve的结果与我试图手工做的结果相一致。
documentation为例:

import numpy as np
a = np.array([[1, 2, 0, 0],
              [5, 3, 0, 4],
              [0, 0, 0, 7],
              [9, 3, 0, 0]])
k = np.array([[1,1,1],[1,1,0],[1,0,0]])
from scipy import ndimage
ndimage.convolve(a, k, mode='constant', cval=0.0)
array([[11, 10,  7,  4],
       [10,  3, 11, 11],
       [15, 12, 14,  7],
       [12,  3,  7,  0]])

然而,我希望结果是:

([[1,  8,  5,  0],
       [8, 11,  5,  4],
       [8, 17, 10, 11],
       [9, 12, 10,  7]])

例如,对于左上角的值:

1×0 (extended beyond the input)
1×0 (extended beyond the input)
1×0 (extended beyond the input)
1×0 (extended beyond the input)
1×1
0×2
1×0 (extended beyond the input)
0×5
0×3
___
=1

我看不出它怎么会是11
我对卷积,数组,或者scipy在这里做什么有什么误解?

svujldwt

svujldwt1#

您手动执行的操作是互相关,而不是卷积。卷积的过程类似,但“翻转”了内核。你可以证明你的预期结果可以通过首先翻转你的内核来获得,然后在卷积过程中取消翻转:

> ndimage.convolve(a, np.flip(k), mode='constant', cval=0.0)
array([[ 1,  8,  5,  0],
       [ 8, 11,  5,  4],
       [ 8, 17, 10, 11],
       [ 9, 12, 10,  7]])

这里有更多的信息:https://cs.stackexchange.com/questions/11591/2d-convolution-flipping-the-kernel

相关问题