2009-07-08 12 views
20

Czy istnieje funkcja korelacji krzyżowej 2D lub funkcji splotu opartej na FFT w scipy (lub innej popularnej bibliotece)?Frekwencja i korelacja 2D oparte na FFT w Pythonie

Są to funkcje, takie jak:

  • scipy.signal.correlate2d - „bezpośredni sposób realizowane przez convolveND będzie powolne dla dużych danych”
  • scipy.ndimage.correlate - „Tablica jest skorelowane ze dana jądro używając dokładny obliczenie (tj. nie FFT). "
  • scipy.fftpack.convolve.convolve, który tak naprawdę nie zrozumieć, ale wydaje się błędne

numarray miał correlate2d() function with an fft=True switch, ale myślę numarray została złożona w numpy, i nie mogę znaleźć, jeśli funkcja ta została włączona.

+1

uwagę, że przy użyciu dokładnego obliczenia (nie FFT) jest dokładnie taka sama, jak mówią, że jest wolny :) Dokładniej, metoda FFT oparte będzie o wiele szybciej, jeśli masz sygnał i jądro o mniej więcej tym samym rozmiarze (jeśli jądro jest dużo mniejsze niż wejście, FFT może być wolniejsze niż bezpośrednie obliczenie). –

+0

Idealnie algorytm FFT automatycznie zadba o rzeczy o zerowym wypełnieniu do odpowiedniego rozmiaru, aby uzyskać najlepszą prędkość. – endolith

+1

Och, nie mówisz o zerowym wypełnieniu, mówisz o dopasowaniu obrazu 5x5 z obrazem 2000 x 2000. Dlaczego algorytm nie może po prostu zgadnąć, czy FFT byłby skuteczniejszy i czy działa szybciej? – endolith

Odpowiedz

17

znalazłem scipy.signal.fftconvolve, as also pointed out by magnus, ale nie zdawali sobie sprawy, że w tym czasie jest to n wymiarowa. Ponieważ jest wbudowany i wytwarza właściwe wartości, wydaje się idealnym rozwiązaniem.

Od Example of 2D Convolution:

Prawidłowe! Z drugiej strony, wersja STSCI wymaga dodatkowej pracy, aby granice były prawidłowe?

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

(Metoda STScI wymaga zestawiania, które nie powiodła się (właśnie wykomentowane części nie Pythona) ma pewne błędy jak this i modyfikacji wejścia ([1, 2] staje [[ 1, 2]]), itd. Więc zmieniłem zaakceptowane odpowiedź na wbudowanym fftconvolve() funkcji)

korelacja, oczywiście, jest to samo, co splotu, ale z jednym wejściem odwrócone.

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

i the latest revision zostało spieszone do góry, używając wewnętrznie mocy dwóch rozmiarów (a następnie przyspieszyłem o więcej: using real FFT for real input i using 5-smooth lengths instead of powers of 2: D).

4

myślę chcesz pakiet 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 
+0

Widziałem to także, ale nie robi tego ". Wydaje się, że są już zawarte w SciPy? >>> import scipy.stsci.convolve Traceback (najnowsza wezwanie ostatni): Plik "", wiersz 1, w ImportError: No module o nazwie convolve – endolith

+0

Hi - I wklejony wyjście z moim wierszu powyżej. Jaka jest twoja wersja? – ars

+0

Najwyraźniej coś jest nie tak: http://pastebin.com/mdd2bc6d Dobrze wiedzieć, że istnieje. – endolith

2

zgubiłem ścieżkę statusu tego pakietu w scipy, ale wiem, że to ndimage jako część stsci_python pakiet uwolnienie jako udogodnienie dla naszych użytkowników:

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

lub powinno być w stanie wyciągnąć go z repositor y jeśli wolisz:

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

+0

Według dokumentów SciPy to nie jest oparte na FFT, jak wspomniałem w pytaniu. http://www.scipy.org/SciPyPackages/Ndimage – endolith

+1

Pakiet convolve jest również dostępny z repozytorium stsci_python. Zawiera on funkcję correlate2d, która ma wspomniany przełącznik fft = True. https://www.stsci.edu/svn/ssb/stsci_python/stsci_python/trunk/convolve/lib/Convolve.py –

+0

Oh! Mogę po prostu zaimportować ten plik Pythona bezpośrednio, jeśli usunę odwołanie do _correlate. Korelacja FFT jest w całości w Pythonie. Teraz mam to działa. :) Dzięki! – endolith

6

obejrzenia scipy.signal.fftconvolve, signal.convolve i signal.correlate (jest signal.correlate2d ale wydaje się zwrócenie przesunięty tablicę, nie wyśrodkowany).

+0

Zmieniłem moją zaakceptowaną odpowiedź na to, jak wyjaśniono poniżej http://stackoverflow.com/questions/1100100/fft-based-2d-convolution-and-correlation-in-python/1768140#1768140 – endolith

2

Napisałem opakowanie korelacji krzyżowej/splotu, które zajmuje się wyściółką & nans i zawiera proste gładkie opakowanie here. Nie jest to popularny pakiet, ale nie ma również zależności od numpy (lub fftw dla szybszych ffts).

Wprowadziłem również kod testowania prędkości FFT here na wypadek, gdyby ktoś był zainteresowany. Pokazuje - zaskakująco - że funt numpy jest szybszy niż scipy, przynajmniej na mojej maszynie.

EDIT: przeniesiony kod do N-wymiarowej wersji here