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.
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:
#!/usr/bin/env bash
n=10001; q1=90
convert original.png -sampling-factor 4:4:4 -quality ${q1} ${n}.jpg
while true ; do
q2=${q1} # for variants, such as adding randomness
convert ${n}.jpg -quality ${q2} $((n+1)).jpg
#\rm $((n-5)).jpg # uncomment to avoid running out of space
n=$((n+1))
echo -n "$q2 "
md5sum ${n}.jpg
done
Nachdem ich es einige hundert Iterationen laufen ließ, führte ich md5sum
die folgenden Ergebnisse aus:
d9c0d55ee5c8b5408f7e50f8ebc1010e original.jpg
880db8f146db87d293def674c6845007 10316.jpg
880db8f146db87d293def674c6845007 10317.jpg
880db8f146db87d293def674c6845007 10318.jpg
880db8f146db87d293def674c6845007 10319.jpg
880db8f146db87d293def674c6845007 10320.jpg
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 .
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.
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.
q2=$(( (RANDOM % 3)*5 + 70 ))
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:
q2=$(( (RANDOM % 9) + 90 ))
Verwenden Sie zum Erstellen eines Videos ffmpeg
:
rename 's@1@@' 1*.jpg
ffmpeg -r 30 -i %04d.jpg -c:v libx264 -crf 1 -vf fps=25 -pix_fmt yuv420p output.mp4
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.
- Dies geschieht in Videos, die ein Bild mit Dimensionen drehen , die nicht durch 8 teilbar sind.
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.