gpt4 book ai didi

python - scipy.ndimage.filters.convolve 和乘法傅里叶变换给出不同的结果

转载 作者:太空狗 更新时间:2023-10-30 02:19:35 36 4
gpt4 key购买 nike

这是我的代码:

from scipy.ndimage import filters
import numpy

a = numpy.array([[2,43,42,123,461],[453,12,111,123,55] ,[123,112,233,12,255]])
b = numpy.array([[0,2,2,3,0],[0,15,12,100,0],[0,45,32,22,0]])

ab = filters.convolve(a,b, mode='constant', cval=0)

af = numpy.fft.fftn(a)
bf = numpy.fft.fftn(b)

abf = af*bf

abif = numpy.fft.ifftn(abf)

print numpy.around(ab)
print numpy.around(abif)

结果是:

[[ 1599  2951  7153 13280 18311]
[ 8085 51478 13028 40239 30964]
[18192 32484 23527 36122 8726]]

[[ 37416.+0.j 32251.+0.j 46375.+0.j 32660.+0.j 23986.+0.j]
[ 30265.+0.j 33206.+0.j 62450.+0.j 19726.+0.j 17613.+0.j]
[ 40239.+0.j 38095.+0.j 24492.+0.j 51478.+0.j 13028.+0.j]]

如何修正我使用 FFT 进行卷积的方式,以保证它给出与 scipy.ndimage.filters.convolve 相同的结果?

谢谢。

最佳答案

事实证明这是一个有趣的问题。似乎使用离散傅立叶变换的卷积(由 numpy.fft.fftn 实现)相当于 circular convolution .所以我们需要做的就是使用 'wrap' 卷积模式,并适本地设置原点:

>>> filters.convolve(a, b, mode='wrap', origin=(-1, -2))
array([[37416, 32251, 46375, 32660, 23986],
[30265, 33206, 62450, 19726, 17613],
[40239, 38095, 24492, 51478, 13028]])
>>> numpy.fft.ifftn(numpy.fft.fftn(a) * numpy.fft.fftn(b))
array([[ 37416.+0.j, 32251.+0.j, 46375.+0.j, 32660.+0.j, 23986.+0.j],
[ 30265.+0.j, 33206.+0.j, 62450.+0.j, 19726.+0.j, 17613.+0.j],
[ 40239.+0.j, 38095.+0.j, 24492.+0.j, 51478.+0.j, 13028.+0.j]])
>>> (filters.convolve(a, b, mode='wrap', origin=(-1, -2)) ==
... numpy.around(numpy.fft.ifftn(numpy.fft.fftn(a) * numpy.fft.fftn(b))))
array([[ True, True, True, True, True],
[ True, True, True, True, True],
[ True, True, True, True, True]], dtype=bool)

区别仅与 filters.convolve 处理边缘的方式有关。一种使用 fftn 在其他模式下执行卷积的方法并没有立即打动我;有关解决该问题的聪明(事后诸葛亮)方法,请参阅 Warren Weckesser的出色回答。

关于python - scipy.ndimage.filters.convolve 和乘法傅里叶变换给出不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28468307/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com