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é?):
Respuestas:
Versión unidimensional
La versión unidimensional que enumeres no funcionará. Cuando hay un cambio lo suficientemente grande en las imágenes (más de uno o dos píxeles en las imágenes del mundo real), no habrá nada relacionado con los píxeles de la columna.
Para un ejemplo de esto, intente:
Para que tengamos I5:
y I6:
Entonces la correlación de fase unidimensional es solo:
mientras que la correlación de fase bidimensional es:
Es un poco difícil de ver, pero hay un pico muy alto en la esquina inferior derecha de la imagen. No existe un pico claro en la versión unidimensional.
¿Por qué no ayuda el alisado? # 1
Lo que intenta hacer la correlación es encontrar variaciones "similares" en cada imagen. Si las señales subyacentes son lo suficientemente aleatorias, esto funcionará bien: la correlación del ruido blanco consigo mismo proporciona un pico realmente agradable en el origen, y cercano a cero en otros lugares.
Alisar una imagen "aleatoria" con un gaussiano tendrá el efecto de suavizar la correlación que espera, extendiendo la energía en cualquier pico en un área más amplia.
El suavizado tiene el efecto opuesto de "pre-blanqueamiento" de la imagen. El blanqueamiento previo (como su nombre lo indica) trata de hacer que la imagen se parezca más al ruido blanco, que tiene la mejor forma si estamos haciendo una detección basada en correlación (ya que el pico está bien localizado).
Lo que es mejor que haga es usar la
diff
operación matlab para una forma simplista, pero sorprendentemente efectiva, de blanquear previamente las imágenes.Ver este ejemplo.
¿Por qué no ayuda el alisado? # 2
¿Por qué el suavizado causa los picos adicionales?
Si suaviza cada imagen con un núcleok ( x , y) entonces obtenemos:
Ahora,
Lo que sospecho que está sucediendo (aunque no estoy seguro) es que tal vez su kernel tenga valores cercanos a cero en el dominio de la frecuencia, causando problemas numéricos.
Si aplico un núcleo:
a mis imágenes aleatorias, luego obtengo:
para la correlación bidimensional, que hace que el pico se extienda más, pero no exhibe los problemas que está viendo.
fuente
La forma más fácil de obtener un buen rendimiento de la correlación de fase al blanquear la señal es tomar el registro de la magnitud. También puede filtrar el ruido de la superficie de correlación resultante. Para obtener más información, consulte "Mejora de la correlación de fases para el registro de imágenes", Actas de (ICVNZ2011) Image and Vision Computing New Zealand 2011, p.488-493,, http://www98.griffith.edu.au/dspace/bitstream/handle/ 10072/44512 / 74188_1.pdf? Secuencia = 1
fuente