24

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

有这样的功能:

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

numarray 有一个带switch的correlate2d()函数fft=True,但我猜 numarray 被折叠成 numpy,我找不到这个函数是否包含在内。

4

6 回答 6

24

正如 magnus 所指出的那样,我发现了scipy.signal.fftconvolve,但当时并没有意识到它是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 方法还需要编译,我没有成功(我只是注释掉了非 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-smooth 长度而不是 2 的幂来加速它 :D )。

于 2009-11-20T03:22:54.417 回答
8

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

于 2009-09-25T13:22:24.360 回答
5

我想你想要 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
于 2009-07-08T20:07:59.520 回答
3

我在 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/

于 2009-07-09T03:53:20.650 回答
3

我编写了一个互相关/卷积包装器,它负责填充和 nans,并在此处包含一个简单的平滑包装器。它不是一个流行的包,但除了 numpy(或 fftw 用于更快的 ffts)之外,它也没有依赖项。

如果有人感兴趣,我还在这里实现了 FFT 速度测试代码。它显示 - 令人惊讶的是 - numpy 的 fft 比 scipy 的快,至少在我的机器上是这样。

编辑:在此处将代码移至 N 维版本

于 2011-12-10T02:45:41.773 回答
2

请注意,自 Scipy 1.4 以来就有scipy.signal.oaconvolve,它使用Overlap-add 方法

于 2019-12-01T20:32:03.520 回答