end*_*ith 21 python signal-processing numpy image fft
是否有基于FFT的2D互相关或卷积函数内置于scipy(或其他流行的库)?
有这样的功能:
scipy.signal.correlate2d
- "实施的直接方法convolveND
对于大数据来说会很慢"scipy.ndimage.correlate
- "使用精确计算(即不是FFT)将数组与给定内核相关联."scipy.fftpack.convolve.convolve
,我真的不明白,但似乎错了numarray有一个correlate2d()
带fft=True
开关的功能,但我猜numarray被折叠成numpy,我无法找到是否包含此功能.
end*_*ith 20
我发现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.]])
Run Code Online (Sandbox Code Playgroud)
正确!另一方面,STSCI版本需要一些额外的工作才能使边界正确?
In [4]: stsci.convolve2d(a, b, fft = True)
Out[4]:
array([[-12., -12., -12.],
[-24., -24., -24.],
[-12., -12., -12.]])
Run Code Online (Sandbox Code Playgroud)
(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]])
Run Code Online (Sandbox Code Playgroud)
并且通过在内部使用两个幂的大小来加速最新版本(然后我通过使用真实FFT进行实际输入并使用5个平滑长度而不是2 :D 的功率来加速它).
小智 6
看看scipy.signal.fftconvolve,signal.convolve和signal.correlate(有一个signal.correlate2d,但似乎返回一个移位的数组,没有居中).
我想你想要 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
Run Code Online (Sandbox Code Playgroud)