J'ai trouvé scipy.signal.fftconvolve
, as also pointed out by magnus, mais je n'avais pas réalisé à ce moment-là que c'est n -dimensional. Depuis qu'il est intégré et produit les bonnes valeurs, il semble que la solution idéale.
De Example of 2D Convolution:
Correct! D'autre part, la version STSCI nécessite un travail supplémentaire pour que les limites soient correctes?
In [4]: stsci.convolve2d(a, b, fft = True)
Out[4]:
array([[-12., -12., -12.],
[-24., -24., -24.],
[-12., -12., -12.]])
(La méthode STSCI exige également la compilation, que j'a échoué avec (je viens de parler les parties non-python), a quelques bugs comme this et modifier les entrées ([1, 2] devient [[ 1, 2]]), etc. Je suis donc changé ma réponse acceptée à la fftconvolve()
fonction intégrée)
corrélation, bien sûr, est la même chose que convolution, mais avec une entrée inversée.
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]])
et the latest revision a été accélérée en utilisant en interne des puissances de deux tailles (et puis j'ai accéléré plus par using real FFT for real input et using 5-smooth lengths instead of powers of 2: D).
Notez que l'utilisation calcul exact (pas FFT) est exactement la même chose que dire qu'il est lent :) Plus exactement, la méthode FFT sera beaucoup plus rapide si vous avez un signal et un noyau de taille approximativement égale (si le noyau est beaucoup plus petit que l'entrée, alors la FFT peut être plus lente que le calcul direct). –
Idéalement, l'algorithme FFT prend automatiquement en charge les opérations de remplissage à zéro pour obtenir la meilleure vitesse. – endolith
Oh, vous ne parlez pas de zéro rembourrage, vous parlez de faire correspondre une image 5x5 avec une image 2000x2000. Pourquoi l'algorithme ne peut-il pas deviner si la FFT serait plus efficace et le faire de la manière la plus rapide? – endolith