Einleitung
kap1: wahrnehmung
kap2: das digitale bild
kap3: die digitale aufnahme
kap4: das jpeg-verfahren
kap5: farbraumveränderung
kap6: dct
kap7: quantisierung
kap8: codierung
kap9: de-codierung
kap10: dateitypen
kap11: jpeg2000
resümee
quellen
autoren


< Kapitel 8 Kapitel 10 >

9 Decodierung der JPEG-Bilddatei


Nachdem jede einzelne 8*8-Pixelmatrix, die 64 Bildpunkte mit je 3 Layers (Helligkeits-, Farbton- und Farbsättigungswerte von 0 bis 255) trägt, die Indexverschiebung, die Diskrete Kosinustransformation, die Quantisierung und die Huffman-Codierung durchlaufen hat, ist die JPEG-Kompression abgeschlossen: Eine Bilddatei mit wenig Speicherplatzbedarf liegt uns vor.

Nun ist die schönste und effektivste Datenkompression sinnlos, wenn die Ursprungsdaten nicht wieder hergestellt werden können: Das JPEG-Format ist natürlich auch decodierbar, sodass die komprimierten Bilder auch wieder angeschaut werden können.

Wie wir jedoch während der letzten Kapitel schon angedeutet haben: Das Ausgangsbild lässt sich nicht zu 100% wiederherstellen, denn wir haben beim Komprimieren ja einen Verlust an Bilddaten in Kauf genommen.

Um das komprimierte Bild nun wieder herzustellen, wird das gesamte bisherige Verfahren "rückwärts" angewandt.


9.1 De-Codierung

Zuerst wird der Binärcode entschlüsselt, den wir nach dem Huffman-Verfahren selbst (oder mit Hilfe von empirischen Codierungs-Tabellen) erstellt haben. Dieses bedarf keiner großen Rechenoperationen, da der Huffman-Code ja die Präfixeigenschaft erfüllt (siehe Kapitel 8.3). Somit ist beim Lesen des Binärcodes für den PC ohne Trennzeichen eindeutig, wann ein Wert aufhört und wann ein neuer anfängt. Welcher Binärcode welcher Zwischendarstellung entspricht, entnimmt der PC beim Lesen der Bilddatei entweder den mitgespeicherten Tabellen oder den programmeigenen empirisch erstellten Tabellen, auf die in der Bilddatei verwiesen wird.

Liegen nun erst einmal die Zwischendarstellungen (wir erinnern uns: in Tripel-Form) vor, können ebenso problemlos die 8*8-Blöcke wieder zusammengesetzt werden, da die Tripel ja angeben, welcher Wert an welcher Stelle innerhalb eines 1*64-Vektors steht und wie viele Nullen ihm vorausgehen. Alle Vektoren sortieren wir nach dem rückwärts angewandten Zick-Zack-Verfahren (siehe Kapitel 8.1) wieder um, sodass wir je eine 8*8-Matrix erhalten, in der die bearbeiteten DCT-Koeffizienten stehen.


9.2 Dequantisierung

Bis hierhin ist die Entschlüsselung der JPEG-Kompression nicht sonderlich schwierig, da es sich um reine, einfache Umkehroperationen handelt, denen man die Binärwerte unterzieht. Nun haben wir also eine Beispiel-8*8-Matrix mit bearbeiteten DCT-Koeffizienten, aus denen wir wieder die ursprüngliche Farbinformationen lesen wollen.

Durch die Dequantisierung können jedoch die ursprünglichen, unbearbeiteten DCT-Koeffizienten nicht wieder korrekt hergestellt werden, da man mit gerundeten Werten arbeitet (siehe Kapitel 7). Es werden die durch Division der DCT-Koeffizienten durch den jeweiligen Quantisierungsfaktor Q(u,v) entstandenen quantisierten Werte mit Q(u,v) multipliziert:

Hierdurch erhält man DCT Koeffizienten, die von den ursprünglichen etwas abweichen.


9.3 Die Inverse Diskrete Kosinustransformation

Durch die inverse DCT werden aus den decodierten und dequantisierten DCT-Koeffizienten nun wieder Pixelwerte hergestellt. Diese Pixelwerte entsprechen natürlich nicht genau den ursprünglichen f(x,y), da im Laufe der Quantisierung Informationen weggefallen sind. Die inverse DCT kann aber im Prinzip, also wenn sie mit den genauen DCT-Koeffizienten arbeiten würde, die ursprünglichen Pixelwerte wieder genau herstellen.

Die Formel der zweidimensionalen inversen DCT lautet:

9.1

Wir haben in Kapitel 6 dargelegt, dass die f(x,y)-Werte als Überlagerung von Kosinusfunktionen aufgefasst werden und dass durch die DCT die Durchschnittsamplituden jeder relevanten Kosinusfunktion berechnet werden. "Überlagerung" bedeutet nun, dass ein f(x,y)-Wert der Summe der Funktionswerte aller berechneten Kosinusfunktionen an der Stelle (x,y) entspricht.

Man erhält aus den Amplituden wieder die f(x,y)-Werte, indem man durch Multiplikation der Amplituden mit dem Kosinus an der Stelle (x,y) die Funktionswerte der Kosinusfunktionen an dieser Stelle berechnet und alle miteinander addiert. Da F(u,v) einem Vielfachen der Durchschnittsamplitude der Kosinusfunktion mit der Frequenz der Nummer (u,v) entspricht, multipliziert man F(u,v) mit obigen Faktoren, wodurch man dann die Durchschnittsamplitude erhält.

Hierbei ist natürlich auffällig, dass die Faktoren, mit denen F(u,v) multipliziert wird, nämlich

9.2

die gleichen sind, die auch schon bei der Forward DCT benutzt wurden. Es ist angenehm, dass man keine neuen Faktoren definieren musste. Das ist auch der Grund dafür, warum die Faktoren von vorn herein so gewählt wurden.

Bevor man bei der Forward DCT die Faktoren benutzt gibt die Summe in 6.18 den Wert

aus, wobei die Durchschnittsamplitude ist.

Durch Anwendung der obigen Faktoren 9.2 erhält man dann für F(u,v):

.

Multipliziert man F(u,v) bei der inversen DCT dann wieder mit den Faktoren 9.2 erhält man also:

Bei der inversen DCT kann man demnach wieder die gleichen Faktoren benutzen, wodurch man die Durchschnittsamplituden erhält, mit denen man dann die Funktionswerte der Kosinusfunktionen ausrechnen kann. Wenn man dann noch diese Funktionswerte aufaddiert, wie in 9.1, erhält man f(x,y). Eine Zurück-Verschiebung in die Wertemenge [0;255] ergibt dann die ursprünglichen, diskretierten Pixel, die Orts- und Farbinformationen tragen - das komprimierte Ausgangsbild (eine Konvertierung zurück in den RGB-Farbraum kann erfolgen).


< Kapitel 8 Kapitel 10 >

Die JPEG-Kompression, Kapitel 9 Sebastian Wickenburg, Aeneas Rooch, Johannes Groß 2002