Frage

Ich versuche, eine Schrägstellung auf einem Bild auszuführen, wie hier gezeigten


(Quelle: microsoft.com )
.

Ich habe ein Array von Pixeln meines Bild darstellen, und bin nicht sicher, was mit ihnen zu tun.

War es hilfreich?

Lösung

Ein viel besserer Weg, dies zu tun ist durch inverse Abbildung.

Im Wesentlichen wollen Sie das Bild „warp“, nicht wahr? Was bedeutet, dass jedes Pixel im Quellbild zu einem vorgegebenen Punkt geht - ist die Vorgabe eine Transformationsmatrix, die Sie sagt, wie man drehen, skalieren, übersetzen, Schere usw. Um das Bild, das im Wesentlichen nimmt einig (x,y) auf Ihrem Bild zu koordinieren und zu sagen, dass „Ok, die neue Position für dieses Pixel ist (f(x),g(y)).

Das ist im Wesentlichen, was „Verziehen“ der Fall ist.

Nun denken, über eine Bildskalierung ... sagen wir, zehn Mal so groß. Das heißt also, das Pixel das Pixel bei (1,1) bei (10,10) wird - und dann das nächste Pixel wird (1,2) das Pixel (10,20) in dem neuen Bild. Aber wenn Sie dies weiterhin tun, werden Sie keine Werte für einen Pixel haben, (13,13) weil (1.3,1.3) nicht im Originalbild definiert ist, und Sie werden eine Reihe von Löchern in Ihrem neuen Bild haben - Sie haben für diesen Wert zu interpolieren mit die vier Pixel um es in dem neuen Bild, das heißt (10,10) , (10,20), (20,10), (200,2) - dies bilineare Interpolation

Aber hier ist ein anderes Problem an, dass Ihre Transformation war nicht eine einfache Skalierung und war affine (wie das Beispielbild Sie gebucht haben) - dann (1,1) so etwas wie (2.34,4.21) werden würde und dann würde man sie im Ausgangsbild abzurunden zu (2,4) und und Sie müssen bilineare Interpolation auf das neue Bild zu füllen in den Löchern oder kompliziertere Interpolation tun - chaotisch rechts

Jetzt gibt es keine Möglichkeit, , um aus der Interpolation, aber wir können mit dem Tun bilineare Interpolation weg, nur einmal . Wie? Einfach, inverse Abbildung.

Statt es als das Quellbild mit Blick auf die neue Bild gehen, denken Sie an, wo die Daten für das neue Bild von im Quellbild kommen! So (1,1) in dem neuen Bild von einem Reverse-Mapping im Quellbild kommen, sagen sie, (3.4, 2.1) und führen Sie dann die bilineare Interpolation auf dem Quellbild in Abbildung aus dem entsprechenden Wert!

Transformation Matrix

Ok, so wie definieren Sie eine Transformationsmatrix für eine affine Transformation? Diese Webseite sagt Ihnen, wie es geht durch Zusammen verschiedene Transformationsmatrizen zur Rotation, Scherung, etc.

Transformations:

alt text

Compositing:

alt text

Die Endmatrix kann durch Zusammensetzen jeder Matrix in der Reihenfolge, und Sie Umkehren erreicht werden, er die die inverse Abbildung erhalten - entspricht. Wählen Sie berechnen die Positionen der Pixel in dem Quellenbild und Interpolations

Andere Tipps

Wenn Sie nicht das Gefühl, wie neu zu erfinden das Rad Besuche die OpenCV-Bibliothek. Es implementiert viele nützliche Bildverarbeitungsfunktionen einschließlich Perspektive Transformationen. Schauen Sie sich die cvWarpPerspective , die ich verwendet habe, diese Aufgabe zu erfüllen ganz leicht.

Wie KennyTM kommentiert müssen Sie nur eine affine Transformation, die eine lineare Abbildung, die durch jedes Pixel durch eine Matrix Multiplikation M und Addieren des Ergebnisses zu einem Translationsvektor V . Es ist einfache Mathematik

end_pixel_position = M*start_pixel_position + V

Dabei steht M ist eine Zusammensetzung aus einfachen Transformationen wie Drehungen oder Skalierungen und V ist ein Vektor, der durch Zugabe von festen Koeffizienten zu jedem Pixel jeden Punkt Ihrer Bilder übersetzt.

Wenn Sie zum Beispiel das Bild drehen möchten, können Sie eine Rotationsmatrix haben wie folgt definiert:

    | cos(a) -sin(a) |
M = |                |
    | sin(a)  cos(a) |

wo a ist der Winkel, den Sie durch Ihr Bild drehen möchten.

Während Skalierung verwendet eine Matrix der Form:

    | s1   0 |
M = |        |
    | 0   s2 |

Dabei gilt s1 und s2 sind Faktoren auf beiden Achsen Skalierung.

Für Übersetzung Sie nur den Vektor haben V :

    | t1 |
V = |    |
    | t2 |

Das summiert t1 und t2 auf Pixelkoordinaten.

Sie verbinden dann die Matrices in einer einzigen Transformation, zum Beispiel, wenn Sie entweder Skalierung, Rotation und Translation haben werden Sie so etwas wie am Ende mit:

| x2 |             | x1 |
|    | = M1 * M2 * |    | + T
| y2 |             | y1 |

Dabei gilt:

  • x1 und y1 sind Pixelkoordinaten vor dem Anwenden der Transformation,
  • x2 und y2 sind Pixel nach der Transformation,
  • M1 und M2 sind verwendet Matrizes für die Skalierung und Drehung ( REMEMBER: die Zusammensetzung von Matrices ist nicht kommutativ Normalerweise M1 * M2 * Vect != M2 * M1 * Vect)
  • T ist eine Übersetzung Vektor Verwendung jedes Pixel zu übersetzen.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top