Correlação de fases - desempenho ruim em imagens ruidosas / desfocadas?

9

Testei com sucesso o algoritmo de correlação de fase 1D para determinar o deslocamento vertical entre duas imagens sintéticas.

Quando mudei para imagens reais, no entanto, ele não é capaz de detectar a tradução (o pico está localizado em 0, resultado errado).

Eu tenho as seguintes imagens:

insira a descrição da imagem aqui insira a descrição da imagem aqui

E correlação de fase resultante (Magnitude, Real, Imaginária):

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

A primeira linha de digitalização da imagem é completamente branca, mas a mudança é obviamente maior (20 pixels).

O resultado esperado é a linha branca na 20ª linha, que acontece apenas em imagens sintéticas ou com ruído de luz.

Meu algoritmo é muito simples - para cada coluna da imagem:

  1. Calcular 1D FT das colunas de origem e imagem de destino ( a=FT(A), b=FT(B))
  2. Calcular espectro de potência cruzada ( cross_power = a *. conj(b) / |a *. conj(b)|) - *.denota multiplicação por pontos, conj(x)denota conjugado complexo
  3. Correlação de fase de computação ( phase = IFT(cross_power))
  4. Encontre a magnitude máxima em cada coluna de phase.
  5. Encontre a localização do pico de consenso (por exemplo, mediana dos locais de pico detectados)

Você pode me aconselhar como melhorar o algoritmo de correlação de fase de linha de base para lidar com imagens do mundo real (barulhentas)?

Eu deveria preferir usar a NCC (Correlação cruzada normalizada) em vez da correlação de fase baseada na FFT?


ATUALIZAR

Eu estava experimentando o preenchimento zero para descartar erros introduzidos pelo deslocamento circular (apenas o deslocamento linear simples das imagens é desejável) e testei isso em imagens originais da Wikipedia:

insira a descrição da imagem aqui insira a descrição da imagem aqui

O pico único está claramente lá como deveria ser:

insira a descrição da imagem aqui

No entanto - se eu executar uma suavização leve (desfoque gaussiano) para reduzir o ruído e realmente melhorar o resultado, a correlação de fase sairá totalmente mutilada:

insira a descrição da imagem aqui insira a descrição da imagem aqui

insira a descrição da imagem aqui

Aqui está a versão aprimorada - o pico original é mais fraco (por quê ??) e surgiram novos picos em torno de turnos zero (por quê ??):

insira a descrição da imagem aqui

Libor
fonte
Como vejo, na sua imagem correlacionada em fases, o pico máximo mostra a mudança correspondente. No entanto, não sei o que são amplitudes reais de correlação cruzada entre essas imagens.
Eddy_Em 26/04
@ Eddy_Em Vou gerar imagens separadas para partes reais e imaginárias e adicioná-las ao post em breve. Até agora, existem apenas informações de magnitude.
Libor
Sua referência na Wikipedia diz usar transformações 2D de Fourier. Por que você está usando transformações 1D?
Peter K.
1
Bem, sim, mas você precisa comparar maçãs com maçãs. Apenas comparar as mesmas colunas em cada imagem não fará o que você deseja. Se o movimento for grande o suficiente, não haverá correlação entre as colunas. Você precisa considerar a imagem como um todo. Uma maneira que pode funcionar é somar as linhas nas duas imagens e fazer o 1D trabalhar nisso.
Peter K.
1
@PeterK. Isso foi em 2D - verifiquei que a correlação de fase saiu como no artigo da Wiki, apenas invertida (provavelmente devido a multiplicadores invertidos ao calcular o espectro de potência cruzada ou inverter a entrada / saída). Descobri que a suavização (janela gaussiana) realmente prejudica o resultado final, mas não sei por que. Finalmente utilizarei a Correlação cruzada normalizada, pois a Correlação de fase parece ser fraca ao lidar com dados de baixa frequência.
Libor

Respostas:

10

Versão unidimensional

A versão unidimensional listada não funcionará. Quando houver uma mudança suficientemente grande nas imagens (mais de um ou dois pixels nas imagens do mundo real), não haverá nada relacionado aos pixels da coluna.

Para um exemplo disso, tente:

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

Para que tenhamos I5:

insira a descrição da imagem aqui

e I6:

insira a descrição da imagem aqui

Então a correlação de fase unidimensional é apenas:

insira a descrição da imagem aqui

considerando que a correlação de fase bidimensional é:

insira a descrição da imagem aqui

É um pouco difícil de ver, mas há um pico muito alto no canto inferior direito da imagem. Não existe um pico claro na versão unidimensional.

Por que a suavização não ajuda? # 1

O que a correlação está tentando fazer é encontrar variações "semelhantes" em cada imagem. Se os sinais subjacentes forem suficientemente aleatórios, isso funcionará bem: a correlação do ruído branco com ela mesma fornece um pico realmente bom na origem e quase zero em outros lugares.

Suavizar uma imagem "aleatória" com um gaussiano terá o efeito de suavizar a correlação que você espera - espalhando a energia em picos por uma área mais ampla.

A suavização tem o efeito oposto de "pré-embranquecer" a imagem. O pré-clareamento (como o nome sugere) tenta tornar a imagem mais parecida com o ruído branco - que tem a melhor forma se estivermos realizando uma detecção baseada em correlação (na medida em que o pico está bem localizado).

O melhor é usar a diffoperação matlab para uma maneira simplista, mas surpreendentemente eficaz, de pré-branquear imagens.

Veja este exemplo.

Por que a suavização não ajuda? # 2

Por que a suavização causa picos extras?

Se você suavizar cada imagem com um kernel k(x,y) então temos:

ha=gakhb=gbk
Onde é convolução.

Agora,

Ha=KGaHb=KGbR=HaHb|HaHb|=|K|2GaGb|K|2|GaGb|=GaGb|GaGb|

O que eu suspeito que está acontecendo (embora não tenha certeza) é que talvez o seu kernel tenha valores próximos de zero no domínio da frequência, causando problemas numéricos?

Se eu aplicar um kernel:

K = one(5,5);

para minhas imagens aleatórias, então eu recebo:

insira a descrição da imagem aqui

para a correlação bidimensional, que torna o pico mais espalhado, mas não exibe os problemas que você está vendo.

Peter K.
fonte
Ótima resposta, obrigado! O problema que tenho é que o pico não está apenas mal localizado, mas aparece em uma posição completamente errada. Finalmente, li JPLewis: "Correlação cruzada normalizada rápida", que diz que a correlação de fase tem problemas com a variação da energia da imagem em locais diferentes e, portanto, a pré-filtragem deve ser aplicada - um filtro laplaciano é proposto para clareamento de sinal, embora qualquer filtro passa-alto faria. O problema é que a frequência de corte é desconhecida previamente e o limiar muito alto ou muito baixo prejudicará novamente a correspondência. Mas vou tentar.
Libor
1
Off Topic: É engraçado que pesquisar no Google por "sinal de branqueamento" vai te ensinar muito sobre creme dental: D
Libor
2

A maneira mais fácil de obter um bom desempenho com a correlação de fases, clareando o sinal, é tomar o log da magnitude. Você também pode filtrar o ruído da superfície de correlação resultante. Para obter detalhes, consulte “Melhorando a correlação de fase para o registro de imagens”, Anais da (ICVNZ2011) Computação de imagem e visão (Nova Zelândia) 2011, p.488-493, http://www98.griffith.edu.au/dspace/bitstream/handle/ 10072/44512 / 74188_1.pdf? Sequence = 1

user9026
fonte