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:
Und daraus resultierende Phasenkorrelation (Magnitude, Real, Imaginary):
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:
- Berechnen Sie 1D FT der Quell- und Zielbildspalten (
a=FT(A)
,b=FT(B)
) - Cross-Power-Spektrum berechnen (
cross_power = a *. conj(b) / |a *. conj(b)|
) -*.
bezeichnet die punktweise Vervielfältigung,conj(x)
bezeichnet das komplexe Konjugat - Phasenkorrelation berechnen (
phase = IFT(cross_power)
) - Finden Sie die maximale Größe in jeder Spalte von
phase
. - 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:
Der einzelne Peak ist eindeutig da, wie er sein sollte:
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:
Hier ist die erweiterte Version - der ursprüngliche Peak ist schwächer (warum ??) und es erschienen neue Peaks um Nullverschiebungen (warum ??):