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ê ??):