Registro de imagen usando python y correlación cruzada
Tengo dos imágenes que muestran exactamente el mismo contenido: manchas en forma de gaussian 2D. Llamo a estos dos archivos png de 16 bits "left.png" y "right.png". Pero a medida que se obtienen a través de una configuración óptica ligeramente diferente, los puntos correspondientes (físicamente iguales) aparecen en posiciones ligeramente diferentes. Lo que significa que la derecha está ligeramente estirada, distorsionada, más o menos, de forma no lineal. Por lo tanto, me gustaría obtener la transformación de izquierda a derecha.
Así que para cada píxel en el lado izquierdo con sus coordenadas X e Y, quiero una función que me dé los componentes del vector de desplazamiento que apunta al píxel correspondiente en el lado derecho.
En un enfoque anterior, intenté obtener las posiciones de los puntos correspondientes para obtener las distancias relativas deltaX y deltaY. Estas distancias luego las ajusté a la expansión taylor hasta el segundo orden de T (x, y) dándome las componentes x e y del vector de desplazamiento para cada píxel (x, y) a la izquierda, apuntando al píxel correspondiente (x ', y') a la derecha.
Para obtener un resultado más general, me gustaría utilizar la correlación cruzada normalizada. Para esto, multiplico cada valor de píxel desde la izquierda con un valor de píxel correspondiente desde la derecha y sumo estos productos. La transformación que estoy buscando debería conectar los píxeles que maximizarán la suma. Entonces, cuando la suma se maximiza, sé que multipliqué los píxeles correspondientes.
Realmente intenté mucho con esto, pero no lo logré. Mi pregunta es si alguien de ustedes tiene una idea o alguna vez ha hecho algo similar.
import numpy as np
import Image
left = np.array(Image.open('left.png'))
right = np.array(Image.open('right.png'))
# for normalization (http://en.wikipedia.org/wiki/Cross-correlation#Normalized_cross-correlation)
left = (left - left.mean()) / left.std()
right = (right - right.mean()) / right.std()
Por favor, avíseme si puedo aclarar esta pregunta. Todavía tengo que ver cómo publicar preguntas usando látex.
Muchas gracias por tu aporte.
[left.png]http: //i.stack.imgur.com/oSTER.pn [right.png]http: //i.stack.imgur.com/Njahj.pn
Me temo que, en la mayoría de los casos, las imágenes de 16 bits aparecen en negro (al menos en los sistemas que uso) :( pero, por supuesto, hay datos allí.
UPDATE 1Intento aclarar mi pregunta. Estoy buscando un campo vectorial con vectores de desplazamiento que punto de cada píxel en left.png al píxel correspondiente en right.png. Mi problema es que no estoy seguro de las restricciones que tengo.
$ \vec{r} + \vec{d}(\vec{r}) = \vec{r}\prime $
where vector r (componentes x e y) apunta a un píxel en left.png y vector r-prime (componentes x-prime e y-prime) apunta al píxel correspondiente en right.png. para cada r hay un vector de desplazamiento.
o que hice antes fue que encontré manualmente componentes del campo vectorial d y los ajusté a un polinomio de segundo grado:
$ \left(\begin{array}{c}x \\ y\end{array}\right) + \left(\begin{array}{c}\Delta x(x,y) \\ \Delta y(x,y)\end{array}\right)=\left(\begin{array}{c}x\prime \\ y\prime \end{array}\right) $
Así que me puse:
$ \Delta x(x,y) = K_0 + K_1\cdot x + K_2 \cdot y + K_3 \cdot x^2 + K_4 \cdot xy + K_5 \cdot y^2 $
$ \Delta y(x,y) = K_6 + K_7\cdot x + K_8 \cdot y + K_9 \cdot x^2 + K_{10} \cdot xy + K_{11} \cdot y^2 $
¿Tiene sentido esto para ti? ¿Es posible obtener todos los delta-x (x, y) y delta-y (x, y) con correlación cruzada? La correlación cruzada debe maximizarse si los píxeles correspondientes están unidos entre sí a través de los vectores de desplazamiento, ¿verdad?
UPDATE 2Así que el algoritmo en el que estaba pensando es el siguiente:
Deform right.png Obtenga el valor de la correlación cruzadaDeformar right.png más Obtenga el valor de la correlación cruzada y compárelo con el valor antes de Si es mayor, buena deformación, si no, rehaga la deformación y haga otra cosaDespués de maximizar el valor de correlación cruzada, sepa qué deformación hay:)Acerca de la deformación: ¿podría uno hacer primero un cambio a lo largo de las direcciones x e y para maximizar la correlación cruzada, luego en un segundo paso estirar o comprimir dependiente de x e y y en un tercer paso deformar cuadrático dependiente de x e y y repetir este procedimiento iterativ ?? Realmente tengo un problema para hacer esto con coordenadas enteras. ¿Crees que tendría que interpolar la imagen para obtener una distribución continua? Tengo que pensar en esto nuevamente :( Gracias a todos por participar:)