¿Cómo se puede determinar el ángulo de rotación mediante la correlación de fase (usando fft) de 2 imágenes? El algoritmo dado en http://en.wikipedia.org/wiki/Phase_correlation devuelve un desplazamiento lineal, no angular. También menciona que las imágenes deben convertirse a coordenadas log-polar para calcular la rotación. ¿Cómo se logra esta conversión en python? Y la conversión posterior ¿realiza los mismos pasos del mantenimiento del algoritmo?Correlación de fase
Respuesta
Entrar transformación polar es en realidad la rotación y la escala invariante .. rotación corresponde al cambio en el eje Y y la escala corresponde al cambio en el eje x en el registro de transformación polar
pasos tan simples son los siguientes para encontrar una x en la imagen imagen y:
Find imagen x en la imagen y (correlación fase de uso en coordenadas cartesianas)
Compute log transformadas polares de tanto x como y (esto es un otro problema conjunto, véase la referencia s abajo), asegúrese de centrarse en la misma característica en ambas imágenes.
Find FFT de x e y, dicen F (X) y F (y) correlación de fase
Find de F (x) y F (y), llaman R
Encuentra el IFFT (FFT inverso) de R. El valor máximo de R corresponde a la desviación de rotación en el eje Y y a la desviación de escala en el eje X desde la imagen original.
Referencias:
he estado trabajando en el mismo problema por un tiempo. Tomé el fin de semana para escribir esto. No es el código más limpio que existe, pero solo soy un físico, no un programador ...
La correlación de fase en sí es simple: use su algoritmo de convolución favorito para unir dos imágenes. La posición de pico le proporciona la diferencia de rotación/escala. Está bien explicado en Wikipedia (en el enlace mencionado en la pregunta).
Mi problema era que no pude encontrar un buen convertidor logarítmico, así que escribí uno. No es a prueba de tontos, pero hace el trabajo bien. ¡Cualquiera que esté dispuesto a reescribirlo para hacerlo más claro, por favor hágalo!
import scipy as sp
from scipy import ndimage
from math import *
def logpolar(input,silent=False):
# This takes a numpy array and returns it in Log-Polar coordinates.
if not silent: print("Creating log-polar coordinates...")
# Create a cartesian array which will be used to compute log-polar coordinates.
coordinates = sp.mgrid[0:max(input.shape)*2,0:360]
# Compute a normalized logarithmic gradient
log_r = 10**(coordinates[0,:]/(input.shape[0]*2.)*log10(input.shape[1]))
# Create a linear gradient going from 0 to 2*Pi
angle = 2.*pi*(coordinates[1,:]/360.)
# Using scipy's map_coordinates(), we map the input array on the log-polar
# coordinate. Do not forget to center the coordinates!
if not silent: print("Interpolation...")
lpinput = ndimage.interpolation.map_coordinates(input,
(log_r*sp.cos(angle)+input.shape[0]/2.,
log_r*sp.sin(angle)+input.shape[1]/2.),
order=3,mode='constant')
# Returning log-normal...
return lpinput
Advertencia: Este código está diseñado para imágenes en escala de grises. Puede ser fácilmente un adaptador para trabajar en imágenes en color haciendo un bucle en la línea con map_coordinates()
en cada marco de color separado.
EDITAR: Ahora, el código para hacer la correlación es simple. Después de su script ha importado tanto imágenes como image
y target
, haga lo siguiente:
# Conversion to log-polar coordinates
lpimage = logpolar(image)
lptarget = logpolar(target)
# Correlation through FFTs
Fcorr = np.fft.fft2(lpimage)*np.conj(np.fft.fft2(lptarget))
correlation = np.fft.ifft2(Fcorr)
La matriz correlation
debe contener un pico que las coordenadas son la diferencia de tamaño y la diferencia de ángulo.Además, en lugar de utilizar FFT, simplemente puede utilizar la función de np.correlate()
numpy:
# Conversion to log-polar coordinates
lpimage = logpolar(image)
lptarget = logpolar(target)
# Correlation
correlation = np.correlate(lpimage,lptarget)
Aquí es una implementación: http://www.lfd.uci.edu/~gohlke/code/imreg.py.html. Descubrí que demoran 0.035 segundos en encontrar la similitud entre dos imágenes de 128x128.
- 1. Correlación de valores varchar
- 2. Correlación anidada de Automapper
- 3. ¿Correlación ponderada de Pearson?
- 4. Algoritmo lunar/fase lunar
- 5. Correlación de Spearman y vínculos
- 6. Agrupación de correlación en R
- 7. correlación de servlet con muelle
- 8. Encontrando la matriz de correlación
- 9. PVR texturetool fase de acumulación
- 10. ¿Correlación entre especificador y calificador?
- 11. Creación de una ID de correlación JMS
- 12. Correlación de RestKit con Rails 3.1
- 13. matriz de correlación para construir redes
- 14. ¿Qué significa realmente el coeficiente de correlación
- 15. Crear un gráfico de correlación en Matlab
- 16. Mostrar tablas de correlación como lista descendente
- 17. correlación de Spearman por grupo en R
- 18. Conceptos básicos de la correlación cruzada normalizada
- 19. MySql - Envío lenta fase de datos
- 20. Ejecutando una fase específica de Maven
- 21. Cambio de fase binario Keying en Python
- 22. correlación en Matlab entre dos matrices
- 23. R correlación entre 2 dataframes por fila
- 24. ¿Cómo calcular la correlación entre las preferencias?
- 25. valores de correlación en una cuadrícula de facetas de ggplot2
- 26. Comprensión de los encabezados de copia de Xcode fase
- 27. Xcode objetivo de secuencias de comandos de Python Fase
- 28. Cálculo de la correlación de texto sensible al contexto
- 29. Correlación de resultados del procedimiento almacenado de Entity Framework
- 30. Bibliotecas de correlación de imágenes digitales para mac
puede publicar el código fuente completo (no solo logpolar)? – mrgloom
Perdón por la respuesta tardía, estuve afk por un tiempo ... Estoy editando mi respuesta ahora mismo. – PhilMacKay
Hola Phil, intenté ejecutar tu función, pero recibo un error de tiempo de ejecución. ¿Te importa ayudarme? http://stackoverflow.com/questions/16654083/ –