Phasenkorrelation - Schlechte Leistung bei verrauschten / unscharfen Bildern?

9

Ich habe erfolgreich den 1D- Phasenkorrelationsalgorithmus getestet , um die vertikale Verschiebung zwischen zwei synthetischen Bildern zu bestimmen.

Wenn ich zu realen Bildern gewechselt bin, kann es jedoch überhaupt keine Übersetzung erkennen (der Peak liegt bei 0, was ein falsches Ergebnis ist).

Ich habe folgende Bilder:

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Und daraus resultierende Phasenkorrelation (Magnitude, Real, Imaginary):

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Die erste Scanlinie des Bildes ist vollständig weiß, aber die Verschiebung ist offensichtlich größer (20 Pixel).

Das erwartete Ergebnis ist eine weiße Linie in der 20. Reihe, die nur bei synthetischen Bildern oder leichtem Rauschen auftritt.

Mein Algorithmus ist sehr einfach - für jede Bildspalte:

  1. Berechnen Sie 1D FT der Quell- und Zielbildspalten ( a=FT(A), b=FT(B))
  2. Cross-Power-Spektrum berechnen ( cross_power = a *. conj(b) / |a *. conj(b)|) - *.bezeichnet die punktweise Vervielfältigung, conj(x)bezeichnet das komplexe Konjugat
  3. Phasenkorrelation berechnen ( phase = IFT(cross_power))
  4. Finden Sie die maximale Größe in jeder Spalte von phase.
  5. Finden Sie die Konsens-Peak-Position (z. B. Median der erkannten Peak-Positionen).

Können Sie mir bitte raten, wie ich den Basiskonzentrationskorrelationsalgorithmus verbessern kann, um mit realen (verrauschten) Bildern umzugehen?

Sollte ich lieber NCC (Normalized Cross Correlation) anstelle von FFT-basierter Phasenkorrelation verwenden?


AKTUALISIEREN

Ich habe mit Null-Auffüllung experimentiert, um Fehler auszuschließen, die durch Kreisverschiebung verursacht wurden (nur eine einfache lineare Verschiebung von Bildern ist wünschenswert), und dies an Originalbildern von Wikipedia getestet:

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Der einzelne Peak ist eindeutig da, wie er sein sollte:

Geben Sie hier die Bildbeschreibung ein

Wenn ich jedoch eine leichte Glättung (Gaußsche Unschärfe) durchführe, um das Rauschen zu reduzieren und das Ergebnis tatsächlich zu verbessern , wird die Phasenkorrelation völlig entstellt:

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Hier ist die erweiterte Version - der ursprüngliche Peak ist schwächer (warum ??) und es erschienen neue Peaks um Nullverschiebungen (warum ??):

Geben Sie hier die Bildbeschreibung ein

Libor
quelle
Wie ich sehe, zeigt der maximale Peak auf Ihrem phasenkorrelierten Bild eine entsprechende Verschiebung. Ich weiß jedoch nicht, was die tatsächlichen Amplituden der Kreuzkorrelation zwischen diesen Bildern sind.
Eddy_Em
@Eddy_Em Ich werde separate Bilder für Real- und Imaginärteil generieren und sie in einer Weile dem Beitrag hinzufügen. Bisher gibt es nur Größeninformationen.
Libor
Ihre Referenz in Wikipedia besagt, dass 2D-Fourier-Transformationen verwendet werden sollen. Warum verwenden Sie 1D-Transformationen?
Peter K.
1
Ja, aber Sie müssen Äpfel mit Äpfeln vergleichen. Wenn Sie nur die gleichen Spalten in jedem Bild vergleichen, erhalten Sie nicht das, was Sie möchten. Wenn die Bewegung groß genug ist, gibt es keinerlei Korrelation zwischen den Spalten. Sie müssen das Bild als Ganzes betrachten. Eine Möglichkeit, die funktionieren könnte, besteht darin, die Zeilen in beiden Bildern zu summieren und die 1D-Arbeit daran auszuführen.
Peter K.
1
@ PeterK. Dies war 2D - ich habe überprüft, dass die Phasenkorrelation wie im Wiki-Artikel herauskam und nur umgedreht wurde (wahrscheinlich aufgrund umgedrehter Multiplikatoren bei der Berechnung des Cross-Power-Spektrums oder umgedrehter Eingabe / Ausgabe). Ich fand, dass das Glätten (Gaußsches Fenster) das Endergebnis wirklich verletzt, aber nicht sicher warum. Ich werde stattdessen endlich die normalisierte Kreuzkorrelation verwenden, da die Phasenkorrelation beim Umgang mit Niederfrequenzdaten schwach zu sein scheint.
Libor

Antworten:

10

Eindimensionale Version

Die eindimensionale Version, die Sie auflisten, funktioniert nicht. Wenn die Bildverschiebung groß genug ist (mehr als ein oder zwei Pixel in realen Bildern), gibt es keine Beziehung zu den Spaltenpixeln.

Versuchen Sie als Beispiel Folgendes:

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

Damit wir I5 haben:

Geben Sie hier die Bildbeschreibung ein

und I6:

Geben Sie hier die Bildbeschreibung ein

Dann ist die eindimensionale Phasenkorrelation nur:

Geben Sie hier die Bildbeschreibung ein

wohingegen die zweidimensionale Phasenkorrelation ist:

Geben Sie hier die Bildbeschreibung ein

Es ist etwas schwer zu erkennen, aber in der unteren rechten Ecke des Bildes befindet sich ein sehr hoher Peak. In der eindimensionalen Version ist kein klarer Peak vorhanden.

Warum hilft Glätten nicht? # 1

Die Korrelation versucht, "ähnliche" Variationen in jedem Bild zu finden. Wenn die zugrunde liegenden Signale ausreichend zufällig sind, funktioniert dies gut: Die Korrelation des weißen Rauschens mit sich selbst ergibt einen wirklich schönen Peak am Ursprung und an anderer Stelle nahe Null.

Wenn Sie ein "zufälliges" Bild mit einem Gaußschen Bild glätten , wird die erwartete Korrelation geglättet - die Energie wird in allen Spitzen über einen größeren Bereich verteilt.

Das Glätten hat den gegenteiligen Effekt, dass das Bild "vorgebleicht" wird. Das Voraufhellen (wie der Name schon sagt) versucht, das Bild mehr wie weißes Rauschen zu machen - was die beste Form hat, wenn wir eine korrelationsbasierte Erkennung durchführen (da der Peak gut lokalisiert ist).

Was Sie besser machen, ist die Verwendung der Matlab- diffOperation für eine vereinfachte, aber überraschend effektive Methode zum Voraufhellen von Bildern.

Siehe dieses Beispiel.

Warum hilft Glätten nicht? # 2

Warum verursacht die Glättung zusätzliche Spitzen?

k(x,y)

ha=gakhb=gbk

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

Was ich vermute (obwohl ich nicht sicher bin) ist, dass Ihr Kernel möglicherweise Werte nahe Null im Frequenzbereich hat, was zu numerischen Problemen führt?

Wenn ich einen Kernel anwende:

K = one(5,5);

zu meinen zufälligen Bildern bekomme ich dann:

Geben Sie hier die Bildbeschreibung ein

für die zweidimensionale Korrelation, die den Peak stärker ausbreitet, aber nicht die Probleme aufweist, die Sie sehen.

Peter K.
quelle
Tolle Antwort, danke! Das Problem, das ich habe, ist, dass der Peak nicht nur schlecht lokalisiert ist, sondern auch in einer völlig falschen Position erscheint. Ich habe schließlich JPLewis gelesen: "Schnelle normalisierte Kreuzkorrelation", die besagt, dass die Phasenkorrelation Probleme mit variierender Bildenergie an verschiedenen Stellen hat und daher eine Vorfilterung angewendet werden sollte - ein Laplace-Filter wird für die Signalaufhellung vorgeschlagen, obwohl es ein Hochpassfilter gibt würdest du. Das Problem bleibt, dass die Grenzfrequenz vorher unbekannt ist und ein zu hoher oder zu niedriger Schwellenwert die Übereinstimmung erneut beeinträchtigt. Aber ich werde es versuchen.
Libor
1
Off Topic: Es ist lustig, dass die Google-Suche nach "Signal Whitening" Ihnen viel über Zahnpasta lehrt: D
Libor
2

Der einfachste Weg, eine gute Leistung aus der Phasenkorrelation durch Aufhellen des Signals zu erzielen, besteht darin, das Protokoll der Größe zu erstellen. Sie können auch das Rauschen aus der resultierenden Korrelationsfläche herausfiltern. Weitere Informationen finden Sie unter „Verbessern der Phasenkorrelation für die Bildregistrierung“, Proceedings of (ICVNZ2011) Image and Vision Computing New Zealand 2011, S. 488-493, http://www98.griffith.edu.au/dspace/bitstream/handle/ 10072/44512 / 74188_1.pdf? Sequence = 1

user9026
quelle