Correlación de fase: ¿bajo rendimiento en imágenes ruidosas / borrosas?

9

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:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

Y la correlación de fase resultante (Magnitud, Real, Imaginario):

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

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:

  1. Calcule 1D FT de columnas de imagen de origen y destino ( a=FT(A), b=FT(B))
  2. Calcular espectro de potencia cruzada ( cross_power = a *. conj(b) / |a *. conj(b)|): *.denota una multiplicidad puntual, conj(x)denota conjugado complejo
  3. Calcular correlación de fase ( phase = IFT(cross_power))
  4. Encuentra la magnitud máxima en cada columna de phase.
  5. 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:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

El pico único está claramente allí, como debería ser:

ingrese la descripción de la imagen aquí

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:

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

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é?):

ingrese la descripción de la imagen aquí

Libor
fuente
Como veo, en la imagen de fase correlacionada, el pico máximo muestra el cambio correspondiente. Sin embargo, no sé cuáles son las amplitudes reales de la correlación cruzada entre esas imágenes.
Eddy_Em
@Eddy_Em Generaré imágenes separadas para la parte real e imaginaria y lo agregaré a la publicación en un momento. Hasta ahora solo hay información de magnitud.
Libor
Su referencia en Wikipedia dice que use transformadas 2D de Fourier. ¿Por qué estás usando transformaciones 1D?
Peter K.
1
Bueno, sí, pero necesitas comparar manzanas con manzanas. Simplemente comparando las mismas columnas en cada imagen no obtendrá lo que desea. Si el movimiento es lo suficientemente grande, no hay correlación alguna entre las columnas. Debe considerar la imagen como un todo. Una forma que podría funcionar es sumar las filas en ambas imágenes, y hacer el trabajo 1D en eso.
Peter K.
1
@PeterK. Esto era 2D: he comprobado que la correlación de fase salió como en el artículo de Wiki, solo volteada (probablemente debido a multiplicadores volteados al calcular el espectro de potencia cruzada o la entrada / salida volteada). Descubrí que el suavizado (ventana gaussiana) realmente perjudica el resultado final, pero no estoy seguro de por qué. Finalmente usaré la Correlación cruzada normalizada, ya que la Correlación de fase parece ser débil cuando se trata de datos de baja frecuencia.
Libor

Respuestas:

10

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:

I5 = rand(100,100)*255;
I6 = zeros(100,100);
I6(11:100,22:100) = I5(1:90,1:79);

Para que tengamos I5:

ingrese la descripción de la imagen aquí

y I6:

ingrese la descripción de la imagen aquí

Entonces la correlación de fase unidimensional es solo:

ingrese la descripción de la imagen aquí

mientras que la correlación de fase bidimensional es:

ingrese la descripción de la imagen aquí

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 diffoperació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úcleo k(X,y) entonces obtenemos:

huna=solunakhsi=solsik
dónde es convolución

Ahora,

Huna=KsolunaHsi=KsolsiR=HunaHsiEl |HunaHsiEl |=El |KEl |2solunasolsiEl |KEl |2El |solunasolsiEl |=solunasolsiEl |solunasolsiEl |

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:

K = one(5,5);

a mis imágenes aleatorias, luego obtengo:

ingrese la descripción de la imagen aquí

para la correlación bidimensional, que hace que el pico se extienda más, pero no exhibe los problemas que está viendo.

Peter K.
fuente
Gran respuesta, gracias! El problema que tengo es que el pico no solo está mal localizado, sino que aparece en una posición completamente incorrecta. Finalmente he leído JPLewis: "Correlación cruzada normalizada rápida" que dice que la correlación de fase tiene problemas con la energía de imagen variable en diferentes ubicaciones y, por lo tanto, se debe aplicar un prefiltrado: se propone un filtro laplaciano para el blanqueamiento de la señal, aunque cualquier filtro de paso alto haría. El problema sigue siendo que la frecuencia de corte es desconocida de antemano y un umbral demasiado alto o demasiado bajo dañará nuevamente la coincidencia. Pero lo intentaré.
Libor
1
Fuera del tema: Es curioso que la búsqueda en Google de "blanqueamiento de señal" le enseñe mucho sobre la pasta de dientes: D
Libor
2

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

usuario9026
fuente