Ich habe jahrelang geglaubt, dass das wiederholte Komprimieren von JPEG-Dateien die Qualität allmählich verschlechtern würde, bis sie nicht mehr wiederzuerkennen sind, wie dies beim Erstellen von Fotokopien der Fall ist. Dies ist intuitiv sinnvoll, da JPEG ein verlustbehaftetes Format ist. Es gibt auch andere Q & As, die behaupten, dass dies so ist:
Welche Bildqualität geht beim erneuten Speichern eines JPEG-Bildes in MS Paint verloren?
Verringert das einfache Öffnen und Schließen einer JPEG-Datei die Bildqualität?
Ich habe jedoch auch gelesen, dass das erneute Komprimieren von JPEGs mit derselben Qualitätsstufe die Bildqualität nicht beeinträchtigt. Dies läuft der an anderer Stelle beschriebenen allmählichen Verschlechterung zuwider.
Was passiert technisch , wenn ein JPEG erneut komprimiert wird? Was geht verloren und wie? Verwandelt sich das Bild wirklich in das schneebedeckte Chaos, das früher im Fernsehen zu sehen war? Was ist mit diesen Videos, die Bilder zeigen, die nach mehrmaliger Neukomprimierung auseinanderfallen?
(Bitte winken Sie nicht nur mit der Hand und appellieren Sie an das allgemeine Konzept der Verlusthaftigkeit.)
(Diese Frage und die Antworten , die es so weit angezogen hat, den Schwerpunkt auf den technischen Faktoren (spezifische Einstellungen und Bildmanipulationen) , die Ursache oder Bildverschlechterung zu verhindern , wenn eine JPEG - Datei erneut komprimiert wird mehrere Male.)
quelle
Antworten:
Fast alle Bildqualitätsverluste treten auf, wenn ein Bild zum ersten Mal als JPEG komprimiert wird. Unabhängig davon, wie oft ein JPEG mit denselben Einstellungen erneut komprimiert wird , sind Generationsverluste auf Rundungsfehler beschränkt.
Die MCU-Grenzen bleiben erhalten (8x8 Blöcke).
Chroma-Unterabtastung ist deaktiviert.
Konstante DQT (gleiche Qualitätseinstellung).
Jedoch kann groß sein Rundungsfehler für jede Iteration , dass die oben genannten Kriterien nicht erfüllt sind, und es ist ratsam , Backups aller Originaldateien zu halten.
Der JPEG-Komprimierungsalgorithmus
Farbraum konvertieren. Falls gewünscht, die Farbinformationen herunterrechnen (Chroma-Unterabtastung) (verlustbehaftet) . Wenn nicht heruntergerechnet, ist Informationsverlust das Ergebnis eines Rundungsfehlers .
Segmentierung. Teilen Sie jeden Kanal in 8x8 Blöcke (MCU = Minimal Coding Unit). (Verlustfrei)
Hinweis: Wenn die Chroma-Unterabtastung aktiviert ist, können MCUs in Bezug auf das Originalbild effektiv 16 x 8, 8 x 16 oder 16 x 16 Pixel groß sein. Die MCUs bestehen jedoch immer noch aus 8x8-Blöcken.
Diskrete Cosinustransformation (DCT) auf jeder MCU. Informationsverlust ist das Ergebnis eines Rundungsfehlers .
Quantisierung. Der Wert in jeder Zelle der MCU wird durch eine in einer Quantisierungstabelle (DQT) angegebene Zahl geteilt. Die Werte sind abgerundet, viele davon werden zu Null. Dies ist der primäre verlustbehaftete Teil des Algorithmus.
Zick-Zack-Scan. Ordnen Sie die Werte in jeder MCU nach einem Zick-Zack-Muster in eine Folge von Zahlen um. Die bei der Quantisierung aufgetretenen Nullen werden zusammengefasst. (Verlustfrei)
DPCM = Differential Pulse Code Modulation. Konvertieren Sie die Zahlenfolgen in eine Form, die einfacher zu komprimieren ist. (Verlustfrei)
RLE = Run Length Encoding. Aufeinanderfolgende Nullen werden komprimiert. (Verlustfrei)
Entropie / Huffman-Codierung. (Verlustfrei)
JPEGs erneut komprimieren
Beachten Sie, dass das Downsampling der Farbkanäle und die Quantisierung die einzigen absichtlich verlustbehafteten Schritte sind . Abgesehen von Rundungsfehlern sind alle anderen Schritte verlustfrei. Sobald die Quantisierung erfolgt ist, führt das Umkehren und Wiederholen des Schritts zu identischen Ergebnissen. Mit anderen Worten ist die Neuquantisierung (mit demselben DQT) verlustfrei .
Grundsätzlich ist es möglich, einen Resampling-Algorithmus zu erstellen, der nach dem ersten Durchgang verlustfrei ist. Bei der Implementierung in ImageMagick können sich die Farben jedoch drastisch verschieben, bevor ein stabiler Zustand erreicht ist, wie im Bild zu sehen ist.
Unter optimalen Bedingungen würde das erneute Komprimieren eines JPEG mit denselben Qualitätseinstellungen genau dasselbe JPEG ergeben. Mit anderen Worten, das erneute Komprimieren von JPEGs ist potenziell verlustfrei . In der Praxis ist das erneute Komprimieren von JPEGs nicht verlustfrei, sondern unterliegt Rundungsfehlern und wird durch diese begrenzt. Obwohl Rundungsfehler häufig irgendwann gegen Null konvergieren , so dass genau dasselbe Bild neu erstellt wird, kann die Chroma-Unterabtastung zu erheblichen Farbänderungen führen.
Vorführung (gleiche Qualitätseinstellung)
Ich habe das folgende
bash
Skript geschrieben, das ImageMagick verwendet, um eine JPEG-Datei mit einer bestimmten Qualitätseinstellung wiederholt zu komprimieren:Nachdem ich es einige hundert Iterationen laufen ließ, führte ich
md5sum
die folgenden Ergebnisse aus:Wir können sehen, dass der Rundungsfehler tatsächlich gegen Null konvergiert ist und dass immer wieder genau dasselbe Bild reproduziert wird .
Ich habe dies mehrfach mit unterschiedlichen Bildern und Qualitätseinstellungen wiederholt. Normalerweise stabiler Zustand erreicht ist , und die genaue gleiche Bild wiedergegeben werden immer und immer wieder .
Was ist mit @ mattdms Ergebnissen ?
Ich habe versucht, die Ergebnisse von mattdm mit Imagemagick unter Ubuntu 18.04 zu replizieren. Das Original war eine Rohkonvertierung zu TIFF in Rawtherapee, aber es scheint nicht mehr verfügbar zu sein. An seiner Stelle habe ich die vergrößerte Version genommen und auf die ursprüngliche Größe (256x256) verkleinert. Dann habe ich bei 75 wiederholt komprimiert, bis ich Konvergenz bekam. Hier ist das Ergebnis (Original, 1, n, Unterschied):
Meine Ergebnisse sind unterschiedlich. Ohne das wahre Original ist der Grund für den Unterschied nicht zu bestimmen.
Was ist mit @ ths Montage ?
Ich habe das Bild von der oberen linken Ecke der Montage bis zur Konvergenz bei 90 erneut komprimiert. Dies ist das Ergebnis (Original, 1, n, Differenz):
Nach dem Aktivieren der Chroma-Unterabtastung ändern sich die Farben bis zum Erreichen des stationären Zustands.
Wechseln zwischen einer kleinen Anzahl von Einstellungen
Durch Ändern der Variablen
q2
kann die Qualitätseinstellung auf eine Reihe gleichmäßig verteilter Werte beschränkt werden.Bei einer kleinen Anzahl von Einstellungsmöglichkeiten kann schließlich ein Gleichgewicht erreicht werden , das sich abzeichnet, wenn sich die md5-Werte wiederholen. Es scheint, je größer die Menge ist, desto länger dauert es und desto schlechter wird das Bild, bevor das Gleichgewicht erreicht werden kann.
Was im Gleichgewicht zu passieren scheint, ist, dass der DCT-Koeffizient vor der Quantisierung alle (oder die meisten) der Quantenwerte teilbar sein muss. Wenn Sie beispielsweise zwischen zwei DQTs wechseln, bei denen der DCT-Koeffizient abwechselnd durch 3 und 5 geteilt wird, wird das Gleichgewicht erreicht, wenn der DCT-Koeffizient durch 15 teilbar ist. Dies erklärt, warum der Qualitätsabfall viel größer ist als der Unterschied zwischen den ursprünglichen Einstellungen.
Wechseln zwischen einer größeren Anzahl von Einstellungen
Eeyore ist nicht glücklich, wenn
q2
sich das so ändert:Verwenden Sie zum Erstellen eines Videos
ffmpeg
:Das Anschauen der ersten 9999-Iterationen ist fast so, als würde man zusehen, wie Wasser kocht. Möglicherweise möchten Sie die Wiedergabegeschwindigkeit verdoppeln. Hier ist Eeyore nach 11999 Iterationen:
Was ist, wenn sich die MCU-Grenzen ändern?
Wenn Änderungen nur wenige Male auftreten, wird das wiederholte erneute Komprimieren wahrscheinlich den stabilen Zustand erreichen. Wenn bei jeder Iteration Änderungen auftreten, wird sich das Bild wahrscheinlich auf ähnliche Weise verschlechtern, wie wenn sich DQT ändert.
Was ist mit dem Bearbeiten?
Die Auswirkung der Neukomprimierung nach der Bearbeitung hängt von der jeweils ausgeführten Bearbeitung ab. Wenn Sie beispielsweise nach dem Reduzieren von JPEG-Artefakten dieselbe Qualitätseinstellung speichern, werden dieselben Artefakte wieder eingefügt. Das Anwenden einer lokalisierten Änderung, z. B. eines Reparaturpinsels, hat jedoch keine Auswirkungen auf Bereiche, die nicht berührt wurden.
Der größte Rückgang der Bildqualität tritt auf, wenn die Datei zum ersten Mal mit einer bestimmten Qualitätseinstellung komprimiert wird. Das anschließende erneute Komprimieren mit derselben Einstellung sollte keine Änderung hervorrufen, die größer als der Rundungsfehler ist. Daher würde ich erwarten, dass Zyklen zum erneuten Speichern von Bearbeitungen bei einer bestimmten Qualitätseinstellung wie jedes andere Bild aussehen, das mit derselben Qualitätseinstellung gespeichert wurde (solange die MCU-Grenzen intakt bleiben und die Chroma-Unterabtastung deaktiviert ist ).
Was ist mit diesen Videos?
Fehlerhafte JPEG-Implementierung? ( Mit Photoshop 500-mal um 10/12 erneut speichern. )
Ändern der Qualitätseinstellungen. (Die meisten Videos.)
Unterbrechung der MCU-Grenzen. (Zuschneiden oder Drehen )
Andere Manöver, die die Bildqualität beeinträchtigen oder den JPEG-Algorithmus beeinträchtigen?
Kann ich meine Originale mit neu komprimierten JPEGs überschreiben?
Es ist ratsam, Sicherungskopien aller Originaldateien zu erstellen. Wenn Sie jedoch versehentlich eine Datei überschreiben, ist der Schaden wahrscheinlich begrenzt. Es wäre auch in Ordnung, in JPEG mit deaktivierter Chroma-Unterabtastung zu arbeiten.
JPEG kann nicht für Bilder verwendet werden, die mehr als 8 Bit pro Farbe verwenden.
quelle
Rekomprimierungsverlust ist real, insbesondere wenn mit höheren JPEG-Komprimierungsstufen gearbeitet wird.
Theoretisch sollte die Verschlechterung minimal sein , wenn Sie JPEG-Dateien mit genau den gleichen Parametern erneut speichern und Ihren Zuschnitt auf 8 × 8-Blöcke ausgerichtet haben . Wenn Sie jedoch eine hohe Komprimierungsstufe verwenden, treten weitere Verluste auf, da die durch die anfängliche Komprimierung eingeführten Artefakte dauerhafte Änderungen am Bild sind und ebenfalls erneut komprimiert werden, was zu weiteren Artefakten führt.
Wenn Sie mit einer geringen Komprimierungsstufe (hohe Qualität, z. B. "100" in Gimp oder 11 oder 12 in Photoshop) erneut speichern, sind neu hinzugefügte Artefakte kaum zu bemerken. Das Bild wird dadurch nicht besser , aber nicht wesentlich schlechter. Es werden jedoch Änderungen im gesamten Image vorgenommen.
Als schnellen Test habe ich ImageMagick verwendet, um ein JPEG-Bild immer wieder mit 75% zu komprimieren. Die folgenden Beispiele werden als PNG-Dateien hochgeladen, um eine erneute Komprimierung zu vermeiden. Ihre Größe wurde bei der Konvertierung in PNG verdoppelt, um den Effekt deutlicher zu machen. (Die im Test verwendeten Originale wurden nicht verdoppelt.) Es stellte sich heraus, dass der Effekt nach acht Neuabtastungen zu einem vollkommen stabilen Ergebnis konvergierte, bei dem die erneute Komprimierung zu einer bitweise identischen Datei führte.
Hier ist das unkomprimierte Original:
Hier ist das Ergebnis von 75% JPEG:
Und hier ist das neu gespeichert:
Diese Einsparung von einer Sekunde führt zu einer erheblichen zusätzlichen Verschlechterung!
Und hier ist das endgültige konvergierte Bild (8. Durchgang):
Wieder sind die Farben definitiv noch schlechter, einschließlich einiger falscher Farbmuster, und die blockartigen Artefakte springen mehr heraus. Der Algorithmus konvergiert, aber zu einer deutlich verschlechterten Version. Also mach das nicht.
Aber hier ist dasselbe mit einer 99% -Qualitätsstufe nach 9 Durchgängen (der Punkt, an dem es konvergiert, sodass weitere Durchgänge identisch sind):
Hier macht sich der Unterschied kaum bemerkbar. (Ich meine das wörtlich; vergleiche sie Pixel für Pixel mit der nicht komprimierten Version und die Abweichung ist nur ein sehr geringes zufälliges Rauschen.) Und wenn ich zu diesem ersten 75% -Bild zurückkehre und es dann bei 99% speichere? Nun, dies (nach nur einem Mal):
In hohen Qualität zu sparen ist auf jeden Fall sichtbar besser als mit den gleichen Parametern resaving, Art der zu meiner Überraschung. Aber es gibt eine offensichtliche neue Verschlechterung um das rosa Trimmen und die Augen. Mit der recycelten Version derselben Einstellungen werden die JPEG-Artefakte bei jeder erneuten Komprimierung übertrieben. Bei der von mir gewählten niedrigen Auflösung und Qualität ist das schlimmer, als alles anders zu komprimieren.
Zu diesen Videos: Ich fand diesen als Top-Google-Hit. Beachten Sie, dass in der Beschreibung steht:
Hervorhebung hinzugefügt - dies erklärt, warum es keine Konvergenz gibt, da anstelle des Speicherns mit denselben Einstellungen oder des Speicherns mit höchster Qualität jedes Mal zufällige Einstellungen verwendet werden .
Das zweite Video, das ich gefunden habe, sagt:
Es wurde also wieder etwas unternommen, um die Fehler weiterhin zu akkumulieren.
Auf jeden Fall für die praktische Fotobearbeitung , zu erwähnen , es wert ist, dass 75% Einsparung einer Zeit ist viel schlimmer als bei 99% ein resaving Millionen mal . In meinem Beispiel sind die Artefakte bei 75% so offensichtlich, dass die weitere Verschlechterung dem Ablassen von Wasser in den Ozean gleicht. Wenn Sie so hoch speichern, dass diese Artefakte nicht wirklich sichtbar sind, ist das erneute Speichern mit den ursprünglichen Einstellungen eine gute Strategie. Natürlich, wenn Sie sich daran halten können, immer von unkomprimierten Originalen zu arbeiten, sind Sie besser dran.
Wenn Sie aus irgendeinem Grund nur mit JPEG arbeiten müssen (oder möchten), stellen Sie Ihre Kamera so ein, dass sie in der höchstmöglichen Qualität speichert , auch wenn Sie den Unterschied in den ursprünglichen Dateien nicht bemerken. Siehe Lohnt es sich, die Premium JPEG-Qualitätseinstellung von Pentax zu verwenden? Mehr dazu - nicht unbedingt Pentax-spezifisch.
quelle
Die Rekomprimierung wirkt sich messbar auf die Bildqualität aus, und dieser Effekt ist beim Ändern der Komprimierungsraten viel ausgeprägter.
Zur schnellen Überprüfung hier einige SSIM- Werte für Operationen, die an einem Testbild ausgeführt werden, das eine Kombination aus Linienmerkmalen und kontinuierlichen Merkmalen enthält. Ich habe JPG95 ausgewählt, weil mir das an der Ad-Photo School beigebracht wurde, und JPG83, weil das bei Anbietern von digitalen Inhalten üblich ist.
Die Menge an struktureller Ähnlichkeit, die durch das zehnmalige Speichern bei derselben Komprimierung verloren geht, ist 1/10 der Menge, die durch das Speichern bei der Qualität von tiff verloren geht. Der Qualitätsverlust durch einmaliges Ändern der JPG-Komprimierung entspricht jedoch dem Qualitätsverlust beim Speichern dieses Bildes von Tiff in JPG.
Ich werde diesen Test auf einige weitere Arten ausführen und aktualisieren.
Methodik : In ImageJ:
HINWEIS: Viele Personen, die sich zum ersten Mal mit SSIM-Werten befassen, lesen diese als Prozentsätze und gehen davon aus, dass der Unterschied gering ist. Dies ist nicht unbedingt wahr. SSIM-Werte sollten relativ zueinander verglichen werden, anstatt als Abweichung von 1 betrachtet zu werden.
quelle
Nichts wie experimentieren. Das folgende Bash-Skript (geschrieben unter Linux, könnte unter OSX funktionieren, wenn Sie ImageMagick haben ):
step000.jpg
)Das Ergebnis ist, dass:
All dies setzt natürlich voraus, dass das JPEG jedes Mal von derselben Software mit denselben Parametern gespeichert wird.
Da ich die Ergebnisse vorerst nicht zeigen werde, lasse ich Sie lieber mit Ihren eigenen Bildern experimentieren. Mit genügend Kommentaren werde ich ein Beispiel hinzufügen.
quelle