簡體   English   中英

Python中基於FFT的二維卷積和相關

[英]FFT-based 2D convolution and correlation in Python

scipy(或其他流行的庫)中是否內置了基於 FFT 的 2D 互相關或卷積函數?

有這樣的功能:

  • scipy.signal.correlate2d - “通過實施直接法convolveND將是大數據慢”
  • scipy.ndimage.correlate - “使用精確計算(即不是 FFT)將數組與給定的內核相關聯。”
  • scipy.fftpack.convolve.convolve ,我不太明白,但似乎是錯誤的

numarray 有一個帶有fft=True開關correlate2d()函數,但我猜 numarray 被折疊到 numpy 中,我無法找到是否包含此函數。

我發現了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方法也需要編譯,我沒有成功(我只是注釋掉了非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]])

並且最新版本已經通過在內部使用二的冪來加速(然后我通過對真實輸入使用真正的 FFT使用 5 平滑長度而不是 2 的冪來加速它:D)。

看看 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

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

我寫了一個互相關/卷積包裝器,它負責填充和 nans,並在此處包含一個簡單的平滑包裝器。 它不是一個流行的包,但它除了 numpy(或 fftw 用於更快的 ffts)之外也沒有任何依賴項。

我還實施了FFT速度測試代碼這里的情況下,任何人的興趣。 它顯示 - 令人驚訝的是 - 至少在我的機器上,numpy 的 fft 比 scipy 的快。

編輯: 在此處將代碼移至 N 維版本

請注意,從 Scipy 1.4 開始就有scipy.signal.oaconvolve ,它使用Overlap-add 方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM