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).
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). –
Idealnie algorytm FFT automatycznie zadba o rzeczy o zerowym wypełnieniu do odpowiedniego rozmiaru, aby uzyskać najlepszą prędkość. – endolith
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