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

时间:2009-07-08 19:32:20

标签: python image numpy signal-processing fft

是否有基于FFT的2D互相关或卷积函数内置到scipy(或其他流行的库)中?

有以下功能:

  • scipy.signal.correlate2d - “convolveND实施的直接方法将是 大数据慢“
  • scipy.ndimage.correlate - “数组与给定的内核使用相关 精确计算(即不是FFT)。“
  • scipy.fftpack.convolve.convolve,我真的不明白,但似乎错了

numarray有correlate2d() function with an fft=True switch,但我猜numarray被折叠了 进入numpy,我无法找到是否包含此功能。

6 个答案:

答案 0 :(得分:19)

我找到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)。

答案 1 :(得分:6)

查看scipy.signal.fftconvolve,signal.convolve和signal.correlate(有一个signal.correlate2d,但似乎返回一个移位的数组,没有居中)。

答案 2 :(得分:4)

我想你想要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

答案 3 :(得分:2)

我已经在scipy中忘记了这个包的状态,但是我知道我们将ndimage包含在stsci_python发布包中,以方便我们的用户:

http://www.stsci.edu/resources/software_hardware/pyraf/stsci_python/current/download

或者如果您愿意,您应该可以从存储库中提取它:

https://www.stsci.edu/svn/ssb/stsci_python/stsci_python/trunk/ndimage/

答案 4 :(得分:2)

我写了一个互相关/卷积包装器来处理填充和放大器。 nans并包含一个简单的光滑包装here。它不是一个受欢迎的软件包,但除了numpy之外它也没有依赖性(或fftw用于更快的ffts)。

我还实施了一个FFT速度测试代码here,以防任何人感兴趣。它令人惊讶地表明,numpy的fft比scipy更快,至少在我的机器上。

编辑:将代码移至N维版本here

答案 5 :(得分:1)

请注意,自Scipy 1.4起使用scipy.signal.oaconvolveOverlap-add method