Understanding Image Compression

Julius Uy
Julius Uy

Follow

Apr 19, 2019 – 7 min read

Bereits in den 1980er Jahren entwickelte Microsoft eine geräteunabhängige Lösung zur Bildwiedergabe für Bitmaps: das BMP-Dateiformat.

Wer früher mit Microsoft Paint gearbeitet hat, wird sich an der gigantischen Dateigröße erfreuen, die durch einfache Striche und Farbfüllungen entsteht. Wenn ich also eine 480×360-Bitmap habe, die 16 Millionen Farben (24 Bits) unterstützt, würde die Bitmap am Ende irgendwo nördlich von 4 MB groß sein.

Abbildung 1 – Die Struktur der Bitmap-Bilddatei (https://en.wikipedia.org/wiki/BMP_file_format)

Das ist natürlich nicht ideal, wenn man mehrere qualitativ hochwertige Bilder rendern möchte. Daher muss die Frage gestellt werden. „Gibt es eine Möglichkeit, die Bitmap-Darstellung so zu optimieren, dass die visuelle Integrität des Bildes erhalten bleibt, aber weniger Ressourcen verbraucht werden?“

Die Antwort ist ja. Es hat sich herausgestellt, dass die meisten Benutzer eher an Bildern als an visuellen Hilfsmitteln interessiert sind als an Gründlichkeit. Nehmen wir zum Beispiel an, ich erhalte ein Bild der Golden Gate Bridge wie folgt:

Abbildung 2 – Golden Gate Bridge

Ich weiß zwar, dass die tatsächliche Brücke, wenn ich sie in natura sehe, weitaus detaillierter ist, aber was ich hier sehe, ist gut genug für seine Zwecke. Die meisten Menschen sind also bereit, die visuelle Integrität gegen die Geschwindigkeit einzutauschen, solange der Kompromiss akzeptabel ist. Wenn z.B. die subjektive visuelle Qualität nur um 1 % abnimmt, der Benutzer aber 90 % Platz spart, ist dies in den meisten Fällen ein willkommener Kompromiss.

Eine der wichtigsten Überlegungen bei der Komprimierung von Bitmaps ist daher die Optimierung auf visuelle Ununterscheidbarkeit. Das heißt, bestimmte Elemente eines Bildes zu entfernen, bei denen das bloße Auge den Unterschied nicht erkennen kann. Dies wird als verlustbehaftete Komprimierung bezeichnet, die bei den meisten Arten der Komprimierung von Videostreams und Online-Bildern zum Einsatz kommt. So funktionieren H.264, HEVC, HEIF und JPEG-Codecs.

Abbildung 3 – Bildkompression optimiert für visuelle Ununterscheidbarkeit

Andere Arten von Bildern wie PNG werden verlustfrei komprimiert. Die Idee dahinter ist, dass man die volle visuelle Integrität des Originalbildes bewahrt, aber weniger Bytes benötigt, um das Gleiche darzustellen. Es gibt aber auch andere Dateiformate wie WebP, die sowohl verlustbehaftete als auch verlustfreie Komprimierung unterstützen. Warum wollen wir verlustfrei komprimieren? Wie oben erwähnt, hängt es davon ab, was wir mit dem Bild erreichen wollen. So werden beispielsweise Icons in Anwendungen in der Regel im PNG-Format (und neuerdings auch im Vektorgrafikformat) gespeichert.

Die verlustfreie Bildkomprimierung führt im Gegensatz zur verlustbehafteten Komprimierung zu einer größeren Dateigröße. Das liegt vor allem daran, dass es für die verlustfreie Komprimierung weniger Möglichkeiten gibt als für die verlustbehaftete. Für die Zwecke dieses Blogs werden wir über verlustbehaftete Kompression sprechen.

Abbildung 4 – Ein Überblick über die JPEG-Kompression

Die allgemeinen Schritte der JPEG-Kompression werden bis heute bei der Videokompression angewandt. Im Laufe der Jahre hat sich der Algorithmus verbessert, aber die allgemeinen Konzepte sind die gleichen geblieben.

STEP 1. Farbraumkonvertierung

Die Bildkonvertierung beginnt mit der Umwandlung des rohen RGB-Bildformats in seine Chroma- (r und b) und Luminanzwerte (Y). Die Idee dahinter ist, dass unsere Augen empfindlicher auf Veränderungen der Helligkeit reagieren als auf Farben. Daher können wir die Farbpalette im Bild verkleinern, ohne die visuelle Qualität des Bildes merklich zu beeinträchtigen. Dies geschieht durch Chroma Subsampling, wie nachstehend erläutert.

SCHRITT 2. Chroma Subsampling

Viele Gamer erinnern sich vielleicht daran, dass Subsampling zu den möglichen Reglern gehört, die sie einstellen können, um ihr Spielerlebnis zu optimieren. Der Grundgedanke ist, dass die Spielleistung umso schneller ist, je mehr Subsampling man vornimmt. Das liegt daran, dass das Spiel weniger Farben zum Rendern benötigt.

Die Unterabtastung von Chroma wird mit J:a:b bezeichnet, wobei J die Anzahl der zu unterabtastenden Pixel, a die Pixel der oberen Reihe und b die Pixel der unteren Reihe darstellt.

Abbildung 5 – Chroma Subsampling

Im Fall von 4:4:4 bedeutet dies, dass in einem 4×2-Pixel-Bild die erste Reihe (a) 4 Farben haben muss und die zweite Reihe ebenfalls. Im Fall von 4:2:2 bedeutet dies, dass in einem 4×2-Pixel-Bild die erste Reihe durch zwei Farben dargestellt werden muss und die zweite Reihe ebenfalls. Im Falle von 4:2:0 bedeutet dies, dass in einem 4×2-Pixel-Bild die erste Reihe durch zwei Farben dargestellt wird und die zweite Reihe die erste Reihe kopiert.

Wie Sie sehen, kann man durch Chroma-Subsampling die Farbpalette um bis zu 75 % reduzieren.

SCHRITT 3: Diskrete Cosinus-Transformation

Die JPEG-Kompression wird durchgeführt, indem das Originalbild in 8×8-Pixel-Stücke zerlegt wird. In diesem Schritt werden Koeffizienten für die 8×8-Blöcke auf der Grundlage der unten dargestellten Signale zugewiesen.

Abbildung 6 – Diskrete Cosinus-Transformation (DCT). Das linke Bild ist eine 8×8 Signalreferenz, die zur Gewichtung des Originalbildes verwendet wird. Das rechte Bild ist das Ergebnis nach der DCT.

Die Idee dahinter ist, dass das menschliche Auge das DCT-Signal umso schwerer wahrnehmen kann, je weiter es sich von oben links nach unten rechts bewegt. Bei der Zuweisung von Koeffizienten wird also in der Regel der oberen linken Seite ein sehr hoher Wert zugewiesen, der mit zunehmender Diagonale abnimmt.

So könnte es im Zahlenformat aussehen:

Abbildung 7 – Ursprüngliches Stück (links) Neues Stück nach Anwendung der DCT (rechts)

SCHRITT 4. Quantisierung

Nach der Anwendung der DCT wird der nächste Schritt als Quantisierung bezeichnet. Hier wird eine Quantisierungstabelle auf die resultierenden DCT-Werte angewendet. Die Tabelle unterscheidet sich von Kompressionsalgorithmus zu Kompressionsalgorithmus, und manche Software erlaubt es dem Benutzer, die Menge der Quantisierung einzustellen, die er verwenden möchte. Nachstehend eine Standardtabelle:

Abbildung 8 – Eine Standard-Quantisierungstabelle

Beachten Sie, dass die Ziffern höher werden, wenn man sich von oben links nach unten rechts bewegt. Dies ist beabsichtigt. Die Idee der Quantisierung ist, dass die aus der DCT resultierenden Daten durch die Quantisierungstabelle geteilt werden. An dieser Stelle verliert das komprimierte Bild einen Großteil seiner Daten. Da die Zahlen unten rechts hoch sind, werden die meisten Werte nach der Division schließlich zu Null. So könnte es aussehen:

Abbildung 9 – Quantisierungstabelle (links) Resultierende Werte (rechts)

STEP 5. Entropiekodierung mit Huffman-Kodierung

Die Huffman-Kodierung ist der letzte Schritt der Kompression. So funktioniert sie.

Angenommen, ich möchte einen Bereich von Zahlen mit Bits darstellen. Außerdem möchte ich sie so darstellen, dass ich die geringste Menge an Bits für die Darstellung verbrauche. Das könnte so aussehen, dass die Zahlen, die sich häufig wiederholen, niedrigere Bits erhalten. Wenn zum Beispiel die Null häufig dargestellt wird, würde ich ihr im Allgemeinen niedrigere Bits zuweisen. Eine ausführlichere Erklärung der Huffman-Kodierung finden Sie hier.

Die Idee dahinter ist, dass man weniger Bits verwendet, um eine längere Reihe von Werten darzustellen. Die Huffman-Kodierung ist ein verlustfreier Kompressionsalgorithmus, der auch bei der Komprimierung von Textdateien verwendet wird. Auf diese Weise ist es möglich, bis zu 50 % der ursprünglichen Größe einzusparen.

Was kommt als nächstes?

Die Komprimierung ist nur ein Teil der Gleichung. Wenn das Bild gerendert werden soll, muss der Komprimierungsprozess umgekehrt werden, bevor das Bild auf dem Bildschirm dargestellt werden kann.

JPEGs sind etwa 90 % kleiner als ihr Bitmap-Gegenstück. Bis heute ist es das populärste Bildkompressionsformat auf dem Markt. Neuere Algorithmen wie HEIF (2013) und AVIF (2018) erhöhen den Bereich der Pixel, die man für den Kompressionsalgorithmus verwenden kann.²

Trotz der Beliebtheit von JPEG bieten neuere Formate eine bessere Kompression. WebP zum Beispiel ist im Allgemeinen etwa 70 % so groß wie JPEG und kann dennoch die visuelle Integrität des Bildes beibehalten. Aus diesem Grund hat Google (das Unternehmen, das WebP entwickelt hat) Entwickler dazu angehalten, ihre Bilder von JPEG in WebP umzukodieren. Die Unterstützung für WebP ist jedoch immer noch geringer als für JPEG. Daher ist es notwendig, beide Formate zu unterstützen.

¹ „The BMP File Format.“ Prepressure. Accessed April 19, 2019. https://www.prepressure.com/library/file-formats/bmp.

² Netflix hat 2018 den ersten Satz von AVIF-Bildern veröffentlicht. Zum Zeitpunkt dieses Beitrags sind die Bilder immer noch hier verfügbar. Unternehmen wie Firefox und Microsoft werden dieses Bild bald in ihren Softwareangeboten unterstützen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.