Frage

Ich weiß nicht, ob das in ein Mathematikforum oder ein Programmierforum gehen sollte, aber ich werde es in beiden posten und sehen, wo ich hinkomme.

Ich habe zwei Computerbilder...Eines davon ist ein „Originalbild“ (eine große TIF-Datei).Das andere ist eine transformierte Version des Originalbildes ...Es wurde in einem Softwareprogramm gedreht, geschert und übersetzt.Ich muss noch etwas an dem transformierten Bild arbeiten, aber ich benötige die (x-y)-Koordinaten jedes Pixels im Originalbild, um meine Berechnungen abzuschließen.

Ich weiß, dass das Bild mit einer 3x3-Transformationsmatrix gedreht und geschert wurde.Wenn ich die Matrix hätte, könnte ich das zweite Bild selbst aus dem ersten (oder umgekehrt) ableiten.Ich weiß nicht genau, wie stark es gedreht, geschert oder verschoben wurde, daher kann ich die Matrizen nicht einfach aus einer Reihe bekannter Transformationen ableiten.Was ich habe, ist eine Reihe entsprechender Punkte (die Ecken usw.) in jedem Bild und ihre entsprechenden (x,y)-Koordinaten.Hier ist also mein Dilemma:

Kann ich anhand einer Reihe entsprechender transformierter Punkte ((x,y) -> (x',y'), drei oder mehr davon), die Transformationsmatrix ableiten, die verwendet wurde, um ein Bild in das andere umzuwandeln?Wenn ich die Matrix ableiten kann, kann ich nach den Originalkoordinaten aller Pixel (alle 18 Millionen davon) suchen und die Berechnungen durchführen, die ich durchführen muss.

Kann jemand helfen?Ich kenne mich mit linearer Algebra aus...einfach nicht vertraut genug, um das ohne jede Menge Kopfzerbrechen daraus abzuleiten.Alles wird geschätzt!

  • Mike
War es hilfreich?

Lösung

Ich bin mir nicht sicher, ob du willst Handbuch oder automatisch...

Handbuch

Wenn Sie die transformierten Koordinaten der vier Ecken Ihres Rechtecks ​​angeben, können Sie die Transformationsgleichungen ableiten:

Alternativtext http://www.praeclarum.org/so/wellner.png

(Von Pierre Wellner Interaktion mit Papier auf dem DigitalDesk und weitere Details in seinem These)

Jetzt müssen Sie nur noch nach den Koeffizienten der Gleichung auflösen.

Mit vier Punktpaaren können die beiden Sätze von vier gleichzeitigen linearen Gleichungen schnell durch Gaußsche Eliminierung gelöst werden, um die Werte von c1-8 zu ermitteln.

Schließlich können Sie diese Gleichungen in die gewünschten 3x3-Matrizen umwandeln.Die obigen Gleichungen sind leistungsstark genug, um nichtlineare Transformationen durchzuführen, und Sie können sie in die affine 3x3-Schermatrix vereinfachen.

Aber ich würde einfach bei den Nonliner-Gleichungen (oben) bleiben, da sie damit umgehen können perspektivische Verzerrung.

Automatisch

Dieselbe Methode, aber Sie können einen Kantendetektor in Kombination mit einem Linienerkennungsalgorithmus verwenden, um eine Reihe von etwa 4 Linien zu finden, die ein Rechteck bilden.

Wenn Ihre Bildrechtecke wirklich hervorstechen (weißliche Bilder auf dunklem Hintergrund), können Sie sie verwenden Eckenerkennung erhältlich in Bibliotheken wie Funktionserkennung von OpenCV (sehen cvCornerHarris).

Sie können diese Linien schneiden, um die vier Ecken zu finden und die Transformationsgleichung verwenden.

Andere Tipps

Sie müssen nur 3 Punkte eine 3x3 Transformationsmatrix definieren. Wenn Sie die Punkte (0,0) haben, (0,1) und (1,0) und sie durch die Matrix-Transformation [abcdef 0 0 1], erhalten Sie (c, f), (b, e) und (a, d).

ich glaube, Sie, indem sie eine Liste beginnen sollte, sagen 6 3 Punkte (für 6 Unbekannten) mit X / Y-Koordinaten vor und nach der Transformation.

Dann jemand klüger als ich, dass in einem Satz von linearen Gleichungen Pop sollte und ihn dann zu (sagen wir) Wolfram Alpha für die Lösung.

Die Spitze der Java-Dokumentation Affine zeigt, wie die Matrix eingerichtet werden soll muss:

[ x']   [  m00  m01  m02  ] [ x ]   [ m00x + m01y + m02 ]
[ y'] = [  m10  m11  m12  ] [ y ] = [ m10x + m11y + m12 ]
[ 1 ]   [   0    0    1   ] [ 1 ]   [         1         ]

die meisten der Flaum Blätter entfernen:

[ x']   [ m00x + m01y + m02 ]
[ y'] = [ m10x + m11y + m12 ]

Dann gründen Sie nur einen Satz von 6 x 2 Gleichungen wie folgen aus:

m00x + m01y + m02 - x' = 0
m10x + m11y + m12 - y' = 0

(Wiederholung für 2 weitere x / y vor / nach Paaren)

und sie zu einem Gleichungslöser werfen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top