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 ??):
Réponses:
Version unidimensionnelle
La version unidimensionnelle que vous répertoriez ne fonctionnera pas. Lorsqu'il y a un décalage suffisamment important dans les images (plus d'un ou deux pixels dans les images du monde réel), il n'y aura rien concernant les pixels de la colonne.
Pour un exemple de cela, essayez:
Pour que nous ayons I5:
et I6:
Alors la corrélation de phase unidimensionnelle est juste:
alors que la corrélation de phase bidimensionnelle est:
C'est un peu difficile à voir, mais il y a un pic très élevé dans le coin inférieur droit de l'image. Aucun pic clair n'existe dans la version unidimensionnelle.
Pourquoi le lissage n'aide-t-il pas? #1
Ce que la corrélation essaie de faire, c'est de trouver des variations "similaires" dans chaque image. Si les signaux sous-jacents sont suffisamment aléatoires, alors cela fonctionnera bien: la corrélation du bruit blanc avec lui-même donne un pic vraiment agréable à l'origine, et proche de zéro ailleurs.
Lisser une image "aléatoire" avec une gaussienne aura pour effet de lisser la corrélation que vous attendez --- répartissant l'énergie dans tous les pics sur une zone plus large.
Le lissage a l' effet inverse de "pré-blanchir" l'image. Le pré-blanchiment (comme son nom l'indique) essaie de rendre l'image plus semblable à du bruit blanc --- qui a la meilleure forme si nous faisons une détection basée sur la corrélation (en ce que le pic est bien localisé).
Ce que vous feriez mieux, c'est d'utiliser l'
diff
opération matlab pour une manière simpliste, mais étonnamment efficace, de pré-blanchir les images.Voir cet exemple.
Pourquoi le lissage n'aide-t-il pas? # 2
Pourquoi le lissage provoque-t-il des pics supplémentaires?
Si vous lissez chaque image avec un noyauk(x,y) on obtient alors:
Maintenant,
Ce que je soupçonne (mais je ne suis pas sûr), c'est que votre noyau a peut-être des valeurs proches de zéro dans le domaine fréquentiel, provoquant des problèmes numériques?
Si j'applique un noyau:
à mes images aléatoires, alors j'obtiens:
pour la corrélation bidimensionnelle, qui étend le pic, mais ne présente pas les problèmes que vous voyez.
la source
Le moyen le plus simple d'obtenir de bonnes performances de la corrélation de phase en blanchissant le signal est de prendre le log de l'amplitude. Vous pouvez également filtrer le bruit de la surface de corrélation résultante. Pour plus de détails, voir «Improving Phase Correlation for Image Registration», Proceedings of (ICVNZ2011) Image and Vision Computing New Zealand 2011, p.488-493,, http://www98.griffith.edu.au/dspace/bitstream/handle/ 10072/44512 / 74188_1.pdf? Sequence = 1
la source