您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

Python中基于FFT的2D卷积和相关

Python中基于FFT的2D卷积和相关

我发现scipy.signal.fftconvolve,因为还马格努斯指出,但它的时候并没有意识到ñ 维。由于它是内置的并且可以产生正确的值,因此它似乎是理想的解决方案。 查看scipy.signal.fftconvolve,signal.convolve和signal.correlate(有一个signal.correlate2d,但它似乎返回一个移位的数组,而不是居中)。

2D卷积示例中

In [1]: a = asarray([[ 1, 2, 3],
   ...:              [ 4, 5, 6],
   ...:              [ 7, 8, 9]])

In [2]: b = asarray([[-1,-2,-1],
   ...:              [ 0, 0, 0],
   ...:              [ 1, 2, 1]])

In [3]: scipy.signal.fftconvolve(a, b, mode = 'same')
Out[3]: 
array([[-13., -20., -17.],
       [-18., -24., -18.],
       [ 13.,  20.,  17.]])

正确!另一方面,STSCI版本需要做一些额外的工作才能使边界正确吗?

In [4]: stsci.convolve2d(a, b, fft = True)
Out[4]: 
array([[-12., -12., -12.],
       [-24., -24., -24.],
       [-12., -12., -12.]])

(STSCI方法还需要编译,但我不成功(我刚刚注释掉了非python部分),有一些类似这样的错误修改了输入([1,2]变成[[1,2]]),等等。因此,我更改了对内置fftconvolve()函数的接受答案。)

当然,相关与卷积是一样的,但是其中的一个输入相反:

In [5]: a
Out[5]: 
array([[3, 0, 0],
       [2, 0, 0],
       [1, 0, 0]])

In [6]: b
Out[6]: 
array([[3, 2, 1],
       [0, 0, 0],
       [0, 0, 0]])

In [7]: scipy.signal.fftconvolve(a, b[::-1, ::-1])
Out[7]: 
array([[ 0., -0.,  0.,  0.,  0.],
       [ 0., -0.,  0.,  0.,  0.],
       [ 3.,  6.,  9.,  0.,  0.],
       [ 2.,  4.,  6.,  0.,  0.],
       [ 1.,  2.,  3.,  0.,  0.]])

In [8]: scipy.signal.correlate2d(a, b)
Out[8]: 
array([[0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0],
       [3, 6, 9, 0, 0],
       [2, 4, 6, 0, 0],
       [1, 2, 3, 0, 0]])

并且内部使用了2的幂次方加速了最新的修订版(然后我通过使用实数FFT作为实数输入使用5平滑长度而不是2 :D的幂来加快了它的更新速度)。

python 2022/1/1 18:50:42 有397人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶