Frage:
Ist Rotation eine intrinsische verlustbehaftete Operation (für Winkel, die nicht ein Vielfaches von 90 Grad sind)?
Alberto
2013-08-23 19:48:30 UTC
view on stackexchange narkive permalink
Die Aussage von

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

source image

Abbildung 1 b> - Quellbild (256 x 256)

NN Rotated 9,5 degrees, rotated -9,5 degrees, difference

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.

bicubic Rotated 9,5 degrees, rotated -9,5 degrees, difference 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:

rotating a 3x3 matrix without scaling

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

rotating a previously upscaled 3x3 matrix

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.

Die Frage "[Sind" Windows Photo Viewer "-Rotationen verlustfrei?] (Http://photo.stackexchange.com/questions/12361/are-windows-photo-viewer-rotations-lossless)" behandelte dieses Thema für eine bestimmte Software. für Winkelrotationen um ein Vielfaches von 90 Grad.
Fünf antworten:
Szabolcs
2013-08-23 23:50:35 UTC
view on stackexchange narkive permalink

Die Bilddrehung ist eine verlustbehaftete Operation, aber das einmalige Drehen eines Bildes und das anschließende Zurückdrehen verlieren wahrscheinlich nur sehr wenig Details, insbesondere im Vergleich zur typischen JPEG-Komprimierung.


Die Bilddrehung funktioniert mathematisch wie folgt:

Ein Graustufenbild besteht aus Luminanzwerten L_ (x, y) an ganzzahligen Pixelpositionen x, y . Zunächst wird eine Realargumentfunktion f (x, y) konstruiert, die die Werte L_ (x, y) am gleichen x, y code reproduziert > Positionen, gibt aber auch Werte bei nicht ganzzahligen x, y an. Daher wird zwischen ganzzahligen x-, y -Positionen interpoliert (hier kommen Interpolationsmethoden ins Spiel - es gibt mehrere mögliche Auswahlmöglichkeiten für f (x, y) ).

Dann konstruiere eine gedrehte Version g (x, y) = f (x cos (a) - y sin (a), x sin (a) + y cos (a)) nach Winkel a . Diese Operation ist mathematisch verlustfrei und berücksichtigt nicht die numerischen Rundungsfehler, wenn die Berechnung auf einem Computer mit endlicher Genauigkeit durchgeführt wird.

Schließlich werden g (x, y) -Werte bei ganzzahligem x, y positioniert sich erneut, um ein Bild zu erstellen.


An dieser Stelle können Sie fragen: Warum ist das verlustbehaftet? Können wir nicht einfach alle diese Berechnungen umkehren, um den ursprünglichen nicht gedrehten L_ (x, y) zu rekonstruieren, wenn wir wissen, mit welcher Interpolationsmethode f konstruiert wurde? P. >

Theoretisch ist das möglich, aber das passiert nicht, wenn Sie den gleichen Winkel in die entgegengesetzte Richtung drehen. Anstatt die ursprünglichen Rotationsoperationen genau umzukehren, wird eine Rotation mit entgegengesetztem Vorzeichen unter Verwendung derselben Operationssequenz durchgeführt, die bei der anfänglichen Rotation verwendet wurde. Das rückwärts gedrehte Bild ist nicht genau das gleiche wie das Original.

Wenn die Werte von g (x, y) auf eine geringe Genauigkeit gerundet wurden (8-) Bit, 0..255) ist der Informationsverlust sogar noch größer.


Viele akkumulierte Rotationen verwischen das Bild effektiv. Hier ist ein Beispiel für das 30-malige Drehen eines 500 x 500 Pixel großen Lena-Bilds um 12 Grad, was einer vollständigen 360-Grad-Drehung entspricht:

enter image description here


Es gibt noch einen weiteren Grund dafür Unschärfeoperationen sind verlustbehaftet. Man könnte naiv denken, dass das mathematische Umkehren einer Unschärfe uns das ursprüngliche unscharfe Bild zurückgeben sollte. Dies gilt theoretisch, solange wir mit unendlicher Präzision arbeiten. Das Verfahren wird als Entfaltung bezeichnet und wird in der Praxis verwendet, um Bilder zu schärfen, die aufgrund von Bewegungsunschärfe oder optischen Gründen verschwommen sind.

Es gibt jedoch einen Haken: Unschärfe ist unempfindlich gegenüber kleine Änderungen im Quellbild. Wenn Sie zwei ähnliche Bilder verwischen, erhalten Sie noch ähnlichere Ergebnisse. Das Entschärfen reagiert sehr empfindlich auf kleine Änderungen: Wenn Sie zwei nur geringfügig unterschiedliche Bilder unscharf machen, erhalten Sie zwei sehr unterschiedliche Ergebnisse. Wir arbeiten normalerweise nicht mit hoher Genauigkeit (8 Bit ist eigentlich eine ziemlich niedrige Genauigkeit), und die Rundungsfehler werden vergrößert, wenn versucht wird, eine Unschärfe umzukehren.

Dies ist der Grund, warum Unschärfe "irreversibel" ist und warum es Details verliert.

Warum redest du über Unschärfe?
@Michael Es ist ein wichtiger Punkt, warum diese Arten von Operationen nicht reversibel sind, obwohl sie mathematisch reversibel aussehen. Mein Punkt ist, dass es nicht nur um das Vorhandensein von Rundungsfehlern geht, sondern dass diese Fehler häufig verstärkt werden, wenn versucht wird, die Operationen umzukehren.
Dies liegt auch daran, dass die Bildgröße endlich ist und wichtige Daten verloren gehen (im Fall der Faltung).
"Anstatt die ursprünglichen Rotationsoperationen genau umzukehren, wird eine Rotation mit entgegengesetztem Vorzeichen unter Verwendung der gleichen Abfolge von Operationen durchgeführt, die bei der anfänglichen Rotation verwendet wurde" - ich denke, dies ist die Antwort, nach der ich gesucht habe. Ich akzeptiere Ihre Antwort noch nicht, weil ich Mathe spiele (versuche einen Skalierungsfaktor zu finden, wie ich in einigen anderen Kommentaren erwähnt habe).
Ich gebe die mathematischen Überlegungen auf, da ich nirgendwo hinkomme. Ich akzeptiere Ihre Antwort, weil sie die detaillierteste und überzeugendste ist.
Unapiedra
2013-08-23 20:38:47 UTC
view on stackexchange narkive permalink

Drehen ist im allgemeinen Kontext nicht verlustbehaftet, aber in Kombination mit Bildern.

Der Grund ist das Zusammenfassen von Pixelwerten. Wenn ein Bild gedreht wird, stimmt die Position der meisten Pixel nicht perfekt mit der Rasterstruktur des Bildes überein. Die Interpolation ist jetzt erforderlich, um zu entscheiden, wo der Wert dieses Pixels platziert werden soll.

Bei der Interpolation des nächsten Nachbarn wird der Pixelwert in die nächstgelegene Gitterzelle (Pixelposition) verschoben.

Bei der bikubischen Interpolation wirkt sich der Pixelwert auf alle nahe Gitterzellen in der Nähe aus. Im Wesentlichen wird der Wert auf die nahen Pixel verteilt.

Schön, dass die Drehung an sich nicht verlustbehaftet ist, sondern die Drehung einer Rasterausrichtung von Pixeln zu einer anderen. Während die meisten wahrscheinlich aus der Frage schließen werden, lohnt es sich noch hervorzuheben.
Wollen Sie damit sagen, dass die meisten den ersten Satz nicht lesen werden? "... aber in Kombination mit Bildern ist es [verlustbehaftet]".
Die detailliertere Antwort von szabolscs wird wahrscheinlich akzeptiert und ist etwas spezifischer.
Der tatsächliche Datenverlust tritt erst auf, wenn Sie das gedrehte Bild erneut rastern. Wenn Ihre Bildbearbeitungssoftware, die zwischengeschaltet ist, intern als Bild- und Rotationswert arbeitet, aber nur gerastert wird, um sie auf dem Bildschirm anzuzeigen, oder wenn sie explizit in einem Bitmap-basierten Format gespeichert wird, können Sie eine zweite Rotation von gleicher Größe, jedoch in entgegengesetzter Richtung und Richtung geben Drehen Sie die Drehung ohne Verlust rückgängig. (Achtung, ich weiß nicht, wie Photoshop / GIMP / etc-Projekte Ihre Daten speichern.)
@Unapiedra - nein, ich habe dir eine +1 gegeben, um darauf hinzuweisen.
@AJHenderson ah, tut mir leid, dass ich launisch bin
@DanNeely So macht es natürlich Lightroom. Das alte GIMP speichert es gerastert. Auf dem neuen GIMP mit der GEGL-Engine ist dies möglicherweise tatsächlich möglich.
Danke für deine Antwort. Dass die Mittelung Intensitätswerte verteilt, war mir klar. Deshalb dachte ich, eine verlustfreie Operation würde notwendigerweise eine nicht gemittelte Interpolationsstrategie implizieren. In Bezug auf das Binning sagt mir meine Intuition immer noch, dass eine angemessene Neuskalierung helfen sollte.
AJ Henderson
2013-08-23 20:14:24 UTC
view on stackexchange narkive permalink

Wenn Sie die Auflösung ausreichend erhöhen, sollten Sie sie meiner Meinung nach verlustfrei machen können, aber ich denke, sie müsste etwas größer sein. Sie müssten effektiv genug Pixel "ausfüllen", damit der Fehler unter dem Rundungsfehler der Umkehrung des Vorgangs und der Reduzierung der Auflösung auf das Original reduziert wird. An diesem Punkt können Sie das Originalbild jedoch genauso gut in einer verborgenen Bildebene speichern, da Sie wesentlich mehr Datenpunkte hinzufügen, als eine Kopie des Bildes benötigen würde.

Praktisch gesehen also muss verlustbehaftet sein, da es sich um Durchschnittswerte handelt, um neue Punkte zu erstellen, und im Allgemeinen mehr zusätzlichen Speicher benötigt, um ausreichend zu skalieren, als zum einfachen Speichern einer weiteren Kopie erforderlich wäre.

Ihre Idee ist richtig, kann aber nur für eine begrenzte Anzahl möglicher Umdrehungen funktionieren. Stellen Sie sich vor, Sie stellen Ihre Zwischenauflösung so ein, dass eine verlustfreie Drehung um 3,22 Grad erzielt wird. Drehen Sie jetzt um 3,23, Ihr Ergebnis würde Verluste anzeigen. Dies gilt im Allgemeinen, weil es unendlich viele Umdrehungen gibt, aber immer eine endliche Anzahl von Pixeln.
@Unapiedra - Ja, ehrlich gesagt, mir ist gerade eingefallen, dass es wahrscheinlich möglich sein sollte, Informationen zumindest in einigen zusätzlichen Fällen zu erhalten, indem die Auflösung erhöht und dann nach dem Zurückdrehen verringert wird, aber so oder so, da dies aufgrund der Menge von unpraktisch ist Zusätzliche Informationen, die gespeichert werden müssten, machte ich mir nicht die Mühe, einen Beweis dafür zu liefern, da es praktisch keinen Grund gab, dies jemals zu tun, anstatt das nicht gedrehte Bild zusätzlich zu dem gedrehten zu speichern.
"Wenn Sie die Auflösung ausreichend erhöhen [...]" - Dies ist genau meine Intuition: Es sollte möglich sein, einen Zoomfaktor für einen bestimmten Winkel zu finden, der eine verlustfreie Operation "Drehung und Antirotation" ermöglicht. Aber wie berechnet man diesen Faktor? Ich stimme der Beobachtung voll und ganz zu: "Es würde keinen Grund geben ...", aber ich beschäftige mich jetzt mit diesem Thema und diese Frage ist eher eine theoretische (gemäß "in medizinischen Anwendungen wäre es möglich, verlustfrei zu drehen" ein Bild, um es weiter zu verwandeln blahblah ')
Meine Intuition sagt mir, dass ich eine verlustfreie Rotation haben könnte, wenn ich das Quellbild mit einer Auflösung von zweimal neu abtastet ([Abtasttheorem] (http://en.wikipedia.org/wiki/Nyquist%E2%80%93Shannon_sampling_theorem) ) die kürzeste Projektion der Pixelkanten. Für die 9,5 ° -Drehung der Frage hätte beispielsweise ein gedrehtes Pixel mit Koordinaten von oben links nach unten rechts [0,0] - [1,1] die Koordinaten [0,0] - [0,82,1,15 ]. Das heißt, die kürzeste Kantenprojektion hat eine Länge von 0,82 Pixel. Ein erneutes Abtasten alle 0,41 Pixel sollte ausreichen. Das heißt, ein Zoomen um den Faktor 2,43 würde ausreichen.
Leider habe ich es in GIMP getestet und obwohl ich bessere Ergebnisse erzielt habe, ist die Operation immer noch nicht verlustfrei :-(
@Unapiedra "Ihre Idee ist richtig" ... In welchen Begriffen? Aus Ihrem Kommentar geht hervor, dass es möglich ist, eine bequeme Zwischenauflösung basierend auf dem Drehwinkel zu berechnen. Ich habe es versucht, aber wie im vorherigen Kommentar gestanden, ohne Erfolg.
@Alberto Ich würde vorschlagen, dass Sie es mit einem 2x2-Pixel-Bild und einem ungeraden Winkel (15,3 Grad) versuchen und skalieren, bis Sie eine Lösung finden. Sie können es auch theoretisch lösen (glaube ich), aber ich habe keine Zeit dafür.
@Unapiedra Guter Vorschlag. Ich habe es getestet (mit NN-Interpolation), aber die Operation ist immer verlustfrei. Entweder werden alle Zellen gedreht, oder wenn der Winkel zu klein ist, wird überhaupt keine Zelle gedreht. Es gibt keine Rotation, die nur wenige Zellen ändern kann. Dies bekräftigt meine Intuition, dass es eine Charakterisierung für verlustfreie Rotationen geben muss, die mit einem Skalierungsfaktor verbunden sind ... Vielleicht sind verlustfreie Rotationen nur für einige Winkel möglich?
Ich würde vorschlagen, auf math.stackexchange.com zu fragen.
Michael Nielsen
2013-08-23 22:47:33 UTC
view on stackexchange narkive permalink

AJs Theorie zur Erhöhung der Auflösung ist richtig. Das Problem ist die relative Größe der Zellen (Pixel) zu den Details, die wir erkennen können. Je größer die Zellen sind, desto mehr müssen wir die Ergebnisse in Behälter schieben. Hier drehe ich mit bikubischer Interpolation mit +10 und -10 und vergleiche mit abs (I1-I2). Zweitens mache ich eine Lanczos-Größenänderung x10, drehe mit bikubischer Interpolation mit +10 und -10 und verkleinere sie wieder auf die ursprüngliche Größe und vergleiche sie mit abs (I1-I2).

Resize effect

Ein signifikanter Unterschied in der Fehlerverteilung:

Stats

Also zwei Fragen: 1) Kann ein gegebener Drehwinkel einen Größenänderungsfaktor berechnen? und 2) führt die Interpolation nicht zu Fehlern, dh wäre es nicht besser, die Größe zu ändern und mit dem nächsten Nachbarn zu drehen?
NN ist am schlechtesten für die Anwendung mehrerer Transformationen.
Throwback1986
2013-08-24 01:02:18 UTC
view on stackexchange narkive permalink

Die Drehung in "nicht kardinale" Winkel ist aufgrund der endlichen Genauigkeit der Gleitkommazahlen (und Methoden), die bei der Durchführung der Drehung verwendet werden, immer verlustbehaftet.

Beachten Sie, dass "verlustbehaftet" dies nicht tut immer gleichbedeutend mit "merklich verlustbehaftet".

* "Beachten Sie, dass" verlustbehaftet "nicht immer gleichbedeutend mit" merklich verlustbehaftet "ist." * Und wir haben den Kreis zu meinem ursprünglichen Punkt geschlossen - das Drehen eines Bildes verliert zwar Informationen, reicht aber im Allgemeinen nicht aus, um wahrnehmbar zu sein.


Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 3.0-Lizenz, unter der er vertrieben wird.
Loading...