Jahrelang habe ich geglaubt, dass das mehrmalige erneute Komprimieren von JPEG-Dateien die Qualität allmählich verschlechtern würde, bis sie ein unkenntliches Durcheinander sind, wie es beim Erstellen von Fotokopien von Fotokopien der Fall ist. Dies ist intuitiv sinnvoll, da JPEG ein verlustbehaftetes Format ist. Es gibt auch andere Fragen und Antworten, die dies behaupten:
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 auf derselben Qualitätsstufe die Bildqualität nicht beeinträchtigt. Dies läuft dem an anderer Stelle beschriebenen allmählichen Abbau zuwider.
Was passiert technisch , wenn ein JPEG neu komprimiert wird? Was geht verloren und wie? Wird sich das Bild wirklich in das verschneite Durcheinander verwandeln, das früher im Fernsehen zu sehen war? Was ist mit den Videos, die Bilder zeigen, die auseinanderfallen, nachdem sie mehrmals neu komprimiert wurden?
(Bitte winken Sie nicht einfach per Hand und appellieren Sie an das allgemeine Konzept der Verlusthaftigkeit.)
(Diese Frage und die bisher erhaltenen Antworten konzentrieren sich auf die technischen Faktoren (spezifische Einstellungen und Bildmanipulationen), die eine Bildverschlechterung verursachen oder verhindern, wenn eine JPEG-Datei mehrmals neu komprimiert wird .)
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 neu komprimiert wird , beschränken sich Generationsverluste auf Rundungsfehler.
MCU-Grenzen bleiben intakt (8x8-Blöcke).
Chroma-Subsampling ist deaktiviert.
Konstante DQT (gleiche Qualitätseinstellung).
Rundungsfehler können jedoch für jede Iteration groß sein , bei der die oben genannten Kriterien nicht erfüllt werden, und es ist ratsam, Sicherungskopien aller Originaldateien aufzubewahren.
Farbraum konvertieren. Falls gewünscht, Farbinformationen herunterskalieren (Chroma-Subsampling) (verlustbehaftet) . Ohne Downsampling ist der Informationsverlust das Ergebnis des Rundungsfehlers .
Segmentierung. Teilen Sie jeden Kanal in 8x8 Blöcke (MCU = Minimal Coding Unit). (verlustfrei)
Hinweis: Wenn Chroma-Subsampling aktiviert ist, können MCUs effektiv 16 x 8, 8 x 16 oder 16 x 16 in Bezug auf das Originalbild sein. Die MCUs sind jedoch immer noch alle 8x8-Blöcke.
Diskrete Kosinustransformation (DCT) auf jeder MCU. Informationsverlust durch Rundungsfehler .
Quantisierung. Der Wert in jeder Zelle der MCU wird durch eine Zahl geteilt, die in einer Quantisierungstabelle (DQT) angegeben ist. Die Werte werden abgerundet, von denen viele zu Null werden. Dies ist der primäre verlustbehaftete Teil des Algorithmus.
Zick-Zack-Scan. Ordnen Sie die Werte in jeder MCU in eine Zahlenfolge um, die einem Zickzackmuster folgt. Die während der Quantisierung aufgetretenen Nullen werden zusammengefasst. (verlustfrei)
DPCM = Differentielle Pulscodemodulation. Wandeln Sie die Zahlenfolgen in eine Form um, die leichter zu komprimieren ist. (verlustfrei)
RLE = Lauflängencodierung. Aufeinanderfolgende Nullen werden komprimiert. (verlustfrei)
Entropie/Huffman-Codierung. (verlustfrei)
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 stattgefunden hat, ergibt das Umkehren und Wiederholen des Schritts identische Ergebnisse. Mit anderen Worten, die Neuquantisierung (mit derselben DQT) ist verlustfrei .
Grundsätzlich ist es möglich, einen Resampling-Algorithmus zu erstellen, der nach dem ersten Durchlauf verlustfrei ist. Bei der Implementierung in ImageMagick können sich die Farben jedoch drastisch verschieben, bevor der stabile Zustand erreicht ist, wie auf dem Bild zu sehen ist.
Unter optimalen Bedingungen würde die erneute Komprimierung eines JPEG mit denselben Qualitätseinstellungen zu genau demselben JPEG führen. Mit anderen Worten, die erneute Komprimierung von JPEGs ist potenziell verlustfrei . In der Praxis ist das erneute Komprimieren von JPEGs nicht verlustfrei, unterliegt jedoch Rundungsfehlern und ist durch diese begrenzt. Obwohl Rundungsfehler oft schließlich gegen Null konvergieren , so dass genau das gleiche Bild neu erstellt wird, kann Chroma-Subsampling zu erheblichen Farbänderungen führen.
Ich habe das folgende bash
Skript geschrieben, das ImageMagick verwendet, um eine JPEG-Datei wiederholt mit einer bestimmten Qualitätseinstellung neu 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ß, lief ich mit md5sum
den Ergebnissen:
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 immer wieder genau das gleiche Bild reproduziert wird .
Ich habe dies mehrmals mit verschiedenen Bildern und Qualitätseinstellungen wiederholt. Normalerweise wird ein stationärer Zustand erreicht, und genau das gleiche Bild wird immer wieder reproduziert.
Ich habe versucht, die Ergebnisse von mattdm mit Imagemagick auf Ubuntu 18.04 zu replizieren. Das Original war eine Rohkonvertierung in TIFF in Rawtherapee, aber es scheint nicht mehr verfügbar zu sein. Stattdessen habe ich die vergrößerte Version genommen und auf die Originalgröße (256x256) verkleinert. Dann habe ich wiederholt bei 75 neu komprimiert, bis ich Konvergenz hatte. Hier ist das Ergebnis (Original, 1, n, Differenz):
Meine Ergebnisse sind unterschiedlich. Ohne das wahre Original ist der Grund für den Unterschied unmöglich zu bestimmen.
Ich habe das Bild von der oberen linken Ecke der Montage bis zur Konvergenz bei 90 neu komprimiert. Dies ist das Ergebnis (Original, 1, n, Differenz):
Nach dem Aktivieren von Chroma-Subsampling ändern sich die Farben bis zum Erreichen des stabilen Zustands.
Durch Modifikation der Variable q2
kann die Qualitätseinstellung auf eine Menge gleichmäßig verteilter Werte begrenzt werden.
q2=$(( (RANDOM % 3)*5 + 70 ))
Bei einer kleinen Anzahl von Einstellungsoptionen kann das Gleichgewicht schließlich erreicht werden, was zu sehen ist, wenn die md5-Werte wiederkehren. Es scheint, je größer der Satz 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) Quantenwerte teilbar sein muss. Wenn beispielsweise zwischen zwei DQTs umgeschaltet wird, 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.
Eeyore ist nicht glücklich, wenn q2
es so geändert wird:
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
Die ersten 9999 Iterationen zu beobachten , ist fast so, als würde man Wasser kochen sehen. Vielleicht möchten Sie die Wiedergabegeschwindigkeit verdoppeln. Hier ist Eeyore nach 11999 Iterationen:
Wenn Änderungen eine begrenzte Anzahl von Malen auftreten, wird durch wiederholtes erneutes Komprimieren wahrscheinlich ein stabiler Zustand erreicht. Wenn bei jeder Iteration Änderungen auftreten, verschlechtert sich das Bild wahrscheinlich ähnlich wie bei einer DQT-Änderung.
Die Auswirkung der erneuten Komprimierung nach der Bearbeitung hängt von der jeweils durchgeführten Bearbeitung ab. Beispielsweise würde das Speichern mit derselben Qualitätseinstellung nach dem Reduzieren von JPEG-Artefakten dieselben Artefakte wieder einführen. Das Anwenden einer lokalisierten Änderung, wie z. B. eines Reparaturpinsels, würde sich jedoch nicht auf Bereiche auswirken, die nicht berührt wurden.
Der größte Abfall der Bildqualität tritt auf, wenn die Datei zum ersten Mal mit einer bestimmten Qualitätseinstellung komprimiert wird. Anschließendes erneutes Komprimieren mit der gleichen Einstellung sollte keine Änderung einführen, die größer als der Rundungsfehler ist. Ich würde also erwarten, dass Edit-Resave-Zyklen bei einer bestimmten Qualitätseinstellung wie jedes andere Bild aussehen, das mit derselben Qualitätseinstellung gespeichert wurde (solange die MCU-Grenzen intakt bleiben und Chroma-Subsampling deaktiviert ist ).
Fehlerhafte JPEG-Implementierung? ( 500-mal erneutes Speichern mit Photoshop am 12.10. )
Qualitätseinstellungen ändern. (Die meisten Videos.)
Aufbrechen der MCU-Grenzen. (Zuschneiden oder Rotieren )
Andere Manöver, die die Bildqualität verringern oder den JPEG-Algorithmus stören?
Es ist ratsam, Sicherungskopien aller Originaldateien aufzubewahren, aber wenn Sie versehentlich eine überschreiben, ist der Schaden wahrscheinlich begrenzt. Es wäre auch in Ordnung, in JPEG mit deaktiviertem Chroma-Subsampling zu arbeiten.
JPEG kann nicht für Bilder verwendet werden, die mehr als 8 Bit pro Farbe verwenden.
exiftool -v5 image.jpg | grep -v RST
Der Rekomprimierungsverlust ist real, insbesondere wenn mit höheren JPEG-Komprimierungsstufen gearbeitet wird.
Theoretisch sollte die Verschlechterung minimal sein , wenn Sie eine JPEG-Datei mit genau denselben Parametern erneut speichern und Ihren Zuschnitt auf 8 × 8-Blöcke ausgerichtet haben . Wenn Sie jedoch eine hohe Komprimierungsstufe verwenden, werden Sie weitere Verluste feststellen, da die durch die anfängliche Komprimierung eingeführten Artefakte dauerhafte Änderungen am Bild sind und ebenfalls erneut komprimiert werden, was weitere Artefakte verursacht.
Wenn Sie mit einer niedrigen Komprimierungsstufe (hohe Qualität, wie „100“ in Gimp oder 11 oder 12 in Photoshop) erneut speichern, sind neu hinzugefügte Artefakte schwer zu erkennen. Das Bild wird dadurch nicht besser , aber auch nicht wesentlich schlechter. Es wird jedoch Änderungen im gesamten Bild einführen.
Als schnellen Test habe ich ImageMagick verwendet, um ein JPEG-Bild immer wieder auf 75 % neu zu komprimieren. Die folgenden Beispiele werden als PNG-Dateien hochgeladen, um eine weitere Neukomprimierung zu vermeiden, und wurden bei der Konvertierung in PNG verdoppelt, um den Effekt deutlicher zu machen. (Die im Test verwendeten Originale wurden nicht verdoppelt.) Es stellt sich heraus, dass der Effekt nach acht Resamplings zu einem vollkommen stabilen Ergebnis konvergierte, bei dem eine erneute Neukomprimierung zu einer Bit für Bit identischen Datei führt.
Hier das unkomprimierte Original:
Hier ist das Ergebnis von 75 % JPEG:
Und hier ist das nochmal gespeichert:
Diese einzelne Sekundenspeicherung verursacht eine große Menge an zusätzlicher Verschlechterung!
Und hier ist das endgültige konvergierte Bild (8. Durchgang):
Auch hier sind die Farben definitiv noch mehr aus, einschließlich einiger falscher Farbmuster, und die blockartigen Artefakte springen stärker hervor. Der Algorithmus konvergiert, aber zu einer deutlich verschlechterten Version. Also, tu das nicht.
Aber hier ist das Gleiche mit einem Qualitätsniveau von 99% nach 9 Durchgängen (der Punkt, an dem es konvergiert, sodass weitere Durchgänge identisch sind):
Hier ist der Unterschied kaum wahrnehmbar. (Ich meine das wörtlich; vergleiche sie Pixel für Pixel mit der nicht komprimierten Version und die Abweichung ist nur ein sehr leichtes zufälliges Rauschen.) Also, was ist, wenn ich zu diesem ersten 75-%-Bild zurückgehe und dann bei 99 % erneut speichere? Nun, das (nach nur einmal):
Das Speichern in hoher Qualität ist definitiv sichtbar besser als das erneute Speichern mit denselben Parametern, zu meiner Überraschung. Aber es gibt eine offensichtliche neue Verschlechterung um den rosa Besatz und die Augen herum. Bei der recycelten Version derselben Einstellungen werden die JPEG-Artefakte bei jeder erneuten Komprimierung übertrieben. Bei der niedrigen Auflösung und niedrigen Qualität, die ich gewählt habe, stellt sich das als schlimmer heraus, als alles anders neu zu komprimieren.
Zu diesen Videos: Ich fand dieses hier als Top-Google-Hit. Beachten Sie, dass es in der Beschreibung heißt:
Dies passiert, wenn Sie ein JPEG-Bild viele Male mit zufälligen hohen Qualitätseinstellungen (85 oder höher) neu codieren.
Hervorhebung hinzugefügt – dies erklärt, warum es keine Konvergenz gibt, da statt mit denselben Einstellungen zu speichern oder mit superhoher Qualität zu speichern , jedes Mal zufällige Einstellungen verwendet werden .
Das zweite Video, das ich gefunden habe, sagt:
Ein JPEG-Bild wurde kopiert und für jedes Bild um eine volle Umdrehung gedreht. [...] (596 "Im Uhrzeigersinn drehen"-Aktionen)
Also wurde wieder etwas getan, damit sich die Fehler nicht mehr häufen.
Für die praktische Bildbearbeitung ist auf jeden Fall zu erwähnen, dass einmal 75 % sparen viel schlechter ist, als millionenfach mit 99 % neu zu speichern . In meinem Beispielfall sind die Artefakte bei 75 % so offensichtlich, dass die weitere Verschlechterung so ist, als würde man Wasser in den Ozean kippen. Wenn Sie so hoch genug speichern, dass diese Artefakte nicht wirklich sichtbar sind, ist ein erneutes Speichern mit den ursprünglichen Einstellungen eine gute Strategie. Wenn Sie sich daran halten können, immer mit unkomprimierten Originalen zu arbeiten, sind Sie natürlich besser dran.
Wenn Sie aus irgendeinem Grund nur mit JPEG arbeiten müssen (oder es vorziehen), stellen Sie Ihre Kamera so ein, dass sie in der höchstmöglichen Qualität speichert , auch wenn Sie den Unterschied in den Ausgangsdateien nicht bemerken. Siehe Lohnt es sich, die Premium-JPEG-Qualitätseinstellung von Pentax zu verwenden? mehr dazu – nicht unbedingt Pentax-spezifisch.
Die Neukomprimierung hat einen messbaren Effekt auf die Bildqualität, und dieser Effekt ist viel ausgeprägter, wenn die Komprimierungsraten geändert werden.
Zur schnellen Überprüfung hier einige SSIM -Werte für Operationen, die an einem Testbild durchgeführt wurden, das eine Kombination aus Linienmerkmalen und durchgehenden Merkmalen enthält. Ich habe JPG95 ausgewählt, weil mir dies an der Ad-Photo-Schule beigebracht wurde, und JPG83, weil dies bei Anbietern digitaler Inhalte üblich ist.
Die Menge an struktureller Ähnlichkeit, die beim zehnmaligen erneuten Speichern mit derselben Komprimierung verloren geht, ist also 1/10 der Menge, die verloren geht, wenn sie in der Qualität von TIFF gespeichert wird. Allerdings ist der Qualitätsverlust durch das einmalige Ändern der JPG-Komprimierung derselbe wie der Qualitätsverlust beim Speichern dieses Bildes von Tiff in JPG.
Ich werde diesen Test noch ein paar Mal ausführen und aktualisieren.
Methodik : In ImageJ:
HINWEIS: Viele Leute, die SSIM-Werte zum ersten Mal betrachten, lesen sie als Prozentsätze und gehen davon aus, dass der Unterschied gering ist. Dies ist nicht unbedingt wahr. SSIM-Werte sollten relativ zueinander verglichen und nicht als Abweichung von 1 betrachtet werden.
Nichts geht über Experimente. Das folgende Bash-Skript (geschrieben unter Linux, könnte unter OSX funktionieren, wenn Sie ImageMagick haben ):
step000.jpg
)Das Ergebnis ist:
All dies setzt natürlich voraus, dass das JPEG jedes Mal von derselben Software mit denselben Parametern gespeichert wird.
#! /bin/bash
# Runs successive JPEG saves on an image to evaluate JPEG losses
# convert & compare command from imagemagick
# if you use a recent version of IM, set these variables to:
# compare="magick compare"
# convert="magick convert"
convert=convert
compare=compare
dotradius=2
defaultsteps=10
defaultquality=90 # default quality for "convert"
function usage {
echo "Usage: $0 [quality [steps]]"
echo ""
echo "Where:"
echo " - 'quality' is the quality factor of the JPEG compression "
echo " (1-100, 100 is best, default is $defaultquality)"
echo " - 'steps' is the number of successive steps to perform"
echo " (default is $defaultsteps)"
echo ""
echo "Produces:"
echo " - successive saves of a JPEG image to test JPEG-induced losses."
echo " - compare images with the original file and the 1st JPEG save."
echo ""
echo "Starts from a 'step000.jpg' file in the current directory."
exit 1
}
[[ -n "$3" ]] && { usage ; exit 1 ; }
steps=${1:-$defaultsteps}
quality=${2:-$defaultquality}
dotcolor="white" # change this if the top of the image is too clear
echo "Running with $steps steps with quality $quality"
for step in $(seq $steps)
do
echo "Step $step of $steps"
src=$(printf step%03d $(( $step - 1 )) )
dst=$(printf step%03d $(( $step )) )
dif=$(printf diff%03d $(( $step )) )
# dot coordinates
let cxc="2 * $dotradius * $step"
let cxr="$cxc + $dotradius"
let cyc="$dotradius * 2"
let cyr="$dotsradius * 2"
$convert $src.jpg -fill white -draw "circle $cxc,$cyc,$cxr,$cyr" $dst.png
$convert $dst.png -quality $quality $dst.jpg
rm $dst.png
$compare $src.jpg $dst.jpg $dif.jpg
done
Die Ergebnisse zeige ich vorerst nicht, ich lasse Sie lieber mit Ihren eigenen Bildern experimentieren. Bei genügend Kommentaren füge ich ein Beispiel hinzu.
Michael C
Michael C
Benutzer541686
AffeZeus
xiota
mattdm
Navin
Giacomo1968
StephenG - Helfen Sie der Ukraine