Siehe auch: Warum funktioniert mein Bildrotationsalgorithmus nicht?
Diese Frage ist nicht sprachspezifisch und ist ein mathematisches Problem. Ich werde jedoch etwas C ++ - Code verwenden, um zu erklären, was ich brauche, da mir Mathe nicht zu heiß ist.
So wird das Bild zusammengesetzt:
%Vor%Hier ist der Prototyp für die Funktion, die ich erstellen möchte:
%Vor%Ich möchte nur die ersten beiden Indizes (Zeilen und Spalten) drehen, aber nicht den Kanal.
Der übliche Weg, dies zu lösen, ist, es rückwärts zu machen. Statt zu berechnen, wo jedes Pixel im Eingabebild im Ausgabebild landet, berechnen Sie, wo sich jedes Pixel im Ausgabebild im Eingabebild befindet (durch Drehung um den gleichen Betrag in der anderen Richtung ). Auf diese Weise können Sie sicher sein, dass alle Pixel im Ausgabebild einen Wert haben.
%Vor%Es gibt verschiedene Möglichkeiten für die Interpolation. Für die Formel der Rotation sollten Sie Ссылка
überprüfenAber nur um nett zu sein, hier ist es (Drehung von Punkt (x, y) Winkel Grad / Bogenmaß):
%Vor%Beachten Sie, dass es außer Rotationsmatrizen eine andere Lösung gibt, bei der Bildinformationen durch Aliasing nicht verloren gehen. Sie können die 2D-Bilddrehung in Schieflagen und Skalierungen aufteilen, wodurch die Bildqualität erhalten bleibt.
>Um ein Bild zu drehen, erstellen Sie 3 Punkte:
%Vor%und drehen Sie das um A. Um das neue gedrehte Bild zu erhalten, machen Sie das:
Das hört sich kompliziert an, ist es aber nicht. Bitte sieh dir diesen C # -Code an, den ich vor einiger Zeit geschrieben habe: rotoZoomer von mir
Beim Zeichnen verändere ich die Quellzeiger etwas, um einen gummiartigen Effekt zu erhalten. Wenn Sie dies jedoch deaktivieren, wird der Code ohne Probleme rotieren. Bei einigen Winkeln erhalten Sie natürlich ein Bild, das leicht verzerrt aussieht. Der Quellcode enthält Kommentare, was passiert, so dass Sie in der Lage sein sollten, die Mathematik / Logik dahinter einfach zu verstehen.
Wenn Sie Java besser mögen, habe ich auch einmal, vor etwa 14 Jahren, eine Java-Version erstellt;) - & gt; Ссылка
Es scheint, als ob das von Ihnen bereitgestellte Beispiel ein Kantenerkennungskern ist. Wenn Sie also Kanten unterschiedlicher Winkel erkennen möchten, wählen Sie lieber eine stetige Funktion (die in Ihrem Fall ein parametrisierter Gauss von x1 multipliziert mit x2 sein könnte) und drehen Sie sie dann nach den von kigurai vorgegebenen Formeln. Dadurch könnten Sie einen Diskrete-Kernel effizienter und ohne Aliasing erzeugen.
Tags und Links math image-processing