Transformationsmatrix erstellen

Moien

In der Bildverarbeitung gibt es Transformationsmatrixen (3x3) die im 2D-Raum Punkte skalieren, rotieren und verschieben. Wie man die Matrixen aus Vorgaben (Rotiere um x°, verschiebe um y Pixel) erstellt ist mir klar. Ich bräuchte jetzt aber dem ungedrehten Fall. Ich habe einige Punktepaare und brauche (sehr schnell) eine passende Transformationsatrix.

Die Koordinaten der Punktepaare sind dabei allerdings u.U. fehlerhaft.

Wie macht man sowas? Es sollte möglich sein eine Regressionsgleichung dafür aufzustellen, aber irgendwie reicht mein Wissen dafür nicht.

cu

Hallo,

meinst Du 2D oder 3D?

Olaf

Moien

In der Bildverarbeitung gibt es Transformationsmatrixen (3x3) die
im 2D-Raum Punkte …

meinst Du 2D oder 3D?

2D

cu

meinst Du 2D oder 3D?

2D

Dann verstehe ichs nicht. Wie wendet man denn ne (3*3)-Matrix auf nen 2D-Punkt an?

Olaf

Moien

Dann verstehe ichs nicht. Wie wendet man denn ne (3*3)-Matrix
auf nen 2D-Punkt an?

Homogene Transformationsmatrizen sind immer eine Dimension grösser als der Raum in dem man arbeitet. D.h. OpenGL/DirectX arbeiten mit 4x4, Bildverarbeitung mit 3x3.

Dabei ist die obere linke Matrix immer die Rotation/Skalierung, die untere Zeile immer 0,…,0,1 und die Werte ganz rechts sind die Translation. Der zusätzliche Wert in den Koordianten ist immer 1. => http://de.wikipedia.org/wiki/Homogene_Koordinaten#Wi…

cu

Moien

Transformationsmatrixen (3x3)
2D-Raum Punkte skalieren, rotieren und verschieben.

Ich habe einige Punktepaare und brauche
(sehr schnell) eine passende Transformationsatrix.

Nichts einfacher als das:

(x’,y’,w’) = T*(x,y,w)

mit t_x = 1/x’ und t_y = 1/y’

á là http://de.wikipedia.org/wiki/Homogene_Koordinaten#Wi…

Moien

(x’,y’,w’) = T*(x,y,w)

mit t_x = 1/x’ und t_y = 1/y’

Dann hab ich die Translation für ein Punktepaar. Ich hab aber ~20 Punktepaare die alle vom gleichen T abgebildet werden sollen. Und die sind nicht nur verschoben.

Was nun ?

cu

Ich habe einige Punktepaare und brauche
(sehr schnell) eine passende Transformationsatrix.

Schneller Algorithmus? Schnelle Postzustellung?

hat man zwei Punkte a = (x,y) und b = (u,v), kann man leicht deren Beträge und den von ihnen eingeschlossenen Winkel berechnen:

|a|² = x² + y²
|b|² = u² + v²

x*u + y*v = |a|*|b|*cos©

Die 2 x 2 Matrix M mit M_11 = M_22 und M_12 = -M_21,

M_11 = |b|*cos©/|a|

M_12 = -|b|*sin©/|a|

Sollte a in b überführen.

Moien

(x’,y’,w’) = T*(x,y,w)

mit t_x = 1/x’ und t_y = 1/y’

Dann hab ich die Translation für ein Punktepaar. Ich hab aber
~20 Punktepaare die alle vom gleichen T abgebildet werden
sollen. Und die sind nicht nur verschoben.

Dann muss man 20 solcher Matrizen bilden. Das nette Ding nennt man dann ein Tensorfeld.

Was nun ?

cu

Moien

In der Bildverarbeitung gibt es Transformationsmatrixen (3x3)
die im 2D-Raum Punkte skalieren, rotieren und verschieben. Wie
man die Matrixen aus Vorgaben (Rotiere um x°, verschiebe um y
Pixel) erstellt ist mir klar. Ich bräuchte jetzt aber dem
ungedrehten Fall. Ich habe einige Punktepaare und brauche
(sehr schnell) eine passende Transformationsatrix.

Die Koordinaten der Punktepaare sind dabei allerdings u.U.
fehlerhaft.

Wie macht man sowas? Es sollte möglich sein eine
Regressionsgleichung dafür aufzustellen, aber irgendwie reicht
mein Wissen dafür nicht.

Die Regressions"gerade" kann man genauso einfach bestimmen, wie im Fall eines linearen Zusammenhanges zwischen zwei Variablen.

Fall eines linearen Zusammenhanges zwischen zwei Variablen:

ΔSumme(i, (mxi + b - yi)²) = 0,

wobei m und b unabhängig variiert werden. Dies führt auf 2 lineare Gleichungen für m und b, die von , , und abhängen.

Im 2-D Fall hat man statt (xi, yi) 2-Tupelpaare:

(zi; wi) = (xi, yi; ui, vi)

Mit

ΔSumme(i, ( R ( z i- t )+ t - w i)²) = 0

t ist der Translationsvektor t = (r, s) und R die Rotationsmatrix

R11 = R22 = cos φ

R12 = -R21 = -sin φ

Geht man vor, wie bei der Regressionsgerade, erhält man vier Bestimmungsgleichungen für die drei Größen r, s und cos φ, die von , , , , , , , , , und abhängen.

Das Problem ist also überbestimmt.



cu