J'ai testé avec succès l' algorithme de corrélation de phase 1D pour déterminer le décalage vertical entre deux images synthétiques.
Cependant, lorsque je suis passé à des images réelles, il n'est pas du tout en mesure de détecter la traduction (le pic est situé à 0, ce qui est un mauvais résultat).
J'ai les images suivantes:
Et corrélation de phase résultante (Magnitude, Real, Imaginary):
La première ligne de balayage de l'image est complètement blanche, mais le décalage est évidemment plus grand (20 pixels).
Le résultat attendu est une ligne blanche sur la 20e rangée qui ne se produit que sur les images synthétiques ou le bruit léger.
Mon algorithme est très simple - pour chaque colonne d'image:
- Calculer 1D FT de colonnes d'images source et cible (
a=FT(A)
,b=FT(B)
) - Calculer le spectre de puissance croisée (
cross_power = a *. conj(b) / |a *. conj(b)|
) -*.
dénote la mutliplication ponctuelle,conj(x)
dénote le conjugué complexe - Calculer la corrélation de phase (
phase = IFT(cross_power)
) - Trouvez la magnitude maximale dans chaque colonne de
phase
. - Trouver un emplacement de pic consensuel (par exemple, la médiane des emplacements de pic détectés)
Pouvez-vous s'il vous plaît me conseiller sur la façon d'améliorer l'algorithme de corrélation de phase de ligne de base pour traiter les images du monde réel (bruyant)?
Dois-je plutôt utiliser NCC (Normalized Cross Correlation) au lieu de la corrélation de phase basée sur FFT?
MISE À JOUR
J'expérimentais avec un remplissage nul pour exclure les erreurs introduites par le décalage circulaire (seul un décalage linéaire simple des images est souhaitable) et j'ai testé cela sur des images originales de Wikipedia:
Le pic unique est clairement là comme il se doit:
Cependant - si j'effectue un léger lissage (flou gaussien) pour réduire le bruit et réellement améliorer le résultat, la corrélation de phase apparaît totalement altérée:
Voici la version améliorée - le pic d'origine est plus faible (pourquoi ??) et de nouveaux pics sont apparus autour de zéro décalage (pourquoi ??):