Ich möchte ein nicht-quadratisches Bild mit Matlab drehen:
imrotate
-Funktion zu verwenden, da sie Teil der Image Processing Toolbox ist, loose
, was bedeutet, dass die Größe der Ausgabe von der Größe des Eingabebildes abweicht, 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:
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:
interp2
auf dem aufgefüllten Bild, 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:
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% 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%Tags und Links matlab image-rotation