Registro de imagem usando python e correlação cruzada

Eu tenho duas imagens mostrando exatamente o mesmo conteúdo: manchas em forma de gaussiana 2D. Eu chamo esses dois arquivos png de 16 bits "left.png" e "right.png". Porém, à medida que são obtidos por meio de uma configuração óptica ligeiramente diferente, os pontos correspondentes (fisicamente iguais) aparecem em posições ligeiramente diferentes. Significando que a direita está levemente esticada, distorcida ou de maneira não linear. Portanto, eu gostaria de obter a transformação da esquerda para a direit

Então, para cada pixel do lado esquerdo com suas coordenadas x e y, eu quero uma função que me dê os componentes do vetor de deslocamento que aponta para o pixel correspondente no lado direit

Numa abordagem anterior, tentei obter as posições dos pontos correspondentes para obter as distâncias relativas deltaX e deltaY. Essas distâncias foram ajustadas à expansão de taylor até a segunda ordem de T (x, y), fornecendo-me os componentes xey do vetor de deslocamento de cada pixel (x, y) à esquerda, apontando para o pixel correspondente (x ', y') à direita.

Para obter um resultado mais geral, eu gostaria de usar a correlação cruzada normalizada. Para isso, multiplico cada valor de pixel da esquerda com um valor de pixel correspondente da direita e soma esses produtos. A transformação que estou procurando deve conectar os pixels que maximizarão a soma. Portanto, quando a soma é maximizada, sei que multipliquei os pixels correspondentes.

Eu realmente tentei muito com isso, mas não consegui. Minha pergunta é se alguém de vocês tem uma ideia ou já fez algo semelhant

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, deixe-me saber se posso esclarecer esta questão. Ainda preciso verificar como postar perguntas usando o látex.

Muito obrigado pela contribuição.

[left.png]http: //i.stack.imgur.com/oSTER.pn [right.png]http: //i.stack.imgur.com/Njahj.pn

Receio que, na maioria dos casos, imagens de 16 bits apareçam apenas pretas (pelo menos nos sistemas que uso) :( mas é claro que existem dados lá.

UPDATE 1

Tento esclarecer minha pergunta. Estou procurando um campo vetorial com vetores de deslocamento queponto de cada pixel em left.png para o pixel correspondente em right.png. Meu problema é que não tenho certeza das restrições que tenho.

$ \vec{r} + \vec{d}(\vec{r}) = \vec{r}\prime $

where o vetor r (componentes xey) aponta para um pixel em left.png e o vetor r-prime (componentes x-prime e y-prime) aponta para o pixel correspondente em right.png. para todo r existe um vetor de deslocamento.

O que eu fiz anteriormente foi que encontrei manualmente os componentes do campo vetorial d e os ajustei a um segundo grau polinômio:

$ \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) $

Então eu coloquei:

$ \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 $

Isso faz sentido para você? É possível obter todos os delta-x (x, y) e delta-y (x, y) com correlação cruzada? A correlação cruzada deve ser maximizada se os pixels correspondentes estiverem ligados entre os vetores de deslocamento, certo?

UPDATE 2

Então o algoritmo que eu estava pensando é o seguinte:

Deform right.png Obtenha o valor da correlação cruzadaDeform right.png mais Obtenha o valor da correlação cruzada e compare com o valor antes de Se for maior, boa deformação, se não, refaça a deformação e faça outra coisaepois de maximizar o valor da correlação cruzada, saiba que deformação existe:)

Sobre a deformação: pode-se fazer primeiro uma mudança nas direções x e y para maximizar a correlação cruzada e, em um segundo passo, esticar ou comprimir dependentes de x e y e em um terceiro passo deformar quadrático e dependente de x e repita este procedimento iterativ ?? Eu realmente tenho um problema para fazer isso com coordenadas inteiras. Você acha que eu teria que interpolar a imagem para obter uma distribuição contínua? Eu tenho que pensar sobre isso novamente :( Obrigado a todos por participarem:)

questionAnswers(6)

yourAnswerToTheQuestion