permalink

0

Diskrete Cosinus Transformation (DCT)

Die DCT ist ein Schritt inner­halb des »Base­line Codec«, ein stan­dar­di­sier­tes Kom­pres­si­ons­ver­fah­ren des JPEG-Standards.

Die­sen Arti­kel habe ich zusam­men mit Jens Becker ver­fasst. Jens Becker ist Java-Programmierer und Experte für ser­ver­sei­tige Pro­gram­mie­rung mit PHP und MySQL.

Zum Sei­ten­an­fang

Unbe­ar­bei­tete Gra­fi­ken sind oft­mals zu groß, um sie im World Wide Web zu ver­öf­fent­li­chen oder in grö­ße­rer Zahl auf einem begrenz­ten Daten­trä­ger wie zum Bei­spiel einer Dis­kette spei­chern zu kön­nen. Um die Daten­größe zu ver­rin­gern, wer­den Gra­fi­ken kom­pri­miert. Die Grund­idee aller Kom­pres­si­ons­ver­fah­ren ist immer die­selbe: Man sucht nach redun­dan­ten Infor­ma­tio­nen, wie zum Bei­spiel Ähnlich­kei­ten oder sich wie­der­ho­lende Mus­ter, die dann her­aus­ge­rech­net wer­den, mög­lichst ohne die Bild­qua­li­tät zu ver­rin­gern. Es wird zwi­schen infor­ma­ti­ons­er­hal­ten­den Ver­fah­ren und ver­lust­be­haf­te­ten Ver­fah­ren unter­schie­den. Das Gra­fik­for­mat JPEG zum Bei­spiel bie­tet ein stan­dar­di­sier­tes ver­lust­be­haf­te­tes Kom­pres­si­ons­ver­fah­ren, den soge­nann­ten Base­line Codec, der im wesent­li­chen aus 5 Schrit­ten besteht:

  1. Kon­ver­tie­rung in den YCbCr- Farb­raum
  2. Farb-Subsampling
  3. Dis­krete Cosi­nus Trans­for­ma­tion (DCT)
  4. Quan­ti­sie­ren der DCT-Koef­fi­zi­en­ten
  5. Kodie­ren der Koeffizienten

Die ein­zel­nen Schritte wer­den im fol­gen­den kurz dargestellt.

Zum Sei­ten­an­fang

Kon­ver­tie­rung

Das YCbCr-Modell ist ein Helligkeit-Farbigkeit-Modell. Ein Farb­wert wird durch eine Grund­hel­lig­keit (Y) und des­sen Abwei­chung von Grau in Rich­tung Blau (Cb) und Rot (Cr) bestimmt. Die meiste Infor­ma­tion liegt in der Grund­hel­lig­keit, sodass man nur noch die Abwei­chun­gen nach Rot und Blau dar­zu­stel­len braucht.

Zum Sei­ten­an­fang

Farb-Subsampling

Das Auge kann feine Unter­schiede neben­ein­an­der lie­gen­der Werte Cb bzw. Cr nur sehr schlecht wahr­neh­men. Daher wer­den die Farb­werte für Berei­che von übli­cher­weise 2 x 2 Pixeln gemit­telt, sodass nicht der Farb­wert jedes Punk­tes kodiert zu wer­den braucht.

Zum Sei­ten­an­fang

DCT

Eine Gra­fik wird bei der Kom­pri­mie­rung mit Blö­cken zu je acht mal acht Pixeln geras­tert. Ein sol­cher Block wird nun als Vek­tor, beste­hend aus 64 Pixel­wer­ten (den Koef­fi­zi­en­ten) eines geeig­ne­ten Vek­tor­raums inter­pre­tiert. Jeder Block wird mit­tels der Dis­kre­ten Cosi­nus Trans­for­ma­tion nach fol­gen­den For­meln bear­bei­tet (ohne die For­meln jetzt näher erläu­tern zu wollen):

For­ward DCT:

Inverse DCT:

Dabei wer­den die 64 Pixel­werte in 64 Fre­quenz­be­rei­che Svu (mit v, u {0 … 7}) umge­setzt, die somit eine zwei­di­men­sio­nale Fre­quenz wie­der­ge­ben. S00 wird als DC-Koef­fi­zi­ent bezeich­net und ent­spricht dem Fre­quenz­an­teil 0 in bei­den Ach­sen. Er bestimmt den Grund­farb­ton für die gesamte Daten­ein­heit. Die übri­gen Svu wer­den AC-Koef­fi­zi­en­ten genannt.

Große regel­mä­ßige Flä­chen im Bild schla­gen sich in nied­ri­gen Fre­quenz­an­tei­len nie­der, feine Details und genaue Auf­lö­sung von Farb­un­ter­schie­den in hohen. Die DCT nutzt die Schwä­chen des mensch­li­chen Auges und fil­tert die hohen Orts­fre­quen­zen her­aus, die das Auge ohne­hin nicht wahr­neh­men kann. Da sich benach­barte Pixel­werte in der Regel kaum unter­schei­den, wer­den nach der DCT nur der DC-Koef­fi­zi­ent und einige nie­der­fre­quente AC-Koef­fi­zi­en­ten grö­ßere Werte anneh­men. Die ande­ren Koef­fi­zi­en­ten wer­den fast Null oder meis­tens sogar gleich Null sein. Es müs­sen dar­auf­hin also nur kleine Zah­len kodiert wer­den, was bei geeig­ne­ter Dar­stel­lung bereits einen Kom­pri­mie­run­geffekt hat.

Zum Sei­ten­an­fang

Quan­ti­sie­rung

Auf die DCT folgt die Quan­ti­sie­rung. Die DCT-Koef­fi­zi­en­ten wer­den durch einen Quan­ti­sie­rungs­fak­tor geteilt und auf den nächs­ten Inte­ger­wert gerun­det. Der DC-Koef­fi­zi­ent, der den Farb­mit­tel­wert des Blocks (und damit die Haupt­in­for­ma­tion) ent­hält, wird nicht divi­diert. Die Umkehr­ab­bil­dung mul­ti­pli­ziert den quan­ti­sier­ten Wert spä­ter ein­fach wie­der mit dem Quan­ti­sie­rungs­fak­tor. Durch die dabei ent­ste­hen­den Run­dungs­feh­ler gehen Infor­ma­tio­nen ver­lo­ren. Bei JPEG kann man den Grad der Kom­pres­sion wäh­len, dabei wird ein­fach nur der Quan­ti­sie­rungs­fak­tor ent­spre­chend ska­liert. Eine Kom­pres­sion von klei­ner 1/10 ist ohne gro­ßen Infor­ma­ti­ons­ver­lust mög­lich, zu starke Kom­pri­mie­rung führt aller­dings zu Arte­fak­ten, das bedeu­tet, dass die Block­struk­tur des Gesamt­bil­des sich­bar wird. Das Bild wirkt "pixelig".

Zum Sei­ten­an­fang

Kodie­rung

Die abschlie­ßende Kodie­rung erzeugt arbei­tet die 64 Werte in einer Zick-Zack-Kurve ab und erzeugt so einen Bit­strom von 64 Integer-Werten. Der erste Wert ist der DC-Koef­fi­zi­ent, aller­dings wird nur die Dif­fe­renz zum DC-Koef­fi­zi­en­ten im vor­her­ge­hen­den Block kodiert. Dadurch und durch die Abar­bei­tung hin zu den höhe­ren Fre­quen­zen ent­ste­hen erneut klei­nere Zahlen.

Die vor­ge­stell­ten Ver­fah­ren bei­hal­ten noch keine direkte Kom­pres­sion der Bild­da­ten, diese wer­den aber ent­spre­chend (grob) trans­for­miert und auf­be­rei­tet. Um die so erhal­te­nen Daten schließ­lich in einem mög­lichst kom­pak­ten Code abzu­spei­chern, stellt der JPEG-Stan­dard meh­rere Ver­fah­ren bereit, auf die hier jedoch nicht wei­ter ein­ge­gan­gen wird:

  • Dar­stel­lung von variable-length-integers anstatt Inte­gers fes­ter Länge
  • Kom­pri­mie­rung durch Huffman-Algorithmus
  • Arith­me­ti­sches Codieren

Kategorien Allgemein

Hinterlasse eine Antwort

Pflichtfelder sind mit * markiert.

*