基于FFT的二维卷积和相关在Python(FFT-based 2D convolution and

2019-06-25 11:08发布

有没有内置SciPy的一个基于FFT的2D互相关或卷积函数(或其他流行库)?

有这样的功能:

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

numarray有correlate2d()与函数fft=True开关 ,但我想numarray折叠成numpy的,并且如果被包括在本功能我无法找到。

Answer 1:

我发现scipy.signal.fftconvolve , 作为还指出由Magnus ,但在它的n次的时候并没有意识到。 由于它的内置,并产生正确的价值观,这似乎是理想的解决方案。

从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的方法还需要编译,我是不成功的与(I只是注释掉非蟒份),有一些错误像这样和修改输入([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]])

和最新版本已经通过使用内部幂的两种尺寸的加速(然后我加速它更通过使用真实FFT即时输入和使用5-平滑长度,而不是2的幂 :d)。



Answer 2:

看scipy.signal.fftconvolve,signal.convolve和signal.correlate(有一个signal.correlate2d但它似乎返回一个偏移阵列,不居中)。



Answer 3:

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


Answer 4:

我已经记不清这个包在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/



Answer 5:

我写了一个交叉相关/卷积包装,需要照顾的填充和NaN的,具备有简洁流畅的包装这里 。 这不是一个流行的包,但它也有除了numpy的(或FFTW更快的FFT)没有依赖关系。

我还实施了FFT速度测试代码这里的情况下,任何人的兴趣。 它显示了 - 令人惊讶 - 这numpy的的FFT比SciPy的速度更快的,至少在我的机器上。

编辑:移动代码N维的版本在这里



文章来源: FFT-based 2D convolution and correlation in Python