Python中基于FFT的二维卷积和相关
scipy(或其他流行的库)中是否内置了基于FFT的二维互相关或卷积函数 有如下功能:Python中基于FFT的二维卷积和相关,python,image,numpy,signal-processing,fft,Python,Image,Numpy,Signal Processing,Fft,scipy(或其他流行的库)中是否内置了基于FFT的二维互相关或卷积函数 有如下功能: scipy.signal.correlate2d-“由convolveND实现的直接方法将是 “大数据速度慢” scipy.ndimage.correlate-“使用 精确计算(即非FFT)。” scipy.fftpack.convolve.convolve,我不太理解,但似乎错了 numarray有一个,但我猜numarray被折叠了 进入numpy,我找不到是否包含此函数。我想您需要scipy.sts
-“由scipy.signal.correlate2d
实现的直接方法将是 “大数据速度慢”convolveND
-“使用 精确计算(即非FFT)。”scipy.ndimage.correlate
,我不太理解,但似乎错了scipy.fftpack.convolve.convolve
进入numpy,我找不到是否包含此函数。我想您需要scipy.stsci包:
我已经不知道这个包在scipy中的状态,但我知道为了方便用户,我们将ndimage作为stsci_python发行包的一部分: 或者,如果愿意,您应该能够从存储库中提取它:
看看scipy.signal.fftconvolve、signal.convolve和signal.correlate(有一个signal.correlate2d,但它似乎返回一个移位数组,没有居中)。我找到了
scipy.signal.fftconvolve
,但当时没有意识到它是n维的。因为它是内置的,并且产生正确的值,所以它似乎是理想的解决方案
发件人:
对!另一方面,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]])
通过在内部使用两种大小的幂来加速(然后我通过and:D来加速)。我编写了一个互相关/卷积包装器,负责填充和nans,包括一个简单的平滑包装器。它不是一个流行的软件包,但它除了numpy(或fftw,用于更快的fft)之外,没有任何依赖项 我还实现了FFT速度测试代码,以防有人感兴趣。令人惊讶的是,它显示出numpy的fft比scipy的快,至少在我的机器上是这样
编辑:将代码移动到N维版本注意,从Scipy 1.4开始就有了,它使用了。我也看到了,但它似乎不再包含在Scipy中了?>>import scipy.stsci.convalve Traceback(上次调用):文件“”,第1行,在ImportError中:没有名为convalvehi的模块-我粘贴了上面提示的输出。你的说法是什么?显然有些地方错了:很高兴知道它的存在。从ipython提示符中,我看到您正在使用python 2.6。我有python 2.5.2。我不知道为什么scipy每个版本都有不同的版本。也许重新安装scipy会更容易,看看问题是否仍然存在?它在我的Windows 2.6机器上工作,但在其他Ubuntu机器上不工作,所以它一定是Ubuntu的打包问题。请注意,使用精确计算(无FFT)与说它慢完全相同:)更确切地说,如果信号和内核大小大致相同,基于FFT的方法将快得多(如果内核比输入小得多,则FFT可能实际上比直接计算慢)。理想情况下,FFT算法会自动将零填充处理到合适的大小以获得最佳速度。哦,你不是说零填充,你是说将5x5图像与2000x2000图像匹配。为什么算法不能猜测FFT是否会更有效,并以更快的方式进行呢?根据scipy文档,scipy有一个fftconvolve函数,但正如我在问题中提到的,它不是基于FFT的。卷积包也可以从stsci_python存储库中获得。它包括correlate2d函数,该函数具有您还提到的fft=True开关。哦如果删除对_correlate的引用,我可以直接导入python文件。FFT相关性都是用Python编写的。现在我已经让它工作了。:)谢谢事实证明,stsci正在从SciPy中删除(这就是它不起作用的原因),并且stsci_python版本现在是权威版本,因此我将此作为公认的答案。此外,一维卷积/相关没有FFT加速(如下文所述,我更改了我接受的答案,这只是一个无关的查询。correlate2d对2048x2048形状的二维阵列运行需要多长时间?
In [4]: stsci.convolve2d(a, b, fft = True)
Out[4]:
array([[-12., -12., -12.],
[-24., -24., -24.],
[-12., -12., -12.]])
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]])