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).
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). –
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
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