Ein Bild ohne die Bildverarbeitungs-Toolbox drehen

8

Ich möchte ein nicht-quadratisches Bild mit Matlab drehen:

  • ohne die imrotate -Funktion zu verwenden, da sie Teil der Image Processing Toolbox ist,
  • mit dem Parameter loose , was bedeutet, dass die Größe der Ausgabe von der Größe des Eingabebildes abweicht,
  • und mit einer nicht zu langsamen Funktion im Vergleich zu imrotate .

Ich habe bereits eine Funktion gefunden, um dies zu tun (nur Ersetzen Sie imshow und bestblk durch Ihre eigenen Funktionen, um die Toolbox nicht zu verwenden, aber für große Bilder ist wirklich langsam . Mein Ansatz würde versuchen, Schleifen zu vermeiden und so viel wie möglich auf interp2 zu setzen.

Die Signatur der Funktion wäre:

imOutput = my_imrotate(imInput, theta_degres, interpolation, bbox)

wo:

  • interpolation wäre bilinear , bicubic oder nearest ,
  • bbox wäre crop oder loose .

Zuschneiden

Ich habe bereits ein gutes Ergebnis mit dem Parameter crop , aber ich kann den Offset für den Parameter loose nicht finden.

Hier ist der Code für den Parameter crop , wobei Z die Eingabe und Zi die Ausgabe ist:

%Vor%

Loose

Meine Idee ist es, die Größe eines Rahmens zu berechnen, der sowohl das Originalbild als auch das gedrehte Bild enthält, und dann:

  1. Füllen Sie das Originalbild auf, um ein Bild zu erhalten, dessen Größe der Größe des Rahmens entspricht,
  2. Verwende interp2 auf dem aufgefüllten Bild,
  3. Beschneiden Sie das resultierende Bild, um das gedrehte Bild ohne die Überreste des Padding zu haben.

Um die Größe des gedrehten Bildes mit dem Parameter loose zu erhalten, berechne ich rotation_matrix und rufe rotate_points für die Koordinaten der Ecken p des Eingabebildes auf:

%Vor%

Jede Hilfe würde sehr geschätzt werden.

Bearbeiten: Mit der Lösung in der Antwort unten und dem folgenden Code scheint es richtig zu funktionieren:

%Vor%     
Wok 15.06.2011, 10:23
quelle

1 Antwort

4

Für die loose Version müssen Sie nur herausfinden, wieviel Padding Sie benötigen. Sie können es leicht mit ein wenig Geometrie schätzen:

Wenn Sie das "lose" Rechteck zeichnen, fügen Sie dem ursprünglichen Rechteck im Wesentlichen vier rechtwinklige Dreiecke hinzu. Die Hypotenuse der Dreiecke sind die Seiten des Rechtecks. Wenn Sie die anderen beiden Seiten bestimmen können, können Sie einfach die Länge der neuen Seiten und damit die Polsterung berechnen. Glücklicherweise ist einer der Winkel des rechten Dreiecks genau Ihr Drehwinkel.

Wie sich herausstellt, müssen Sie das Padding nicht einmal explizit berechnen - Sie erstellen einfach ein größeres Array Xi, Yi, das die Größe des "losen" Bildes hat.

Also:

%Vor%     
Jonas 15.06.2011, 12:14
quelle

Tags und Links