2013-02-12 6 views
6

Ich bin mir bewusst, dass JPEG-Komprimierung verlustreich ist. Ich habe 2 Fragen:Erneutes Kodieren von JPEG-Bildern ist eine idempotente Operation?

eine Operation T Gegeben:
1. Nehmen Sie ein JPEG-Bild 80
2. Decode es zu einem Byte-Puffer
3. Encode gegeben Bytepuffer als JPEG-80

Ist T eine idempotente Operation in Bezug auf die visuelle Qualität? Oder wird sich die Qualität des Bildes verschlechtern, wenn ich T wiederhole? Gilt das auch für den JPEG-XR-Codec?

Vielen Dank!

Bearbeiten: Da es widersprüchliche Antworten gab, wäre es toll, wenn Sie Referenzen geben könnten!

+0

Ich weiß es nicht sicher, aber ich würde nicht darauf zählen. Vor allem zwischen verschiedenen Motoren. Selbst bei einer einzigen Maschine führen die Annäherungen möglicherweise nicht zur selben Region, wenn sie zweimal angewendet werden. –

+1

würde ich nein sagen. Nach jeder Kodierung zu JPEG wird es mehr "Verlust" geben. – leppie

Antwort

1

Wenn Sie dieselbe JPG-Komprimierungs-Engine mit den gleichen Einstellungen verwenden, ist diese im Allgemeinen idempotent. Ich weiß nicht, ob das garantiert ist, aber ich denke, die meisten Implementierungen kümmern sich darum. Ich weiß sicher, dass die Implementierungen mit der Java-Laufzeit idempotent sind.

+0

Ich benutze die WIC-API: http://msdn.microsoft.com/en-us/library/windows/desktop/gg430027(v=vs.85).aspx – Sau

+0

Ich nehme an, dass Dave versuchte, das JPEG-Bild ohne zu kodieren es zuerst in eine Bitmap umwandeln, so dass diese Beweise nicht sehr überzeugend sind. Ich bin nicht mit beiden API vertraut, aber ich vermute, dass die Java JPEG Encoder-Implementierung, die Dave verwendet, wahrscheinlich "schlau" genug ist, um ein JPEG-Bild nicht erneut zu kodieren, wenn es sich daran erinnert, es vorher zu kodieren. Immerhin ist eine erneute Kodierung eines JPEGs normalerweise nicht wünschenswert, daher wäre es sinnvoll, dass die API einem möglicherweise häufigen Missbrauch der Funktion gegenüber tolerant ist, obwohl sie wahrscheinlich eine Warnung ausgeben sollte, um klar zu sein, was gerade unter der Haube passiert . " – StockB

2

Definitionsgemäß verwirft eine verlustbehaftete Operation Daten, indem sie die Darstellung in einer Weise vereinfacht, die (im Idealfall) für den Endbenutzer nicht wahrnehmbar ist. Der Encoder hat jedoch keine magische Methode, um zu bestimmen, welche Pixel wichtig sind und welche nicht, also codiert er alle Pixel gleich, selbst wenn es Artefakte sind!

Mit anderen Worten behandelt der Encoder das verlustbehaftete komprimierte Bild genauso wie ein verlustfreies Bild. Das verlustbehaftete Bild wird weiter vereinfacht, indem zusätzliche Daten im Prozess verworfen werden, da der Benutzer für alle Encoder weiß, dass er darstellt, um die Artefakte darzustellen.

Hier sind einige Beispiele von Verlust JPEG-Generation:

http://vimeo.com/3750507

http://en.wikipedia.org/wiki/File:JPEG_Generarion_Loss_rotating_90_(stitch_of_0,100,200,500,900,2000_times).png

+3

Es ist nicht so einfach. JPEG wirft nicht immer Informationen weg, es quantisiert sie. Wenn die Eingabedaten mit den quantisierten Daten übereinstimmen, ändert sich das überhaupt nicht. Es ist etwas ähnlich wie die Anzahl der Farben im Bild zu reduzieren - wenn das Eingabebild bereits wenige Farben hat, wird es sich nicht ändern (außer dass JPEG auf DCT-Frequenzen statt auf Farben arbeitet). – Kornel

+0

Das würde erklären, warum das Beispiel von Wikipedia das Bild um 90º gedreht hat. Sie sollten das in eine Antwort einfügen oder meins bearbeiten. – StockB

1

Es ist nicht garantiert, aber es kann passieren. Vor allem, wenn Sie den encode -> decode -> encode -> decode-Prozess mehrmals wiederholen, wird er sich schließlich auf einen Fixpunkt einstellen und die Qualität nicht mehr verlieren (solange Sie bei der gleichen Qualität und dem gleichen Encoder bleiben).

JPEG-Codierung in mehreren Schritten durchgeführt wird:

  1. RGB zu YUV-Umwandlungs
  2. DCT (Änderung in den Frequenzbereich)
  3. Quantisierung (Bits der DCT Wegwerfen)
  4. Lossless Kompression

Und Decodierung ist der gleiche Prozess rückwärts.

Die Schritte 1 und 2 haben Rundungsfehler (besonders bei geschwindigkeitsoptimierten Encodern mit Integer-Mathe), so dass Sie bei idempotentem Re-Encoding Glück haben müssen, wenn die Rundungsfehler von Codierung und Decodierung klein sind oder sich gegenseitig aufheben.

Der Schritt 3, der der verlustreiche Hauptschritt ist, ist tatsächlich idempotent. Wenn Ihre decodierten Pixel in ähnlich genug DCT konvertiert werden, wird es wieder zu den gleichen Daten quantisieren!

JPEG XR verwendet auch YUV, daher kann es Rundungsfehler geben, aber OTOH anstelle von DCT verwendet eine andere Transformation, die ohne Rundungsfehler berechnet werden kann. Daher sollte JPEG-XR einfacher als andere sein Formate.