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:
E correlação de fase resultante (Magnitude, Real, Imaginária):
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:
- Calcular 1D FT das colunas de origem e imagem de destino (
a=FT(A)
,b=FT(B)
) - Calcular espectro de potência cruzada (
cross_power = a *. conj(b) / |a *. conj(b)|
) -*.
denota multiplicação por pontos,conj(x)
denota conjugado complexo - Correlação de fase de computação (
phase = IFT(cross_power)
) - Encontre a magnitude máxima em cada coluna de
phase
. - 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:
O pico único está claramente lá como deveria ser:
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:
Aqui está a versão aprimorada - o pico original é mais fraco (por quê ??) e surgiram novos picos em torno de turnos zero (por quê ??):
Respostas:
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:
Para que tenhamos I5:
e I6:
Então a correlação de fase unidimensional é apenas:
considerando que a correlação de fase bidimensional é:
É 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
diff
operaçã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 kernelk ( x , y) então temos:
Agora,
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:
para minhas imagens aleatórias, então eu recebo:
para a correlação bidimensional, que torna o pico mais espalhado, mas não exibe os problemas que você está vendo.
fonte
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
fonte