Wie eine Bild Kreuzkorrelation mit subpixel-Genauigkeit, die mit scipy
Das Bild unten zeigt zwei Kreise gleichen radius haben, gerendert mit Anti-Aliasing, nur, dass der linke Kreis wird verschoben halben pixel horizontal (beachten Sie, dass der Kreis der horizontalen Mitte ist in der Mitte des pixels in der linken, auf der pixel-Grenze auf der rechten Seite).
Wenn ich eine Kreuz-Korrelation, die ich nehmen kann die Lage des Maximums auf der Korrelation von array, und berechnen Sie dann die Umschalttaste. Aber da die pixel-Positionen sind immer ganze zahlen, meine Frage ist:
"Wie bekomme ich eine sub-pixel (floating point) - offset zwischen zwei Bildern mittels Kreuz-Korrelation in Numpy/Scipy?"
In meinen Skripten verwende entweder von scipy.signal.correlate2d
oder scipy.ndimage.filters.correlate
, und Sie scheinen zu produzieren identische Ergebnisse.
Den Kreisen, die hier sind nur Beispiele, aber mein domain-spezifische Funktionen neigen dazu, sub-pixel-Verschiebungen, und derzeit immer nur ganzzahlige Verschiebungen gibt, werden Ergebnisse, die nicht so gut...
Jede Hilfe wird sehr geschätzt!
- Sollte diese Frage bewegt werden, um die Signalverarbeitung? (dsp.stackexchange)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die diskrete Kreuzkorrelation (umgesetzt die) kann nur ein einzelner pixel Präzision. Die einzige Lösung, die ich sehen kann, ist die Interpolation von 2D-arrays, um ein feineres raster (up-sampling).
Hier einige Diskussion über DSP über upsampling vor der Kreuz-Korrelation.
Ich hatte ein sehr ähnliches Problem, auch mit verschobenen Kreise, und stolperte über eine große Python-Paket namens "image registration" von Adam Ginsburg. Es gibt Sie sub-pixel-2D-Bilder, Schichten und ist ziemlich schnell. Ich glaube, dass es eine Python-Implementierung der beliebten MATLAB-Modul, das nur sampelt Bilder rund um den Gipfel der x-Korrelation.
Check it out: https://github.com/keflavich/image_registration
Habe ich mit 'chi2_shifts.py" mit guten Ergebnissen.