Technik - das JPEG-Format
- Das DCT Basismuster
JPEG-Kompression ist ein mehrstufiger Prozess, der aus folgenden Schritten besteht:
- DCT (Diskrete Cosinus-Transformation)
- Quantisierung
- Coding Model (Zigzag Scan)
- Entropy Coding (Huffman), siehe Kompression.
Eine Bemerkung über den Farbraum
Bei JPEG wird nicht der bekannte RGB-Farbraum verwendet, sondern der YUV-Farbraum:
- Y - Luma (Werte von 0 bis 255), die sog. Leuchtdichte
- U - 1. Chrominanz-Komponenete (Werte -128 bis +128), die sog. Farbdifferenz
- U - 1. Chrominanz-Komponenete (Werte -128 bis +128)
Der Vorteil: die Bildinformation ist immer im Luma konzentriert, was bedingt, dass die Y-, U- und V-Werte weniger korrelieren und separat kodiert werden können. Eine Datenreduzierung erlaubt das auch gleich, da das menschliche Auge verzeiht, wenn die U- und V-Werte weniger dicht aufgezeichnet werden. Daher wird in sowohl horizontaler als auch vertikaler Richtung von nur jedem zweiten Pixel der U- und V-Wert gesampelt. Der erste Schritt ist also meist die Konversion von RGB-Koordinaten in YUV-Koordinaten und Weglassung der U- und V-Komponenten bei jedem zweiten Pixel. Siehe näheres zum YUV-Modell und seinen physiologischen Faktoren unter Prinzip des YUV-Farbmodells in der Wikipedia.
Diskrete Cosinus-Transformation (DCT)
Für jede Farbkomponente getrennt, wird das Bild in 8x8-Pixelblöcke unterteilt und um 0 zentriert (durch Subtraktion von 2Bit-Tiefe - 1). Da sich meistens die Werte innerhalb der Blöcke nur wenig ändern, kann durch eine geeignete Transformation - eben die diskretet Cosinus-Transformation - diese Information mit wenigen sogenannten Fourier-Koeffizienten dargestellt werden. Ein Vergleich mit der Frequenzdarstellung bei HiFi-Anlagen drängt sich da nicht ungebührlich auf.
Die Relevanz der DCT für die JPEG-Codierung soll an einem Beispiel erläutert werden. Man stelle sich bitte nebenstehenedes Schema als ein etwas stilisiertes Bild einer Pizza vor (-10 entspricht außerhalb, 10 innehalb der "Pizza"):
Unterwirft man dieses "Bild" einer DCT erhält man das untere Bild.
Was fällt auf? Die dem Betrag nach großen Werte sind jetzt links oben konzentriert, die meisten sind null oder nahe null! Das liegt daran, dass der Anwendung der DCT ein Trick zugrunde liegt, nämlich: das 8x8-Pixelmuster wird symmetrisiert. Dadurch zwingt man die Bildinformation in die niedrigen Frequenzkoeffizienten. Genaueres findet man (wenn man will) unter DCT.
Die Abbildung des DCT-Basismusters rechts oben visualisiert übrigens die Frequenzen der ersten 64 Koeffizienten einer 2-dimensionalen DCT.
Quantisierung
Das ist der entscheidende Schritt, wo Verluste in Kauf genommen werden. Hier werden die im vorigen Schritt ermittelten DCT-Koeffizienten herunterskaliert und gerundet. Kleinere Zahlenwerte brauchen ja sicher weniger Speicherplatz! Jeder DCT-Koeffizient Fij wird dabei durch einen Faktor Qij dividiert, der durch die Empfindlichkeit des menschlichen Auges für Helligkeitsänderung bei der jeweiligen Frequenz bestimmt, also heuristisch ermittelt ist. Die Qij werden auch durch den sog. Q(uality)-Faktor bestimmt, den man beim Konvertieren bspw. im Photoshop angeben kann. Er bestimmt die Qualität des Resultats. Das Ergebnis wird dann abgerundet, sodass kleine Werte bspw. zu null werden.
Ergebnis dieses Schritts sind also Zahlen, die, wenn überhaupt von Null verschieden, in den niedrigen Koeffizienten konzentriert sind.

Zigsag-Scan & Entropy Coding
Die bei der Quantisierung erhaltenen Matrix wird nun in nebenstehendem Zigsag-Scan abgetastet, was die Matrix zu einer Kette von Zahlen transformiert. in der die von Null verschiedenen am Anfang stehe. Diese Quelle wird dann run-length-codiert und anschließend mit der Huffman-Codierung verlustfrei komprimiert (siehe Kompression) - fertig ist das JPEG.