Encontré scipy.signal.fftconvolve
, as also pointed out by magnus, pero no me di cuenta en el momento en que es n -dimensional. Dado que está integrado y produce los valores correctos, parece ser la solución ideal.
De Example of 2D Convolution:
correcta! La versión STSCI, por otro lado, requiere un trabajo adicional para hacer los límites correctos?
In [4]: stsci.convolve2d(a, b, fft = True)
Out[4]:
array([[-12., -12., -12.],
[-24., -24., -24.],
[-12., -12., -12.]])
(El método STSCI también requiere la compilación, que estaba sin éxito con (acabo comentada las partes no Python), tiene algunos errores como this y la modificación de las entradas ([1, 2] se convierte en [[ 1, 2]]), etc. Así que cambió mi respuesta aceptada a la correlación incorporada fftconvolve()
función)
, por supuesto, es lo mismo que la convolución, pero con una entrada Invertida:.
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]])
y the latest revision ha sido acelerado usando internamente el poder de los dos tamaños (y luego lo aceleré más por using real FFT for real input y using 5-smooth lengths instead of powers of 2: D).
nota que el uso de cálculo exacto (sin FFT) es exactamente lo mismo que decir que es lento :) Más exactamente, el método basado en FFT será mucho más rápido si usted tiene una señal y un kernel de aproximadamente el mismo tamaño (si el núcleo es mucho más pequeño que la entrada, entonces FFT en realidad puede ser más lento que el cálculo directo). –
Idealmente, el algoritmo de FFT se ocuparía automáticamente de las cosas sin relleno al tamaño correcto para obtener la mejor velocidad. – endolith
Oh, no estás hablando de cero relleno, estás hablando de hacer coincidir una imagen de 5x5 con una imagen de 2000x2000. ¿Por qué el algoritmo no puede adivinar si la FFT sería más eficiente y lo haría de la manera más rápida? – endolith