mattdm " diese Unschärfe ist weitgehend reversibel, wenn Sie genau das Gleiche in umgekehrter Reihenfolge tun" warf die Frage in meinem Kopf auf. Die Drehung ist eine geometrische Transformation des Bildes, die aus einer räumlichen Transformation der Koordinaten und einer Intensitätsinterpolation besteht. Wenn die Drehung kein Vielfaches von 90 Grad ist, spielt der Interpolationsalgorithmus eine entscheidende Rolle.
In solchen Fällen ist die Operation verlustbehaftet, wenn wir einen Mittelungsinterpolationsalgorithmus (z. B. bikubisch) verwenden. sup>. Aber können wir stattdessen einen anderen Ansatz verwenden (z. B. die nächste Neighbor-Interpolation) und unser gedrehtes Bild "nicht gedreht" haben?
(*) Es ist nur mein Gefühl (ich kann es immer noch nicht unterstützen) mit einem mathematischen Beweis): Da wir nicht sicher wissen können, welches Pixel zu welchem Wert beigetragen hat, können wir die Mittelung nicht umkehren. Ich bin jedoch nicht sicher, ob wir keine probabilistischen Methoden verwenden können, um die ursprünglichen Werte genau zu schätzen. Sub>
Obwohl mir die erforderlichen mathematischen Fähigkeiten fehlen, habe ich selbst einige Tests durchgeführt (mit Gimp) ), aber nach dem Antirotieren unterscheiden sich die Bilder:
Test 1
Abbildung 1 b> - Quellbild (256 x 256)
Abbildung 2 b> - Von links nach rechts: a) Bild um 9,5 Grad im Uhrzeigersinn gedreht; b) Bild erneut um 9,5 Grad gegen den Uhrzeigersinn gedreht; und c) Unterschied zwischen Bildern. Für diese Operationen habe ich die Interpolation nächster Nachbar verwendet. Die Bilder werden nach den Vorgängen verkleinert, um besser zu diesem Website-Layout zu passen.
Abbildung 3 b> - Von links nach rechts: a) Bild um 9,5 Grad im Uhrzeigersinn gedreht; b) Bild erneut um 9,5 Grad gegen den Uhrzeigersinn gedreht; und c) Unterschied zwischen Bildern. Für diese Operationen habe ich bikubische Interpolation verwendet. Die Bilder werden nach den Vorgängen verkleinert, um besser zu diesem Website-Layout zu passen.
Test 2
Nach dem Vorschlag von @ unapiedra habe ich einen einfacheren Test durchgeführt: Drehen einer 2x2-Matrix. Dieser Fall ist uninteressant, da je nach Winkel entweder alle Zellen um den gleichen Winkel gedreht werden oder keine Zelle gedreht wird. Das heißt, die Drehung ist immer verlustfrei.
Also habe ich es erneut mit einer 3x3-Matrix und einer 30-Grad-Drehung versucht:
Abbildung 4 - Von links nach rechts: a) Quellbild; b) Bild um 30 Grad im Uhrzeigersinn gedreht; c) Bild um 30 Grad gegen den Uhrzeigersinn gedreht; d) Unterschied. Die Bilder werden auf diese Website hochskaliert.
In diesem Fall sind die Unterschiede offensichtlich. Die Rotation ist eindeutig verlustbehaftet ... Aber was passiert, wenn ich vor der Rotation hochskaliere?
Test 3
Abbildung 5 - Von links nach rechts: a) Quellbild; b) Bild um einen 6-fachen Faktor hochskaliert; c) hochskaliertes Bild um 30 Grad im Uhrzeigersinn gedreht; d) Bild um 30 Grad gegen den Uhrzeigersinn gedreht; e) verkleinertes transformiertes Bild; und f) Unterschied (kein Unterschied). Die Bilder werden auf diese Website hochskaliert.
In diesem Fall skaliere ich um den 6-fachen Faktor. Begründung für die Auswahl dieses Faktors (leider falsch, wie ich anhand eines Gegenbeispiels gesehen habe):
Ein um 30 Grad gedrehtes Pixel hat die Koordinaten unten links nach oben rechts: [0,0] - [0,3660 1,3660]. Das heißt, die kürzeste projizierte Seite hat eine Länge von 0,36 Pixel. Das Abtasttheorem erfordert, dass wir mit einer doppelten Rate abtasten.
Um ein um 30 Grad gedrehtes Bild genau abzutasten, muss ich jeweils 0,17 Pixel abtasten, was eine Größenänderung von 5,88 ergibt Faktor; 3 x 5,88 = 17,64, daher setze ich das Quellbild auf ein 18x18-Bild um.