He probado con éxito el algoritmo de correlación de fase 1D para determinar el desplazamiento vertical entre dos imágenes sintéticas.
Sin embargo, cuando pasé a imágenes reales, no es capaz de detectar la traducción (el pico se encuentra en 0, lo que es un resultado incorrecto).
Tengo las siguientes imágenes:
Y la correlación de fase resultante (Magnitud, Real, Imaginario):
La primera línea de escaneo de la imagen es completamente blanca, pero el desplazamiento es obviamente mayor (20 píxeles).
El resultado esperado es una línea blanca en la fila 20 que ocurre solo en imágenes sintéticas o ruido de luz.
Mi algoritmo es muy simple: para cada columna de imagen:
- Calcule 1D FT de columnas de imagen de origen y destino (
a=FT(A)
,b=FT(B)
) - Calcular espectro de potencia cruzada (
cross_power = a *. conj(b) / |a *. conj(b)|
):*.
denota una multiplicidad puntual,conj(x)
denota conjugado complejo - Calcular correlación de fase (
phase = IFT(cross_power)
) - Encuentra la magnitud máxima en cada columna de
phase
. - Encuentre la ubicación máxima de consenso (por ejemplo, mediana de ubicaciones máximas detectadas)
¿Puede aconsejarme cómo mejorar el algoritmo de correlación de fase de línea de base para manejar imágenes del mundo real (ruidosas)?
¿Debería preferir usar NCC (Correlación cruzada normalizada) en lugar de la correlación de fase basada en FFT?
ACTUALIZAR
Estaba experimentando con relleno cero para descartar errores introducidos por el desplazamiento circular (solo es deseable un desplazamiento lineal simple de imágenes) y probé esto en imágenes originales de Wikipedia:
El pico único está claramente allí, como debería ser:
Sin embargo, si realizo un ligero suavizado (desenfoque gaussiano) para reducir el ruido y realmente mejorar el resultado, la correlación de fase sale totalmente destrozada:
Aquí está la versión mejorada: el pico original es más débil (¿por qué?) Y aparecieron nuevos picos alrededor de los cambios cero (¿por qué?):