Python中基于FFT的二维卷积与相关

2024-06-03 04:58:08 发布

您现在位置:Python中文网/ 问答频道 /正文

scipy(或另一个流行的库)中是否内置了基于FFT的二维互相关或卷积函数?

有如下功能:

  • scipy.signal.correlate2d-“由convolveND实现的直接方法 大数据处理速度慢”
  • scipy.ndimage.correlate-“使用 精确计算(即不是FFT)。”
  • scipy.fftpack.convolve.convolve,我不太明白,但似乎错了

numarray有一个^{} function with an ^{} switch,但我想numarray是折叠的 在numpy中,我找不到是否包含此函数。


Tags: 方法函数功能fftsignalscipy卷积内置
3条回答

看看scipy.signal.fftconvolve、signal.convalve和signal.correlate(有一个signal.correlate2d,但它似乎返回一个移位的数组,而不是居中)。

我发现了scipy.signal.fftconvolveas also pointed out by magnus,但当时并没有意识到它是n维的。因为它是内置的并且产生了正确的值,所以它看起来是理想的解决方案。

来自Example of 2D Convolution

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部分),有一些错误,比如this和修改输入([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]])

the latest revision通过内部使用两种大小的幂来加速(然后我通过using real FFT for real inputusing 5-smooth lengths instead of powers of 2:D来加速)。

我想你想要scipy.stsci包:

http://docs.scipy.org/doc/scipy/reference/stsci.html

In [30]: scipy.__version__
Out[30]: '0.7.0'

In [31]: from scipy.stsci.convolve import convolve2d, correlate2d

相关问题 更多 >