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.

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.

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).

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.

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

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.

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

In der NĂ€he:

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

19 Grad von 12,5%:

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:

Dies ist 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.

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.

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:

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:

Nach einer 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:

In der folgenden Tabelle ist ungefÀhr dasselbe passiert:

Nach einer Konservierung mit QualitÀt 20:

Nahtlos von 90 bis 20:

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

10.000 Mal:

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.

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

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.

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 ..

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.