Como calcular o vetor de deslocamento 2D para registro de imagem binária?

8

Minhas entradas são várias imagens binárias como:primeira imagem binária a ser registradasegunda imagem binária a ser registrada

Eles têm globalmente o mesmo conteúdo, mas podem não ser registrados, pois são produzidos a partir de uma câmera manual. O que eu gostaria de calcular é o vetor de deslocamento 2D da primeira imagem para a segunda. Eu uso o OpenCV e minha primeira tentativa foi calcular pontos de recurso (algoritmo SURF) e a transformação afim entre as duas imagens. Mas, é claro, a descrição do recurso é meio ruim em uma imagem binária, portanto, a correspondência é difícil e o mapa de correspondência muito impreciso.

Alguém tem uma idéia de como eu poderia fazer isso?

Stéphane Péchard
fonte

Respostas:

6

Estou um pouco surpreso que pontos de recurso não funcionam tão bem. Consegui registrar formas como a sua usando

  • Harris aponta, este é um detector de canto, em combinação com o algoritmo RANSAC. Veja o wiki ou o site de Peter Kovesi
  • Usando um detector de recursos como SURF ou SIFT em combinação com um mapa de bordas da imagem antes da detecção de recursos, seguido por alguma forma de correspondência robusta.

EDITAR

Eu experimentei o matlab e tentei algumas variações sobre esse tema. Atualmente eu uso

  • SELECIONE os recursos do mapa de arestas para verificar a rotação e a escala, embora sejam muito pequenos entre as imagens que você forneceu
  • RANSAC para correspondência robusta
  • Correlação cruzada para verificar a tradução entre as duas imagens

Partida robusta Antes do registro Após o registro

Fonte no github .

Uma alternativa para o RANSAC poderia ser a abordagem de votação / classificação por transformação de Hough, proposta pelo inventor da SIFT, David Lowe.

Maurits
fonte
Conheço Harris, mas não tenho um algoritmo de correspondência rápido e robusto para garantir que recebo os mesmos pontos de uma imagem para outra. Além disso, o Ransac não é utilizável como é no OpenCV ...
Stéphane Péchard
Muito obrigado pelo seu esforço. Ele mostra uma boa maneira de fazer isso. Finalmente modifiquei a maneira como faço o que preciso, porque a computação e a correspondência de recursos exigem muito da CPU. Obrigado mesmo assim, você fez um bom trabalho!
Stéphane Péchard
Stephane, você poderia adicionar sua solução também ao site?
Maurits
11
bem, o problema é que eu não respondo à pergunta, então não é relevante colocá-lo aqui. O que fiz foi uma detecção dos blobs da imagem e uma descrição de cada blob pela quantidade mínima de pontos possível. Queria que o deslocamento 2D calculasse uma acumulação temporal, mas não o farei mais, pois uma descrição vetorial dos blobs é suficiente.
Stéphane Péchard