2009-07-08 11 views
20

Gibt es eine FFT-basierte 2D-Kreuzkorrelations- oder Faltungsfunktion in scipy (oder einer anderen populären Bibliothek)?FFT-basierte 2D-Faltung und -Korrelation in Python

Es gibt Funktionen wie diese:

  • scipy.signal.correlate2d - „die direkte durch convolveND implementiertes Verfahren für große Daten langsam sein“
  • scipy.ndimage.correlate - „Das Array mit den angegebenen Kernel genau korreliert Berechnung (dh nicht FFT). "
  • scipy.fftpack.convolve.convolve, die ich nicht wirklich verstehen, scheint aber falsch

numarray hatte eine correlate2d() function with an fft=True switch, aber ich denke, numarray in numpy gefaltet wurde, und ich kann nicht finden, wenn diese Funktion enthalten war.

+1

beachten Sie, dass genaue Berechnung unter Verwendung von (kein FFT) ist genau die gleiche wie sagen, es ist langsam :) Genauer gesagt, die FFT-basierte Methode wird viel schneller sein, wenn Sie haben ein Signal und einen Kernel von ungefähr der gleichen Größe (wenn der Kernel viel kleiner ist als die Eingabe, dann ist FFT möglicherweise langsamer als die direkte Berechnung). –

+0

Im Idealfall würde sich der FFT-Algorithmus automatisch um das Auffüllen von Objekten kümmern, um die beste Geschwindigkeit für die richtige Größe zu erreichen. – endolith

+1

Oh, du sprichst nicht über Null-Padding, du sprichst über ein 5x5-Bild mit einem 2000x2000 Bild. Warum kann der Algorithmus nicht einfach erraten, ob die FFT effizienter wäre und je nachdem, was schneller ist? – endolith

Antwort

17

Ich fand scipy.signal.fftconvolve, as also pointed out by magnus, aber nicht zu der Zeit, dass es n-dimensional ist. Da es eingebaut ist und die richtigen Werte produziert, scheint es die ideale Lösung zu sein.

Von Example of 2D Convolution:

Richtig! Die STSCI-Version erfordert andererseits einige zusätzliche Arbeit, um die Grenzen zu korrigieren?

In [4]: stsci.convolve2d(a, b, fft = True) 
Out[4]: 
array([[-12., -12., -12.], 
     [-24., -24., -24.], 
     [-12., -12., -12.]]) 

(STScI Verfahren Kompilieren auch erfordert, die ich mit (I nur auf Kommentar die nicht-Python Teile) nicht erfolgreich war, hat einige Fehler wie this und die Eingänge Modifizieren ([1, 2] wird auf [[ 1, 2]]) usw. Also änderte ich meine akzeptierte Antwort auf die eingebaute in fftconvolve() Funktion)

Korrelation, natürlich, die gleichen wie Faltung, aber mit einem Eingang umgekehrt.

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]]) 

und the latest revision wurde beschleunigt durch die Verwendung von Power-of-Two-Größen intern (und dann beschleunigte ich es mehr durch using real FFT for real input und using 5-smooth lengths instead of powers of 2: D).

4

Ich glaube, Sie das scipy.stsci Paket wollen:

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 
+0

Ich sah das auch, aber es tut nicht t scheint in SciPy nicht mehr enthalten zu sein? >>> import scipy.stsci.convolve Traceback (jüngste Aufforderung zuletzt): File "" Linie 1 in Import: Kein Modul namens convolve – endolith

+0

Hallo - klebte ich die Ausgabe von meinem Prompt oben. Was ist deine Version? – ars

+0

Offensichtlich stimmt etwas nicht: http://pastebin.com/mdd2bc6d Gut zu wissen, dass es existiert, obwohl. – endolith

2

ich den Überblick über den Status dieses Pakets in scipy verloren haben, aber ich weiß, wir ndimage als Teil des Includes stsci_python Release-Paket als Service für unsere Nutzer:

http://www.stsci.edu/resources/software_hardware/pyraf/stsci_python/current/download

oder Sie in der Lage zieht es aus dem Repositeurs sein sollten y, wenn Sie bevorzugen:

https://www.stsci.edu/svn/ssb/stsci_python/stsci_python/trunk/ndimage/

+0

Laut SciPy-Dokumentation ist es jedoch nicht FFT-basiert, wie ich in der Frage erwähnt habe. http://www.scipy.org/SciPyPackages/Ndimage – endolith

+1

Das Convolve-Paket ist auch im stsci_python-Repository verfügbar. Es enthält die Funktion correlate2d mit dem Schalter fft = True, den Sie ebenfalls erwähnt haben. https://www.stsci.edu/svn/ssb/stsci_python/stsci_python/trunk/convolve/lib/Convolve.py –

+0

Oh! Ich kann diese Python-Datei direkt importieren, wenn ich den Verweis auf _correlate lösche. Die FFT-Korrelation ist alles in Python. Jetzt habe ich es funktioniert. :) Vielen Dank! – endolith

6

Blick auf scipy.signal.fftconvolve, signal.convolve und signal.correlate (es gibt eine signal.correlate2d aber es scheint eine verschobene Array zurück, nicht zentriert).

+0

Ich habe meine akzeptierte Antwort geändert, wie unten erklärt http://stackoverflow.com/questions/1100100/fft-based-2d-convolution-and-correlation-in-python/1768140#1768140 – endolith

2

Ich schrieb eine Kreuzkorrelation/Faltung Wrapper, die sich um Padding & Nans kümmert und enthält eine einfache glatte Wrapper here. Es ist kein beliebtes Paket, aber es hat auch keine Abhängigkeiten neben numpy (oder fftw für schnellere ffts).

Ich habe auch einen FFT-Geschwindigkeitstest Code here implementiert, falls jemand interessiert ist. Es zeigt - überraschenderweise -, dass numpy's fft schneller ist als scipy, zumindest auf meiner Maschine.

EDIT: bewegte Code N-dimensionale Version here