Forum: PC-Programmierung Algorithmus Bild entzerren


von Georg (Gast)


Lesenswert?

Hallo zusammen,

ich bin auf der Suche nach einem Algorithmus und weis nicht nach welchem 
Begriff ich suchen soll. Letztendlich möchte ich eine Fläche, welche 
durch die 4 Eckpunkte definiert ist, auf eine andere Fläche, welche auch 
durch die 4 Eckpunkte definiert ist, abbilden.
Ich habe solch ein ähnliches Verfahren schon einmal in der 
Bildverarbeitung zum Entzerren von Bildern gesehen. Dort konnte man 4 
Punkte auf einem Bild markieren und konnte anschließend 4 neue 
Koordinaten bestimmen, sodass das man die Perspektive des Bildes ändern 
konnte.
Nach was kann ich suchen?

Danke!
Georg

von radiostar (Gast)


Lesenswert?

Georg schrieb:
> Nach was kann ich suchen?

Algorithmus selber bauen? Erst entzerrst Du horizontal, in einem 2. 
Durchgang vertikal.

von Mark B. (markbrandis)


Lesenswert?

Ich denke "Entzerrung" ist ein Stichwort, das in die Richtung geht.

von BT (Gast)


Lesenswert?

Hallo,

ich denke das Stichwort sind affine Transformationen.

Beispielsweise in OpenCV --> Morphing

http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html

Gruß
BT

von Lötpunkt (Gast)


Lesenswert?

Hallo Georg,

es handelt sich dabei um eine Koordinatentransformation des Bildes. In 
deinem Fall die Projektion auf eine (geneigte) ebene Fläche.

von npn (Gast)


Lesenswert?


von Bongo (Gast)


Lesenswert?

Das ist aber eine simple UV-Transformation, wie wir es in der 11.Klasse 
gemacht haben, oder? Das schreibt man in 5 Zeilen hin.

von Michael B. (laberkopp)


Lesenswert?

Bongo schrieb:
> Das ist aber eine simple UV-Transformation, wie wir es in der
> 11.Klasse gemacht haben, oder? Das schreibt man in 5 Zeilen hin.

Na ja, wenn das Bild ordentlich aussehen will, muss man anteilige 
Pixelgrössen auch anteilig einrechnen, also entweder oversampling oder 
den Rest (Nachkommastellen) berücksichtigen.

Aber wer erst in der 11. Klasse ist, weiss das natürlich nicht, der 
kennt nur das Prinzip.

von Georg (Gast)


Lesenswert?

Hallo,

vielen Dank ersteinmal für die vielen Vorschläge. Es geht hier nicht um 
ein Bild sondern um xy-Koordinaten. Aber an einem Bild kann man das 
Problem ganz gut veranschaulichen.
Ich denke der Verschlag von BT 
(http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html) 
geht in die richtige Richtung. Aber durch den 4. Punkt kann ich ja noch 
zusätzlich eine Scherung des Bildes haben, oder?

Georg

von Thorsten (Gast)


Lesenswert?


von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Bongo schrieb:
> Das ist aber eine simple UV-Transformation, wie wir es in der 11.Klasse
> gemacht haben, oder? Das schreibt man in 5 Zeilen hin.

Was soll denn eine "UV-Transformation" sein?

von asdf (Gast)


Lesenswert?

Johann L. schrieb:
> Bongo schrieb:
>> Das ist aber eine simple UV-Transformation, wie wir es in der 11.Klasse
>> gemacht haben, oder? Das schreibt man in 5 Zeilen hin.
>
> Was soll denn eine "UV-Transformation" sein?

https://en.wikipedia.org/wiki/UV_mapping

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Ok, also toll-Sprech für "Projektion" :-)

Wenn die Koordinaten mit x und y bezeichnet werden dann nennt sich das 
also xy-Transformation...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Georg schrieb:
> Aber durch den 4. Punkt kann ich ja noch zusätzlich eine Scherung
> des Bildes haben, oder?

Durch einen 4. Punkt ist eine affine Transformation bereits 
überbestimmt, d.h. notwendig (aber nicht hinreichend) dafür, dass es mit 
einer affinen Trafo entzerrbar ist, ist dass es auch per affiner Trafo 
verzerrt wurde.

Nehmen wir A, B, C, D als Eckpunkte der verzerrten Ausgangsbildes und 
A', B', C', D' als Eckpunkte des Bildes nach einer affinen Trafo f.

Ohne Einschränkung können wir setzen A = A' = 0, dies ist immer durch 
eine Verschiebung (Translation) erreichbar.  Für f kann daher eine 
lineare Transformation angesetzt werden:

f(B) = B'
f(C) = C'

Weil das ganze in der Ebene geschieht und B und C als Vektoren 
betrachtet die Ebene aufspannen, gibt es Zahlen b und c so dass

D = b·B + c·C

d.h. D ist Linearkombination von B und C.  Damit ergibt sich das Bild 
von D unter f zu:

D' = f(D) = f(b·B + c·C) = b·f(B) + c·f(C) = b·B' + c·C'

wegen der Linearität von f.

Es verbleibt also kein Freiheitsgrad mehr um D' festzulegen.


Und mit "UV-Transformation" ist überhaupt nix gesagt — ausser dass es 
eine Abbildung von einem 2-dimensionalen Raum in einen anderen 
2-dimensionalen Raum (z.B. Kugeloberfläche) ist.  I.d.R wird diese 
Abbildung winkeltreu und nicht-degeneriert sein.  Damit weiß man aber 
immer noch nicht, wie die Abbildung exakt aussieht.

von Georg (Gast)


Lesenswert?

Ich glaube nicht, dass eine affine Abbildung ausreicht. Da die vier 
Eckpunkte beider Flächen komplett frei wählbar sind, ist die 
Parallelität in der Abbildung nicht mehr gegeben. Ich hoffe, dass ich 
das richtig verstanden habe. Siehe 
http://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/warp_affine/warp_affine.html

Die Funktionen getPerspectiveTransform und perspectiveTransform() aus 
http://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html#getperspectivetransform 
sind hingegen genau das was ich gesucht habe.

Hier wird der 4. Punkt benötigt.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Georg schrieb:
> Nach was kann ich suchen?

Homographie bzw. auf Englisch Homography.

In homogenen Koordinaten kann man die Transformation einfach als
Matrixmultiplikation darstellen:

  https://en.wikipedia.org/wiki/Homography#Definition_and_expression_in_homogeneous_coordinates

In deinem Fall hat die Matrix die Größe 3×3. Das Element rechts unten
kannst du i.Allg. auf 1 setzen. Du hast 4 Punkte gegeben, die
transformiert jeweils eine vorgegebene x- und y-Koordinate ergeben
sollen. Das sind 8 Bedingungen, die du in 8 Gleichungen formulieren
kannst, deren Unbekannte die 8 verbleibenden Matrixelemente sind. Durch
Lösung des Gleichungssystems erhältst du also die Matrixelemente und
damit die gesuchte Transformation.

: Bearbeitet durch Moderator
von Sigi (Gast)


Lesenswert?

Bei 4 Punkten ist es iA keine lineare Transformation,
sondern eine sog. bilineare Transformation. Wärend
die erste durch ein Polynom von max. Grad 1 eindeutig
definiert wird, ist der Grad der Bilinearen iA 2.

Nimm als Punkte b00,b01,b10,b11 aus R^n und als
DefBereich aus der UV-Ebene den Bereich [0,0]..[1,1],
dann hat man in die eine Richtung:

b = b00*(1-u)*(1-v)+b10*u*(1-v)+b01*(1-u)*v+b11*u*v

d.h. Dein Zielviereck ist komplett erfasst.

Für die umgekehrte Richtung muss iA eine Quadr.
Gleichung gelöst bzw. ein iterativesVerfahren
angewendet werden. Ist aber nicht so schwer.

von Philipp K. (philipp_k59)


Lesenswert?

Hi, ich habe die ganze Geschichte auch erst durch.

Ich suche nur eine Trapeziale synchrone verzerrung, also indirekt 
Linear.

Das müsste doch ohne Transform gehen, ein Beispiel in RAW als Php code 
habe ich gefunden.. das ist so eine art Zeilenweises interpoliertes 
skalieren.

Eine einleuchtende Formel dafür konnte ich bisher leider nicht finden.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.