Welche Faktoren verursachen oder verhindern einen "Generationsverlust", wenn JPEGs mehrmals neu komprimiert werden?

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:

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

Wenn Sie erneut komprimieren, aber die Einstellung auf 100 % steht, verlieren Sie theoretisch nichts. Wenn Sie dieselbe Datei mehrmals mit 80 % erneut komprimieren, verlieren Sie weiterhin erhebliche Datenmengen und beginnen, Artefakte zu sehen. In der Praxis ist dies am häufigsten auf Bildfreigabeseiten der Fall, wo Bilder aufgenommen und auf andere Seiten hochgeladen werden. Wenn die Metadaten für das Komprimierungsverhältnis fehlen oder ignoriert werden, wird die Komprimierung angewendet und erneut angewendet.
@MonkeyZeus Einige (kleine) Bilddaten gehen durch Rundungsfehler bei Qualität 100 verloren. Die erneute Komprimierung mit derselben Einstellung (z. B. 80) führt nicht zu fortschreitendem Datenverlust. Das ist das „allgemeine Wissen“, das diese Fragen und Antworten ansprechen sollen.
@MonkeyZeus Die Werte wie "100" und "80" (oder "10, 11, 12" in Photoshop) sind willkürlich - 100 % sind nicht verlustfrei.
Relevantes xkcd: xkcd.com/1683
@xiota Stimmt. Aber viele Internetdienste – und Fotoprofis – folgen einem Arbeitsablauf, der in etwa so abläuft: RAW zu TIFF und dann zu 100 % zu JPEG. Für die meisten Anwendungen ist die anfängliche Konvertierung in ein JPEG absolut solide. Daran vorbei? Ja, Rundungsfehler. Stellen Sie jedoch sicher, dass das Bild schreibgeschützt ist, oder seien Sie einfach sehr vorsichtig, und Sie sind gut.
Ich stimme dafür, diese Frage als nicht zum Thema gehörend zu schließen, da dies wirklich ein (komplexes) Problem in Bezug auf die Leistung von Computeralgorithmen und die (extremen) Details des JPEG-Standards und der Implementierungen ist.

Antworten (4)

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.


Der JPEG-Kompressionsalgorithmus

  1. Farbraum konvertieren. Falls gewünscht, Farbinformationen herunterskalieren (Chroma-Subsampling) (verlustbehaftet) . Ohne Downsampling ist der Informationsverlust das Ergebnis des Rundungsfehlers .

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

  3. Diskrete Kosinustransformation (DCT) auf jeder MCU. Informationsverlust durch Rundungsfehler .

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

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

  6. DPCM = Differentielle Pulscodemodulation. Wandeln Sie die Zahlenfolgen in eine Form um, die leichter zu komprimieren ist. (verlustfrei)

  7. RLE = Lauflängencodierung. Aufeinanderfolgende Nullen werden komprimiert. (verlustfrei)

  8. Entropie/Huffman-Codierung. (verlustfrei)

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

Demonstration (gleiche Qualitätseinstellung)

Ich habe das folgende bashSkript 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 md5sumden 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.

Was ist mit den Ergebnissen von @mattdm ?

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

versuchen, mattdm zu replizieren

Meine Ergebnisse sind unterschiedlich. Ohne das wahre Original ist der Grund für den Unterschied unmöglich zu bestimmen.

Was ist mit der Montage von @ths ?

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

versuchen, diese Montage zu replizieren

Nach dem Aktivieren von Chroma-Subsampling ändern sich die Farben bis zum Erreichen des stabilen Zustands.

ths-Farbverschiebung

Wechseln zwischen einer kleinen Anzahl von Einstellungen

Durch Modifikation der Variable q2kann 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.

Wechseln zwischen einer größeren Anzahl von Einstellungen

Eeyore ist nicht glücklich, wenn q2es 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:

11999 Iterationen, zufällige DQT

Was passiert, wenn sich die MCU-Grenzen ändern?

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.

Was ist mit der Bearbeitung?

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

Was ist mit diesen Videos?

Kann ich meine Originale mit neu komprimierten JPEGs überschreiben?

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.

Bei Load- Edit -Save-Loops sieht das Bild jedoch ganz anders aus. in diesem Fall führt eine wiederholte Quantisierung zu einer Verschlechterung.
Sicher, es konvergiert – aber erst, nachdem es viel schlimmer geworden ist.
Ich habe gerade einen Test mit demselben Skript wie in der Antwort gemacht. Hier ist eine Montage von jedem 20. Bild bis 100: i.stack.imgur.com/xtob6.jpg , das ist signifikant.
Siehe meine Antwort für eine Erklärung der Videos. (Nun, die besten Videos, die ich gefunden habe, erklären sich eigentlich ganz einfach.)
FWIW, mein Original ist ein Teil des Rahmens eines Bildes von einer 2012er DSLR, die in Rawtherapee konvertiert (und ursprünglich als TIFF exportiert) wurde.
ImageMagick wäre das gewesen, was damals in Fedora war; wahrscheinlich 6.7.8.9.
komisch. Ich kann es jetzt auch nicht reproduzieren. Ich bin eigentlich auf Win, also habe ich das Skript im Stapel repliziert, aber ich weiß nicht, was den Effekt verursacht haben könnte.
OK. Probieren Sie es mit diesem hier aus: i.stack.imgur.com/j0Z3B.jpg Alles, was ich ursprünglich getan habe, war, mein Quellbild zu skalieren und es mit 100% von irfanview zu speichern. das scheint den unterschied zu machen.
Bitte sehen Sie sich meine Antwort an, was die Videos tun. Ich habe keine gefunden (zumindest nicht in fünf Minuten Suche), die vorgeben, wiederholt mit denselben Qualitätseinstellungen zu speichern – alle sind offen, entweder Änderungen am Bild vorzunehmen oder zufällige Komprimierungseinstellungen für jeden Frame zu verwenden.
Ah. habe das Problem mit meinem Bild gefunden. Wenn Sie Chroma-Subsampling aktiviert haben, führt dies zu einer fortschreitenden Verschlechterung.
Habe das auch gefunden. Das Aktivieren von Chroma-Subsampling ändert also die Farbe im Bild erheblich, bevor ein stabiler Zustand erreicht wird.
OH. Das ist eine schöne Erkenntnis. Cool!
Wiederholtes Laden und Speichern mit genau denselben Parametern würde wahrscheinlich keinen unbegrenzten Qualitätsverlust verursachen, da die meisten Eingabedateien ohne zusätzliche Rundungsfehler geladen und erneut gespeichert werden könnten und Dateien, die von Rundungsfehlern betroffen wären, wahrscheinlich umgewandelt würden in Dateien, die dies nicht tun würden. Andererseits könnten wiederholte Lade-/Speicherzyklen, die zwischen ähnlichen, aber nicht identischen Komprimierungsparametern wechseln, zu Rundungsfehlern bei jedem Zyklus führen.
Ich bin mir ziemlich sicher, dass die meisten oder alle Kameras JPEG-Dateien mit Chroma-Unterabtastung (normalerweise 4:2:2) speichern, selbst in Modi mit hoher Qualität. Das ist ziemlich relevant für die praktische Anwendung dieser Antwort – und die Tatsache, dass die Videos nicht mit denselben Parametern gespeichert werden, lässt mich wirklich wünschen, Sie hätten nicht mit „es ist ein Mythos“ begonnen, was im Allgemeinen eine gute Antwort ist.
Ich denke, der Aspekt "anwendungsabhängig" ist dabei sehr wichtig. Ich gehe immer davon aus, dass die Leute verlustfrei aus ihrem Gerät herauskommen, weil das der richtige Weg ist, aber es ist nur in einem professionellen oder industriellen Workflow möglich. In einem Kamerahandy ist das native Format JPG, und dann können eine Reihe von Apps die Datei ändern und erneut speichern, ohne die Formatkontrolle offenzulegen, geschweige denn Art und Grad der Komprimierung. Vielleicht ist das eine separate Frage.
@PhotoScientist In der Kamerahandy-Hülle sollte viel Verlust angenommen werden, insbesondere wenn das Bild mit etwa 1024 x 768 eingeht.
Das ist ein Grund, warum ich mich frage. Viele der Sünden des Kamerahandys sind vergeben, weil die Bilder, die wir sehen, im Vergleich zur räumlichen Auflösung des Sensors so winzig sind. Ein 14-MP-Bild mit starken Artefakten sieht nahezu perfekt aus, wenn es auf einem Bildschirm betrachtet wird, der nur 1400 Pixel breit ist. Ich mache mir Sorgen um das Erbe dieser Bilder. Es wird kein "Hinzoomen für Details" geben, wie es vorher mit hochauflösenden Raws oder Filmen möglich war. Vielleicht ist das aber auch nur meine persönliche Seifenkiste.
@PhotoScientist Sie können die DQT von JPEG-Dateien aus verschiedenen Quellen mit untersuchenexiftool -v5 image.jpg | grep -v RST
War das linke Bild das Bild nach der (einmaligen) Verwendung der niedrigsten Qualität aus dem ausgewählten Bereich? Wenn nicht, könnte es hilfreich sein, zu zeigen, wie das aussehen würde, um anzuzeigen, wie viel Rauschen von Generationsverlusten herrührt und nicht einfach auf die schlechteste Qualitätseinstellung zurückzuführen ist.
Mit Ausnahme von I-Ah ist das linke Bild nach einem einzelnen Kompressionsschritt, b/c die Absicht ist, Verluste durch wiederholte erneute Kompression zu vergleichen. Ich werde die Bilder aktualisieren, um auch das Original einzuschließen.
Ich hatte mich besonders über den I-Ah gewundert. Das Bild ganz rechts ist ziemlich schlecht, und ich glaube nicht, dass selbst die niedrigste Qualitätseinstellung, die Sie verwenden, Artefakte hervorrufen würde, die auch nur annähernd so hoch sind. Es wäre auch schön zu sehen, wie sich der Konvergenzpunkt bei der Verwendung von zehn Werten 90-99 im Vergleich zur Verwendung von fünf Werten 75-95 verhält, die auf ein Vielfaches von fünf beschränkt sind.
Aktualisiert mit Video von Eeyore ...
Nehmen wir für ein Worst-Case-Szenario an, dass Quant-Werte 10 Primzahlen sind ... 3, 5, 7, 11, 13, 17, 19, 23, 29, 31 ... Der DCT-Koeffizient müsste durch teilbar sein 100280245065 bis das Gleichgewicht erreicht ist. Bei Verwendung von 32-Bit-Darstellungen gibt es keinen Wert ungleich Null, bei dem dies auftreten kann. Das Bild würde unkenntlich werden.

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:

Original, keine JPEG-Komprimierung

Hier ist das Ergebnis von 75 % JPEG:

erstes JPEG

Und hier ist das nochmal gespeichert:

zweiter Durchgang

Diese einzelne Sekundenspeicherung verursacht eine große Menge an zusätzlicher Verschlechterung!

Und hier ist das endgültige konvergierte Bild (8. Durchgang):

konvergiertes jpeg

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

99% 9 mal

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

75 % einmal und dann 99 % 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.

(1) Sie sparen 75 %. Bei dieser Einstellung ist ein Verlust der Bildqualität zu erwarten. (2) Dieses Bild wurde ausgewählt und geändert, um JPEG-Komprimierungsartefakte zu übertreiben. (3) Das Bild konvergiert nach 8 Rekomprimierungsrunden, wonach es keine weitere Verringerung der Bildqualität gibt. (4) Ein Video dieses Bildes, das "Generationsverlust" zeigt, würde nach der ersten 1/4 Sekunde eine ganze Menge nichts passieren lassen.
(1) Ja. (2) „Ausgewählt“ als typisches Foto, bei dem man sich für so etwas interessieren könnte. "Geändert" nur zum Vergrößern. Beachten Sie, dass dies nur zur Anzeige hier dient - ich habe die Größe des Bildes, mit dem ich gearbeitet habe, nicht verdoppelt. (3) Ja, aber in der Praxis für die Bearbeitung sind es die ersten paar Runden, die Sie interessieren könnten. (4) Das stimmt, aber es bedeutet nicht, dass es in irgendeiner Weise nützlich ist, sich dem schlimmsten Fall anzunähern und dort zu bleiben.
Nehmen Sie zum Replizieren das erste Bild und ändern Sie die Größe auf 256 × 256 ohne Resampling oder Interpolation.
Ich kann keinen großen Unterschied zwischen den Bildern sehen, die Sie zeigen . Aber wenn ich den Unterschied zwischen einem einfach rekomprimierten und einem mehrfach rekomprimierten Bild nehme und vergrößere, um es sichtbar zu machen, erhalte ich dieses (viel überzeugendere) Ergebnis: i.stack.imgur.com/57uaY.png (siehe meine gelöschte Antwort darauf, was genau gemacht wurde) Es ist überzeugender, weil die Leute nicht ständig auf das Bild starren müssen, um winzige Unterschiede zu erkennen.
Die Unterschiede sind ziemlich gering. Wenn Sie einen großen LCD-Bildschirm haben, können Artefakte aufgrund des unterschiedlichen „Gammas“, das sich aus leicht unterschiedlichen Betrachtungswinkeln ergibt, stärker hervortreten.
Die Unterschiede mögen absolut gering sein, aber sie sind ziemlich schrecklich in Bezug auf Farbe und Details, insbesondere um die Augen der Kinder und in den Hauttönen. Ich denke, das ist sinnvoller als die abstrakte Darstellung verschiedener Blöcke, denn daraus lässt sich leicht schließen, dass die Gesamtwirkung nur einen kleinen Bruchteil des Frames ausmacht. Ich werde versuchen, eine weitere Erklärung einzufügen.
Die sich zufällig ändernde DQT, Drehungen und andere Bildmanipulationen zwischen den Rekomprimierungszyklen erklären, was in den Videos passiert. Ich kann Ihre Ergebnisse jedoch nicht mit den Bildern für 75-> 75 replizieren. Für 75->99 wird aufgrund der DQT-Änderung ein zusätzlicher Verlust an Bildqualität erwartet.
@xiota Hmmm, du sagst: Ich habe das vergrößerte Original genommen; ließ es durch einen Filter laufen, um bereits vorhandene JPEG-Artefakte zu entfernen; reduzierte seine Größe um 50 %, da dies die ursprüngliche Größe war; und wendete etwas mildes Schärfen an. Das Original sollte keine JPEG-Artefakte enthalten, da es TIFF->PNG war. Und ich denke nicht, dass das Schärfen einen großen Einfluss auf das Experiment haben sollte, aber wenn Sie die Größe ohne Interpolation ändern, sollten Sie das genaue Original ohne Notwendigkeit wiederherstellen.
Ich habe es mit/ohne die zusätzlichen Filter/Schritte versucht. Wenn ich die Bilder übereinanderlege, um die Unterschiede zu sehen, sehe ich nur schwarz. Ohne das wahre Originalbild ist es unmöglich zu sagen, was passiert ist, als Sie das Experiment ursprünglich durchgeführt haben. Vielleicht sollten Sie den Vorgang mit neuen Bildern wiederholen und ohne Vergrößerung zeigen. Es wird nicht so beeindruckend aussehen, aber es wird genauer und reproduzierbar sein.
(Und es wird einfacher sein, auf dieser Seite nach oben und unten zu scrollen.)
neu erstellte Bilder ohne Filter ...
Hmmm. Das ist interessant! Ich probier es bei Gelegenheit mal aus. Immer möglich, dass ich etwas falsch gemacht und versehentlich die Verschlechterung verschlimmert habe.

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.

  • Speichern Sie das Tiff-Bild als JPG95 - .9989
  • Speichern Sie das Tiff-Bild als JPG83 - .9929
  • Speichern Sie das JPG95-Bild zehnmal als JPG95 - .9998
  • Speichern Sie das JPG83-Bild zehnmal als JPG83 - .9993
  • Speichern Sie JPG95 erneut als JPG83 und dann erneut als JPG95 - .9929
  • Speichern Sie JPG95 erneut als JPG83, dann JP83 in JP92, dann JPG92 in JPG86 - .9914

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:

  1. Konvertieren Sie Tiff RGB in 8-Bit-Graustufen
  2. Speichern Sie JPG95 und JPG83 vom Tiff-Original
  3. Führen Sie weitere Resave-Vorgänge wie angegeben durch
  4. Laden Sie Vergleichsbilder und verwenden Sie das SSIM Index Plugin

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.

@xiota, ich verwende ein SSIM-Plugin für ImageJ. Es ist eine der wenigen SSIM-Implementierungen, die eine Anpassung von Parametern ermöglichen (ich habe die Filterbreite auf 8 eingestellt, damit Änderungen innerhalb der 16-Pixel-JPEG-Blöcke mit größerer Wahrscheinlichkeit erkannt werden.) Ich bevorzuge SSIM, da es empfindlicher auf Energieunterschiede reagiert Umverteilung. Ein Differenzbild kann irreführend sein, wenn sich Unterschiede aufheben oder die Unterschiede auf einen kleinen Bereich konzentriert sind.
Und zu Ihrer zweiten Frage, die besagt, dass der Unterschied von JPG95 zu JPG83 zu JPG95 derselbe ist wie von Tiff zu JPG83. Wenn Sie Tiff-JPG95-JPG83-JPG95 wollen, ist das .9923
Versuch mit vier verschiedenen Komprimierungen hinzugefügt. Der Verlust ist noch größer, aber es ist klar, dass die „Konvergenz“, die über mehrere Generationen derselben Komprimierung zu beobachten ist, auch vorhanden ist, wenn mehrere verschiedene Komprimierungen ausprobiert werden. Ich würde dies immer noch gerne in einem App-zentrierten Workflow ausprobieren, aber das erfordert etwas mehr Beinarbeit.
Ein weiteres Problem besteht darin, dass es weder eine Standardzuordnung von „Qualitäts“-Einstellungen zu SSIM-Schwellenwerten gibt, noch gibt es eine Möglichkeit, festzustellen, welche Qualitätseinstellung erforderlich wäre, um einen erheblichen Informationsverlust zu vermeiden. Wenn man ein JPEG lädt und mit einer ausreichend hohen Einstellung speichert, kann ein zusätzlicher Qualitätsverlust vermieden werden, aber die Datei wird wahrscheinlich größer. Wenn man nicht weiß, welche Einstellung verwendet wurde, als eine Datei erstellt wurde, kann es schwierig sein, zu bestimmen, welche Einstellung beim erneuten Speichern verwendet werden soll.

Nichts geht über Experimente. Das folgende Bash-Skript (geschrieben unter Linux, könnte unter OSX funktionieren, wenn Sie ImageMagick haben ):

  • beginnend mit einem ersten Bild (mit dem Namen step000.jpg)
  • nimmt eine JPEG-Datei, fügt einen weißen Punkt hinzu (um zu beweisen, dass es sich um ein neues Bild handelt) und speichert es als (verlustfreies PNG)
  • nimmt das PNG und komprimiert es erneut als JPEG (also komprimieren wir niemals JPEG-zu-JPEG und können nicht vermuten, dass die Software nur codierte Blöcke kopiert)
  • erstellt ein Bild, das die unterschiedlichen Pixel zwischen den beiden JPEGs zeigt
  • spülen und wiederholen, unter Verwendung der JPG-Ausgabe des vorherigen Schritts

Das Ergebnis ist:

  1. Bei hohen JPG-Qualitäten gibt es nicht viel Verlust
  2. Rundungsfehler regeln sich schließlich, nach einer kurzen Anzahl von Generationen verschlechtern sich die Dinge nicht mehr.

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.

Ich war neugierig auf die unterschiedliche Software-Sache. Ich habe versucht, 7x von 7 verschiedenen Software zu speichern. Der Unterschied war ziemlich groß, also habe ich ihn aufgeschlüsselt, um zu sehen, ob jede Anwendung den gleichen Verlust hatte. Eine der Apps war für die gesamte Variation verantwortlich. Nachdem ich den roten Hering entfernt hatte, war das 6-fache Speichern von 6-fachen Programmen dasselbe wie das 6-fache Speichern von ImageJ
Es liegt wahrscheinlich eine schlecht codierte Software vor. Es ist auch möglich, dass das Mischen der Algorithmen verschiedener Apps verhindert, dass sich auch die Rundungsfehler einpendeln.
@xiota, es war ein seltsames kleines Programm namens FLEMinimizer. Ich weiß nicht einmal mehr, warum ich es überhaupt hatte. Die anderen waren ImageJ, Matlab, Photoshop, FastStone Image Viewer, Ifranview und CameraRaw. Zwischen diesen sechs gab es bei jedem Schritt fast keine Abweichung.