Registro de imagen invariable a escala basado en DFT Log-Polar

10

Estoy tratando de hacer el registro de imágenes usando la correlación de fase como se describe en el documento de Reddy Chatterji . En mi caso, las imágenes pueden ser escaladas y traducidas entre sí.

El algoritmo para encontrar la escala relativa, según tengo entendido, es (ver: el diagrama de flujo del documento ):

F1 = DFT(I1)
F2 = DFT(I2)
H1 = Highpass(F1)
H2 = Highpass(F2)
L1 = LogPolar(Magnitude(H1))
L2 = LogPolar(Magnitude(H2))
PC = PhaseCorrelate(L1,L2)
PM = norm(PC)
R = IDFT(PhaseCorr/PM)
P = Peak(R)
Scale = LogBase^P[1]

La escala me da valores aparentemente sin sentido (muy diferentes de una imagen a otra y nunca correctos).

Pero ignorando la escala, el mismo enfoque de correlación de fase funciona bien para la traducción; y entonces sospecho que tengo un problema con mi transformación log-polar. Aquí hay un ejemplo, donde resolví la traducción: la imagen de la izquierda es la original y la derecha se ha recortado y traducido, la solución se muestra en la parte superior del original:

La traducción solo funciona

Para el log-polar transformar, I primera transformo en el espacio dondeIes la imagen original,res el radio de la imagen (medio ancho) yNθes el número de muestras en ladirecciónθ. I a continuación muestra a partir de esta transformar en espacio de registro polar:Ilog(ρ,θ)=I(logb(ρ),θ) , dondeb=(2r)-Nρcomo se describe en

yo^(ρ,θ)=yo(r+ρcos(2πθnorteθ),r-ρpecado(2πθnorteθ))
yornorteθθ
yo^losol(ρ,θ)=yo^(Iniciar sesiónsi(ρ),θ)
si=(2r)-norteρ1 para que abarque todo el espacio polar.

ρ=θ=256

Log Polar

Por último, esto muestra la transformación real por la que pasan las imágenes antes del paso de correlación de fase (la parte superior es el filtro de paso alto de magnitud DFT, la parte inferior es la del espacio polar logarítmico):

Log Polar de DFT

Estoy usando OpenCV, que tiene los métodos LogPolar y PhaseCorrelate. Mientras que PhaseCorrelate, como mi implementación manual, me da la respuesta correcta para la traducción, es incorrecta en escala. Dado que el uso de OpenCV LogPolar o el mío no afecta la corrección, me falta algo.

Cualquier ayuda sería apreciada.

Drew Cummins
fuente
1
¿Te diste cuenta de lo que estaba mal?
Mr.WorshipMe
1
@ Mr.WorshipMe Lamentablemente no.
Drew Cummins el
@Drew Cummins, supongo que se debió a la imagen de prueba que usaste, porque hubo una transición nítida desde el fondo. ¿Qué tal otras imágenes de prueba? Además, a partir de la última figura, hubo diferencias aparentes entre las dos magnitudes, por lo que es mejor realizar un preprocesamiento de ventanas adecuado antes del DFT.
lxg
Un par de días antes encontré ese documento y he estado tratando de implementar el algoritmo sin éxito. Me preguntaba si podrías compartir tu implementación con un principiante :)
Alexis España

Respuestas:

1

Si desea algo realmente robusto, pero que puede ser más costoso desde el punto de vista computacional, puede consultar el algoritmo que implementé aquí . Implementa el documento, "Registro robusto de imágenes usando la transformación Log-Polar" ( pdf ). También tiene la ventaja de ser invariante en rotación, además de invariante de traducción y escala. En mi aplicación (arte), fue capaz de registrar incluso imágenes de aspecto similar, no solo versiones transformadas de la misma imagen.

usuario2348114
fuente
0

Supongo que se debe a problemas de implementación específicos. Por ejemplo, (1) es mejor realizar el preprocesamiento de ventanas antes del DFT; (2) puede verificar la función Highpass (), y puede consultar la que se encuentra en la ecuación de papel de Reddy Chatterji (23) - (24). Además, hay un límite para el valor de escala, y puede probar otros valores de escala.

lxg
fuente