Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中基于FFT的二维卷积和相关_Python_Image_Numpy_Signal Processing_Fft - Fatal编程技术网

Python中基于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(或其他流行的库)中是否内置了基于FFT的二维互相关或卷积函数

有如下功能:

  • scipy.signal.correlate2d
    -“由
    convolveND
    实现的直接方法将是 “大数据速度慢”
  • scipy.ndimage.correlate
    -“使用 精确计算(即非FFT)。”
  • scipy.fftpack.convolve.convolve
    ,我不太理解,但似乎错了
numarray有一个,但我猜numarray被折叠了
进入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]])