Corrélation de phase - Mauvaise performance sur les images bruyantes / floues?

9

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:

entrez la description de l'image ici entrez la description de l'image ici

Et corrélation de phase résultante (Magnitude, Real, Imaginary):

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

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:

  1. Calculer 1D FT de colonnes d'images source et cible ( a=FT(A), b=FT(B))
  2. 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
  3. Calculer la corrélation de phase ( phase = IFT(cross_power))
  4. Trouvez la magnitude maximale dans chaque colonne de phase.
  5. 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:

entrez la description de l'image ici entrez la description de l'image ici

Le pic unique est clairement là comme il se doit:

entrez la description de l'image ici

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:

entrez la description de l'image ici entrez la description de l'image ici

entrez la description de l'image ici

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

entrez la description de l'image ici

Libor
la source
Comme je le vois, sur votre image en phase corrélée, le pic max montre le décalage correspondant. Cependant, je ne sais pas quelles sont les amplitudes réelles de corrélation croisée entre ces images.
Eddy_Em
@Eddy_Em Je vais générer des images séparées pour la partie réelle et imaginaire et l'ajouter au message dans un certain temps. Jusqu'à présent, il n'y a que des informations de magnitude.
Libor
Votre référence dans Wikipedia dit d'utiliser des transformées de Fourier 2D. Pourquoi utilisez-vous des transformations 1D?
Peter K.
1
Eh bien, oui, mais vous devez comparer des pommes avec des pommes. La simple comparaison des mêmes colonnes dans chaque image ne vous donnera pas ce que vous voulez. Si le mouvement est suffisamment important, il n'y a aucune corrélation entre les colonnes. Vous devez considérer l'image dans son ensemble. Une façon qui pourrait fonctionner est de faire la somme des lignes dans les deux images et de faire le travail 1D sur cela.
Peter K.
1
@PeterK. C'était 2D - J'ai vérifié que la corrélation de phase est ressortie comme dans l'article Wiki, uniquement inversée (probablement en raison de multiplicateurs inversés lors du calcul du spectre de puissance croisée ou d'une entrée / sortie inversée). J'ai trouvé que le lissage (fenêtre gaussienne) nuit vraiment au résultat final, mais je ne sais pas pourquoi. J'utiliserai finalement la corrélation croisée normalisée à la place, car la corrélation de phase semble être faible lorsqu'il s'agit de données à basse fréquence.
Libor

Réponses:

10

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:

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

Pour que nous ayons I5:

entrez la description de l'image ici

et I6:

entrez la description de l'image ici

Alors la corrélation de phase unidimensionnelle est juste:

entrez la description de l'image ici

alors que la corrélation de phase bidimensionnelle est:

entrez la description de l'image ici

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' diffopé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 noyau k(x,y) on obtient alors:

ha=gakhb=gbk
est la convolution.

Maintenant,

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

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:

K = one(5,5);

à mes images aléatoires, alors j'obtiens:

entrez la description de l'image ici

pour la corrélation bidimensionnelle, qui étend le pic, mais ne présente pas les problèmes que vous voyez.

Peter K.
la source
Excellente réponse, merci! Le problème que j'ai, c'est que le pic est non seulement mal localisé, mais il apparaît dans une position complètement fausse. J'ai finalement lu JPLewis: "Fast Normalized Cross-Correlation" qui dit que la corrélation de phase a des problèmes avec la variation de l'énergie de l'image à différents endroits et donc le pré-filtrage doit être appliqué - un filtre laplacien est proposé pour le blanchiment du signal bien que tout filtre passe-haut ferait. Le problème demeure que la fréquence de coupure est inconnue à l'avance et qu'un seuil trop élevé ou trop bas nuira à nouveau à la correspondance. Mais je vais l'essayer.
Libor
1
Hors sujet: Il est amusant que la recherche Google sur le "blanchiment du signal" vous en apprenne beaucoup sur le dentifrice: D
Libor
2

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

user9026
la source