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


Resümee


Bilder werden digitalisiert, indem sie räumlich und farblich diskretiert werden, das heißt, sie werden in quadratische Bildpunkte, so genannte Pixel, zerlegt. Jeder Bildpunkt enthält eine Orts- und eine Farbinformation. Ein digitales Bild  ist demnach als eine Matrix zu verstehen, die  Zeilen und  Spalten, also  Pixel hat, wobei    und . Die Elemente  des Bildes  sind die Pixel, die den Grauwert oder die Farbe des Bildpunktes an der Stelle  angeben.

Beim Digitalisieren bestimmen Rasterung und Quantisierung das Aussehen des digitalen Bildes: Die Rasterung definiert die Größe eines Bildbereichs, die 1 Pixel zugeordnet wird, die Quantisierung gibt an, wie viele Farbinformationen ein Pixel aufnimmt (2=Schwarz/weiß; 256 Graustufen=normales Graubild; 16,7 Mio. Farben=normales Farbfoto). Die Auflösung eines Bildes, das heißt, wie groß ein Pixel ist, bzw. wie viele Pixel auf ein bestimmtes Maß passen, wird in dpi angegeben: Dots per Inch (Pixel pro Inch).

Wird nun ein digitales Farbbild gespeichert, so besitzt es 3 Schichten (Layers), die jeweils eine Farbinformation tragen: Eine speichert die Rot-, eine die Grün- und eine die Blauwerte, die jeweils zwischen 0 und 255 liegen. Dies ist das gängige RGB-Modell. Wenn ein RGB-Bild ohne Qualitätsverlust gespeichert wird (zum Beispiel im TIFF- oder im BITMAP-Format), so wird viel Speicherplatz benötigt: Jeder Pixel kann 2563 verschiedene Werte annehmen (256 für jeden Layer), die binär codiert werden müssen und entsprechend Platz in Anspruch nehmen.

Wenn nun der Speicherbedarf eines Bildes mit der JPEG-Kompression reduziert wird, werden verschiedene Mittel genutzt, den Speicherumfang zu verringern.

Die vorhandenen RGB-Bilddaten werden zunächst in den YUV- oder YCbCr-Raum übertragen. Statt eine Farbinformation über Rot-, Grün- und Blauwerte darzustellen, wird sie durch Helligkeit, Farbton, Farbsättigung (YUV), bzw. durch Helligkeit, Abweichungen vom Grau- zum Blauwert und Abweichung vom Grau- zum Rotwert (YCbCr) ausgedrückt.

Y = 0,299R + 0,587G + 0,114B
U = 0,493(B - Y)
V = 0,877(R - Y)

bzw.

Y = 0,299R + 0,587G + 0,114B
Cb = -0,1687R - 0,3313G + 0,5B + 128
Cr= 0,5R - 0,4187G - 0,0813B + 128

In den beiden Farbräumen YUV und YCbCr kann man sich zu Nutze machen, dass das menschliche Auge für Helligkeitsunterschiede empfindlicher ist als für Farbunterschiede; daher werden die Helligkeitswerte genauer gespeichert als die anderen Informationen: Es wird ein Subsampling vorgenommen, indem mehrere Farbwerte gemittelt werden und dieser gemittelte Wert stellvertretend für die Originalwerte gespeichert wird. Die gängigsten Subsampling-Verhältnisse sind 4:2:2 und 4:1:1, was bedeutet, dass, während die Y Werte, also die Helligkeitswerte, mit voller Auflösung gespeichert werden, die beiden Farbwerte U, V oder Cb, Cr nur mit jeweils halber bzw. viertel Auflösung gespeichert werden. Für sie werden 4 Werte zu zwei bzw. zu einem gemittelt.

Was nun folgt, ist die Indexverschiebung, die die 256 Werte aus der Wertemenge [0; 255] in die Wertemenge [-128;127] verschiebt. Für die folgenden Operationen zerlegt man das Bild außerdem in seine einzelnen Layer und diese jeweils in 8*8-Pixel-Blöcke. Diese enthalten Pixelwerte aus Wertemenge [-128;127], die durch eine Funktion f(x,y) beschrieben werden, wobei x und y die Koordinaten des Pixels sind.

Auf diese Werte wendet man die zweidimensionale diskrete Kosinustransformation (DCT) an. Die Formel hierfür lautet:

Bei der DCT werden die f(x,y) Werte als Resultat von überlagerten Kosinusfunktionen interpretiert. Wenn man nun ein gewisses f(x,y) als Wert einer Kosinusfunktion einer bestimmten Frequenz und Amplitude am Ort (x,y) festlegt, kann man f(x,y) schreiben als

Für die gleiche Frequenz, gemeint sind damit die beiden Frequenzen in den zwei Dimensionen, kann man dies auch für alle anderen (x,y) festlegen. Da die f(x,y) Werte in natürlichen Bildern gewöhnlicherweise nicht genau eine bestimmte zweidimensionale Kosinusfunktion beschreiben, erhält man für die verschiedenen (x,y) unterschiedliche Amplituden. Ein f(x1,y1) muss dann durch die Kosinusfunktion der vorausgesetzten Frequenzen (u,v) mit der Amplitude Au,v(x1,y1) entstanden sein, ein f(x2,y2) durch eine mit Au,v(x2,y2). Durch Einsetzten des neuen Ausdrucks für f(x,y) erhält man:

Diese Formel errechnet nun einen Wert, der für das Vierfache eines Mittelwertes aller Amplituden für die bestimmte Frequenz angibt. Dieser Mittelwert ist normalerweise nicht arithmetisch, da die quadrierten Kosinuswerte gewöhnlich nicht für jeden Ort gleich 0,5 sind. Für ist F(u,v) um den Faktor   größer als ein solcher Mittelwert. Außerdem berechnet man mit obiger Formel für F(0,0) das Achtfache des arithmetischen Mittelwertes aller f(x,y).

Da das F für eine bestimmte Frequenz (u,v) nur eine Art Mittelwert angibt, lässt sich durch diesen Wert nicht das ursprüngliche f(x,y) wiederherstellen. f(x,y) ist nicht hinreichend durch das F einer u,v Kombination beschrieben. Deshalb werden mehrere F(u,v) Werte berechnet, aus denen dann später die originalen f(x,y) berechnet werden können.

Die F(u,v) Werte werden nun noch quantisiert, indem man sie durch Quantisierungsfaktoren Q(u,v) einer Quantisierungstabelle dividiert und auf die nächste Integerzahl rundet:

Damit wird erreicht, dass viele hohe Frequenzen, die durch kleine Werte repräsentiert werden, durch das Teilen mit großen Faktoren und das anschließende Runden gleich Null werden, was bei der nun folgenden Codierung Vorteile und Platzersparnis bringt.

Bei der Codierung geht es darum, die Koeffizienten des 8*8-Blocks mit einem einzigartigen Binärcode zu verschlüsseln. Dazu wird die so genannte Huffman-Codierung herangezogen, mit der dies optimal möglich ist.

Im ersten Schritt werden die Werte der Matrix in eine Lauflängen-Zwischendarstellung gebracht, die angibt, wie viele Nullen einem bestimmten Wert vorangehen (damit werden lange Folgen von Nullen möglichst Platz sparend zusammengefasst), wie viele Bits zur Speicherung des Wertes notwendig sind und was der Wert selbst ist. Jeder Wert ungleich 0 wird demnach als Tripel (3-Tupel) zwischendargestellt.

Diese Zwischendarstellungen werden nun stochastisch ausgewertet, d. h. es werden die relativen Häufigkeiten der Werte aufgelistet. Um zu codieren, werden nun immer den beiden Werten mit den kleinsten Wahrscheinlichkeiten der Code 0 und 1 zugeordnet. Im nächsten Schritt wird den bereits entstandenen Codes diese 0 oder 1 vorangestellt (die jeweils neu verschlüsselten Werte erhalten wieder eine einzelne 0 oder 1 als Code, dem dann ggf. weitere Symbole vorangestellt werden). So wird mit den Werten weiter verfahren, bis allen ein einzigartiger Binärcode zugeteilt ist, der am so entstandenen Huffman-Baum abgelesen werden kann. So werden den am häufigsten auftretenden Werten kurze Codes zugeteilt, weniger häufig vorkommenden hingegen lange Codes. Um nicht für jedes Bild und jede Matrix aufwendig neue Codes zu kreieren, werden häufig bereits fertige Verschlüsselungstabellen benutzt, die auf empirischen Daten beruhen und im Großen und Ganzen eine recht ordentliche Codierung bieten. Dieser Binärcode, der die Präfixeigenschaft besitzt (d.h. die codierten Symbole sind eindeutig und kein Code kommt am Anfang eines anderen Codes vor), kann dann ohne Trennzeichen Tripel-Wert für Tripel-Wert zusammengesetzt werden und stellt so die Codierung der 8*8-Blöcke dar.

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

Zuerst wird also der Binärcode entschlüsselt, was anhand der Codierungs-Tabellen ja ohne weiteres möglich ist: Da der Code die Präfixeigenschaft erfüllt, ist eindeutig, welcher Code zu welcher Zwischendarstellung gehört; dem angewandten Huffman-Verfahren ist es eigen, dass die lange Code-Kette ohne Probleme oder Verwechslungen wieder in die richtigen einzelnen Ausgangswerte zerlegt werden kann. Anhand der entschlüsselten Zwischendarstellungen (in Tripel-Form) können nun wieder die 8*8-Blöcke zusammengesetzt werden, da die Tripel ja angeben, welcher Wert an welcher Stelle steht und wie viele Nullen ihm vorausgehen.

Durch die Dequantisierung der nun vorliegenden Werte, also durch Multiplikation mit dem jeweiligen Quantisierungsfaktor, können die ursprünglichen DCT Koeffizienten nur mit Abweichungen wiederhergestellt werden, da ja nach dem Quantisieren gerundet wurde. Dieses macht sich in der Bildbeschaffenheit bemerkbar: Je stärker anfangs quantisiert wurde, desto mehr Ungenauigkeiten und auch Fehler (so genannte Artefakte) hat das Bild am Ende.

Jeder der 64 nun erhaltenen F(u,v) Werte pro 8*8-Matrix ist ein Vielfaches einer Durchschnittsamplitude, aus der für einen konkreten Ort (x,y) mit Hilfe der Kosinusfunktion ein ganz bestimmter Wert f'u,v(x,y) erzeugt werden kann, der, unabhängig von den Ungenauigkeiten der Dequantisierung, normalerweise nicht dem ursprünglichen Pixelwert f(x,y) entspricht. Der Grund dafür ist offensichtlich: Die F(u,v) Werte sind Vielfache der Durchschnittsamplitude für alle Orte, welche normalerweise nicht der zu (x,y) gehörenden Amplitude Au,v(x,y) entsprechen, durch die mit Hilfe der Kosinusfunktion der Wert f(x,y) hergestellt werden kann. Würden die F(u,v) Werte nicht den Vielfachen sondern den Durchschnittsamplituden entsprechen, würde man durch Addition aller f'u,v(x,y) für einen konkreten Ort und für alle Frequenzen den ursprünglichen Wert f(x,y) erhalten. Die verschiedenen F(u,v) Werte entsprechen aber bestimmten Vielfachen der Durchschnittsamplituden, weshalb jeder noch mit einem Faktor verkleinert werden muss, bevor man ihn anwendet, um ein f'u,v(x,y) zu berechnen. Dieser Faktor ist

Jetzt erst offenbart sich nämlich der Grund für die Wahl dieser Faktoren bei der DCT. Allein durch die Summen in der Formel

erhält man nämlich Werte, die um den Faktor

größer sind als die jeweilige Durchschnittsamplitude. Für die Berechnung von F(u,v) multipliziert man diese deshalb mit den oben genannten Faktoren. Für F(u,v) erhält man dann

also ein Vielfaches der Durchschnittsamplitude für die Frequenz (u,v).

Um die Durchschnittsamplitude zu erhalten und um die davon abhängigen f'u,v(x,y) zu erhalten, multipliziert man jedes F(u,v) bei der inversen DCT wieder mit dem gleichen Faktor, der schon bei der forward DCT benutzt wurde. Man erhält dann:

Diese Durchschnittsamplitude kann man nun benutzen, um die f'u,v(x,y) zu berechnen, die dann aufaddiert werden, um f(x,y) zu erhalten:

Die erhaltenen f(x,y) Werte repräsentieren nach dem Verschieben in die Wertemenge [0;255] wieder Helligkeits- und Farbwerte, die dann (Layer für Layer und Matrix für Matrix zusammengesetzt) als Bild dargestellt werden können.


Im Folgenden gibt es eine Druckversion dieser Arbeit. Die Datei liegt im PDF-Format (73 Seiten, ca. 1,7 MB) vor, Sie benötigen einen Acrobat Reader, um sie zu lesen und zu drucken.
Normaler Klick: die Datei wird - wenn möglich - geöffnet.
Klick mit der rechten Maustaste, "Ziel speichern unter...": Die Datei wird auf Ihrer Festplatte gespeichert (empfohlen).

Druckdatei der Arbeit


Die JPEG-Kompression, Resümee Sebastian Wickenburg, Aeneas Rooch, Johannes Groß 2002