JPEG Multiple Reload-Studie

VK hat eine Gruppe mit folgender Beschreibung:


Das gleiche Foto wird jeden Tag manuell auf einem Computer gespeichert und erneut hochgeladen, wodurch die QualitÀt allmÀhlich abnimmt.

Links ist das Originalbild, das am 7. Juni 2012 hochgeladen wurde, rechts ist es das, was es jetzt ist.


KDPV


Video

Dieser Unterschied ist sehr verdĂ€chtig. Versuchen wir herauszufinden, was in diesen 7 Jahren passiert ist. Zur Bekanntschaft gibt es auf Medusa einen Artikel ĂŒber diese Gruppe, aber nur die technische Seite wird uns interessieren.


Warum und zu welchem ​​Zeitpunkt komprimiert JPEG mit Verlusten


Betrachten Sie ein stark vereinfachtes JPEG-Codierungs- und Decodierungsschema. Es werden nur die Operationen gezeigt, die die Grundprinzipien des JPEG-Algorithmus veranschaulichen.


JPEG-Prinzipien


Also 4 Operationen:


  • DCT ist eine diskrete Cosinustransformation.
  • Quantisierung - Rundung jedes Werts auf das nĂ€chste Vielfache des Quantisierungsschritts: y = [x / h] * h, wobei h der Schritt ist.
  • IDCT ist die inverse diskrete Cosinustransformation.
  • Rundung ist normale Rundung. Diese Phase konnte im Diagramm nicht dargestellt werden, da dies offensichtlich ist. Aber dann wird seine Bedeutung demonstriert.

Die grĂŒne Farbe zeigt Operationen an, bei denen alle Informationen gespeichert werden (ohne Verluste bei der Arbeit mit Gleitkommazahlen zu berĂŒcksichtigen), die rosa verlieren. Das heißt, Verluste und Artefakte treten nicht aufgrund der Kosinustransformation auf, sondern aufgrund der einfachen Quantisierung. Der Artikel wird keine wichtige Phase berĂŒcksichtigen - die Huffman-Codierung, da sie ohne Verlust ausgefĂŒhrt wird.


Betrachten Sie diese Schritte genauer.


DCT


Da es fĂŒr alle FĂ€lle verschiedene DCT-Varianten gibt, möchte ich klarstellen, dass JPEG einen zweiten DCT-Typ mit Normalisierung verwendet. Bei der Codierung wird jedes Bild in 8 x 8 Quadrate (fĂŒr jeden Kanal) unterteilt. Jedes solche Quadrat kann als 64-dimensionaler Vektor dargestellt werden. Die Kosinustransformation besteht darin, die Koordinaten dieses Vektors auf einer anderen orthonormalen Basis zu finden. Es ist schwierig, den 64-dimensionalen Raum zu visualisieren, daher werden im Folgenden zweidimensionale Analogien angegeben. Sie können sich vorstellen, dass das Bild in 2x1 Blöcke unterteilt ist. In den unten gezeigten Diagrammen entspricht die x-Achse den Werten des ersten Pixels des Blocks, die y-Achse dem zweiten.


Wenn Sie die Analogie mit einem bestimmten Beispiel fortsetzen, nehmen Sie an, dass die Werte von zwei Pixeln aus dem Originalbild 3 und 4 sind. Zeichnen Sie den Vektor (3, 4) auf der Originalbasis, wie in der folgenden Abbildung gezeigt. Die ursprĂŒngliche Basis ist blau markiert. Die Koordinaten des Vektors in einer neuen Basis sind (4.8, 1.4).


Ein Beispiel fĂŒr eine Vektortransformation auf einer neuen Basis


Im betrachteten Beispiel wurde zufĂ€llig eine neue Basis ausgewĂ€hlt. DCT bietet eine sehr spezifische 64-dimensionale feste Basis. Die BegrĂŒndung, warum es in JPEG verwendet wird, ist sehr interessant und wurde von mir in einem anderen Artikel beschrieben . Wir werden nur auf das Wesentliche eingehen. Im Allgemeinen sind die Werte aller Pixel Ă€quivalent. Wenn wir sie jedoch mit DCT konvertieren, können wir aus den resultierenden 64 Koordinaten auf einer neuen Basis (als DCT-Transformationskoeffizienten bezeichnet) einige von ihnen mit minimalen Verlusten sicher auf Null setzen oder grob abrunden. Dies ist dank der Funktionen komprimierbarer Bilder möglich.


Quantisierung


Bruchwerte können nicht in einer Datei gespeichert werden. Daher werden abhÀngig vom Quantisierungsschritt die Werte 4.8, 1.4 wie folgt gespeichert:


  • in Schritt 1 (die sanfteste Option): 5 und 1,
  • in Schritt 2: 4 und 2
  • in Schritt 3: 6 und 0.

Normalerweise wird der Schritt fĂŒr jeden Wert unterschiedlich gewĂ€hlt. Eine JPEG-Datei verfĂŒgt ĂŒber mindestens ein Array, eine sogenannte Quantisierungstabelle, in der 64 Quantisierungsschritte gespeichert sind. Diese Tabelle hĂ€ngt von der in einem Grafikeditor festgelegten KomprimierungsqualitĂ€t ab.


IDCT


Wie DCT, jedoch transponiert. Mathematisch ist x = IDCT (DCT (x)). Wenn es also keine Quantisierung gĂ€be, wĂ€re es möglich, sich ohne Verlust zu erholen. Aber es wĂŒrde keine Komprimierung geben. Aufgrund der Verwendung der Quantisierung kann der ursprĂŒngliche Vektor nicht immer genau berechnet werden. Die folgende Abbildung zeigt 2 Beispiele mit genauer und ungenauer Wiederherstellung. Das schrĂ€ge Gitter entspricht einer neuen Basis, die gerade Linie der ursprĂŒnglichen.


2 Beispiele mit genauer und ungenauer Vektorrekonstruktion


Die offensichtliche Frage stellt sich: Kann eine Sequenz der Transcodierung zu einem Vektor fĂŒhren, der sich stark vom Original unterscheidet? Vielleicht.


Vektor-Transcodierungssequenz


Es wĂ€re interessant, alle ganzzahligen Vektoren zu sortieren und zu sehen, wozu ihre Transcodierung fĂŒhren wird. Um das Informationsrauschen zu reduzieren, entfernen wir das Gitter der Anfangsbasis und verbinden die ursprĂŒnglichen und rekonstruierten Vektoren (ohne Zwischenschritt) direkt durch Segmente. Betrachten Sie zunĂ€chst einen Quantisierungsschritt gleich 1 fĂŒr alle Koordinaten. Die neue Basis in der folgenden Abbildung ist um 45 Grad gedreht, und dafĂŒr haben wir 17,1% der ungenauen Wiederherstellungen. Die Farben der Segmente bedeuten nichts, aber sie sind nĂŒtzlich, um ihre visuelle Verschmelzung zu verhindern.


AufzĂ€hlung von Vektoren fĂŒr eine neue Basis bei 45 Grad


Diese Basis ist 10,3 Grad mit 7,4% ungenauen Wiederfindungsraten:


AufzĂ€hlung von Vektoren fĂŒr eine neue Basis bei 10,3 Grad


In der NĂ€he:


AufzĂ€hlung von Vektoren fĂŒr eine neue Basis bei 10,3 Grad in der NĂ€he


Und dieser liegt bei 10,4 von 6,4%:


AufzĂ€hlung von Vektoren fĂŒr eine neue Basis bei 10,4 Grad


19 Grad von 12,5%:


AufzĂ€hlung von Vektoren fĂŒr eine neue Basis bei 19 Grad


Wenn Sie jedoch den Quantisierungsschritt grĂ¶ĂŸer als 1 einstellen, konzentrieren sich die rekonstruierten Vektoren deutlich in der NĂ€he der Gitterknoten. Dies ist Schritt 5:


Schritt 5


Dies ist 2:


Schritt 2


Wenn Sie das Bild mehrmals, jedoch mit derselben Tonhöhe, neu codieren, geschieht im Vergleich zu einer einzelnen Neukodierung fast nichts. Die Werte scheinen in den Knoten des Gitters "stecken zu bleiben" und können von dort nicht mehr zu anderen Knoten "springen". Wenn der Schritt anders ist, „springt“ der Vektor von einem Gitterknoten zum anderen. Das kann ihn ĂŒberall hin bringen. Die folgende Abbildung zeigt das Ergebnis von 4 Transcodierungen mit den Schritten 1, 2, 3, 4. Mit Schritt 12 sehen Sie ein großes Raster. Dieser Wert ist das kleinste gemeinsame Vielfache von 1, 2, 3, 4.


Ergebnis von 4 Rekodierungen mit den Schritten 1, 2, 3, 4


Und dazu - mit Schritten von 1 bis 7. Die Visualisierung wird nur fĂŒr einen Teil der ursprĂŒnglichen Vektoren angezeigt, um die Visualisierung zu verbessern.


4 Umcodierung fĂŒhrt zu Schritten von 1 bis 4


Rundung


Warum Werte nach IDCT abrunden? Wenn Sie diese Phase loswerden, wird das wiederhergestellte Bild durch Bruchwerte dargestellt, und wir verlieren beim Neucodieren nichts. Aus mathematischer Sicht werden wir einfach ohne Verlust von einer Basis zur anderen wechseln. Hier ist die Umwandlung von FarbrĂ€umen zu erwĂ€hnen. Obwohl JPEG den Farbraum nicht reguliert und es Ihnen ermöglicht, direkt im Quell-RGB zu speichern, wird in den allermeisten FĂ€llen die vorlĂ€ufige Konvertierung in YCbCr verwendet. Augenmerkmale und all das. Und eine solche Umwandlung fĂŒhrt auch zu Verlusten.


Angenommen, wir erhalten eine JPEG-Datei, die mit maximaler QualitĂ€t komprimiert ist, dh mit einem Quantisierungsschritt von 1 fĂŒr alle Koeffizienten. Wir wissen nicht, welcher Codec verwendet wurde, aber normalerweise fĂŒhren Codecs nach der RGB -> YCbCr-Konvertierung eine Rundung durch. Da die QualitĂ€t maximal ist, erhalten wir nach IDCT gebrochene, aber ziemlich nahe an den ursprĂŒnglichen Werten im YCbCr-Raum liegende Werte. Wenn wir runden, werden die meisten von ihnen genau wiederhergestellt.


Wenn sie jedoch nicht gerundet sind, kann die YCbCr -> RGB-Konvertierung sie aufgrund der geringen Unterschiede noch weiter von den ursprĂŒnglichen Werten entfernen. Mit der anschließenden Transcodierung wird die LĂŒcke immer grĂ¶ĂŸer. Um diesen Prozess irgendwie zu visualisieren, verwenden wir die Hauptkomponentenmethode, um 64-dimensionale Vektoren auf eine Ebene zu projizieren. Dann erhalten wir fĂŒr 1000 Transcodes ungefĂ€hr die folgende Folge von Änderungen:


Änderungen ohne Rundung


Die absoluten Werte der Achsen sind hier nicht sehr sinnvoll, aber die relative Bedeutung der Verzerrungen kann verwendet werden.


Beispiele fĂŒr mehrere Transcodierungen


Quellkatze:


Quellkatze


Nach einer Konservierung mit QualitÀt 50:


Originalkatze nach einmaliger Konservierung mit QualitÀt 50


Nach einer nachfolgenden Anzahl von Transcodes mit derselben QualitÀt Àndert sich das Bild nicht. Jetzt werden wir die QualitÀt schrittweise von 90 auf 50 in 1 reduzieren:


AllmÀhliche QualitÀtsminderung von 90 auf 50 in 1


In der folgenden Tabelle ist ungefÀhr dasselbe passiert:


4 Umcodierung fĂŒhrt zu Schritten von 1 bis 4


Nach einer Konservierung mit QualitÀt 20:


Nach einer Konservierung mit QualitÀt 20


Nahtlos von 90 bis 20:


AllmÀhlicher QualitÀtsverlust von 90 auf 20


Jetzt 1000 mal mit zufÀlliger QualitÀt von 80 bis 90:


1000 Re-Stores mit zufÀlliger QualitÀt von 80 bis 90


10.000 Mal:


10.000 Filialen mit zufÀlliger QualitÀt von 80 bis 90


VK Group Bilderanalyse


Beginnen wir mit der Analyse von mehr als 2000 Bildern aus der VK-Gruppe. ÜberprĂŒfen Sie zunĂ€chst die durchschnittliche absolute Abweichung vom ersten. Die x-Achse ist die Bildnummer (oder der Tag), die y-Achse ist die Abweichung.


Die durchschnittliche absolute Abweichung von der ersten


Fahren wir mit dem Differentialdiagramm fort, das die durchschnittliche absolute Abweichung der benachbarten Bilder zeigt.


Die durchschnittliche absolute Abweichung benachbarter Bilder


Kleine Schwankungen am Anfang sind normal. Bis zum 232. lĂ€uft alles gut, die Bilder sind völlig identisch. Und der 233. unterscheidet sich plötzlich um durchschnittlich 1,23 fĂŒr jedes Pixel (auf einer Skala von 0 bis 255). Das ist viel. Vielleicht haben sich die Quantisierungstabellen gerade geĂ€ndert. Schau es dir an. Gleichzeitig ist es mit der GrĂ¶ĂŸe der empfangenen Dateien vergleichbar.


QualitÀtsÀnderungen


Ja, die Tabellen haben sich geĂ€ndert. Aber nicht frĂŒher als in den 700ern. Dann trat möglicherweise eine versteckte Zwischen-Transcodierung mit geringer QualitĂ€t auf. Versuchen wir, den 232. zweimal neu zu codieren. Zum ersten Mal werden wir verschiedene QualitĂ€tsstufen durchlaufen, und zum zweiten Mal verwenden wir dieselbe Quantisierungstabelle wie fĂŒr alle vom 1. bis zum 700er. Unser Ziel ist es, das Bild so Ă€hnlich wie möglich zum 233. zu machen. In der folgenden Abbildung ist entlang der x-Achse die QualitĂ€t der Zwischentranscodierung angegeben, entlang y ist die durchschnittliche absolute Abweichung von der 233 ..


Versteckte Transcodierung hinzufĂŒgen


Es gibt zwar einen Fehler im Diagramm mit einer QualitĂ€t von 75%, ungefĂ€hr gleich 1, aber immer noch weit von der gewĂŒnschten Null entfernt. Das HinzufĂŒgen der 2. Zwischenstufe und das Ändern der Parameter der Unterabtastung verbesserte die Situation nicht.


Bei den restlichen Bildern ist alles ungefĂ€hr gleich, und die Änderung in den Quantisierungstabellen wird ebenfalls ĂŒberlagert. Das heißt, irgendwann Ă€ndert sich das Bild dramatisch, dann stabilisiert es sich in wenigen Tagen, aber nur bis ein neuer Anstieg auftritt. Möglicherweise Ă€ndert sich das Image selbst auf den Servern. Ich kann die Beteiligung des Gruppenadministrators nicht vollstĂ€ndig ausschließen.


Leider habe ich nicht herausgefunden, was wirklich mit dem Bild passiert ist. Zumindest bin ich mir jetzt sicher, dass es nicht nur eine Erhaltung war. Vor allem aber wurde es besser, die laufenden Prozesse wÀhrend des Codierens und Decodierens darzustellen. Hoffe du auch.


Archiv mit Bildern fĂŒr unabhĂ€ngige Recherchen.

Source: https://habr.com/ru/post/de473544/


All Articles