Wie drehe ich ein Bild?

7
  

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.

    
Nick Bolton 29.03.2009, 18:21
quelle

4 Antworten

26

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üfen

Aber nur um nett zu sein, hier ist es (Drehung von Punkt (x, y) Winkel Grad / Bogenmaß):

%Vor%     
Hannes Ovrén 29.03.2009, 18:48
quelle
2

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.

>

Hier ist eine einfachere Erklärung

    
heeen 05.04.2009 18:11
quelle
2

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:

  • Drehen Sie ABC um A in 2D, das ist also eine einzelne Euler-Rotation
  • traversieren im gedrehten Zustand von A nach B. Für jedes Pixel traversieren Sie auch von links nach rechts über die horizontale Linie im Originalbild. Wenn das Bild also ein Bild mit der Breite 100, der Höhe 50 ist, durchlaufen Sie in 100 Schritten von A nach B und in 50 Schritten von A nach C, wobei Sie in dem von ABC in ihrem gedrehten Zustand gebildeten Bereich 50 Linien von 100 Pixeln zeichnen .

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; Ссылка

    
Frans Bouma 08.04.2009 08:35
quelle
0

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.

    
Maleev 08.04.2009 06:40
quelle

Tags und Links