Die diskrete Cosinustransformation Übersicht: • • • • • • Einleitung Die Cosinusfunktion Die eindimensionale DCT und iDCT • Das Prinzip • Die Berechnung Die zweidimensionale DCT und iDCT • Das Prinzip • Die Berechnung Anhang • Quantisierung • Beispiel JPEG • Erläuterungen zur DCTKalk.sxc Quellen Einleitung: Wenn man sich etwas ausführlicher mit digitaler Videokompression beschäftigt, stößt man irgendwann auf den Begriff DCT, in Worten diskrete Cosinustransformation. Sie ist eigentlich das grundlegende Konzept der heutigen Videokompressionsverfahren und elementarer Bestandteil der meisten verlustbehafteten Kompressionsverfahren. Diese ermöglichen es, Videodaten, die sonst ungeheure Größen erreichen würden, deutlich platzsparender abzulegen, ohne zu viel Qualität einzubüßen. Die Cosinusfunktion In diesem Kapitel werden nochmal einige Dinge über die Cosinusfunktion gesagt. Wenn sie sich mit trigonometrischen Funktionen auskennen, können sie ruhig bei Kapitel 2 weiter lesen. Der Cosinus ist der Quotient der Ankathete eines Winkels und der Hypotenuse im rechtwinkligen Dreieck. Das kann man sich sehr schön am sog. Einheitskreis veranschaulichen. Dieser Kreis hat den Radius 1, die Hypotenuse (die dem rechten Winkel gegenüberliegende Seite) hat also immer die Länge 1. Der Cosinus ist somit so groß wie die Ankathete. Wenn wir jetzt den Winkel α vergrößern (die Hypotenuse also gegen den Uhrzeigersinn weiter drehen) sehen wir, wie der Cosinus sich verändert. Bei 90° ist er 0, bei 180° -1, bei 270° wieder 0 und bei 360° wieder 1. Danach wiederholt sich das ganze von vorne. Trägt man diese Werte in ein Diagramm ein, sieht das etwa so aus: Gezeichnet ist der Bereich von 0 bis 720° (oder 4 π im Bogenmaß), das sind 2 Perioden (2 mal im Kreis herum). Die Funktion setzt sich in gleicher Weise nach links und rechts fort. Die Gleichung dieser Funktion lautet f x=cos x , wobei x der Winkel im Bogenmaß ist. Es wird also jedem Wert von x (die waagrechte Achse des Schaubildes) der Wert des Cosinus des Winkels x zugeordnet. Bogenmaß bedeutet, dass die Winkel nicht mehr in Grad angegeben werden sondern mit einer Zahl ohne Einheit, die der Länge des Kreisbogens im Einheitskreis entspricht. 360° entsprechen dabei 2π (dem Umfang des Einheitskreises). Man kann Winkel mit dieser Formel zwischen Grad- und Bogenmaß umrechnen: x= 2⋅⋅ 360 ° Die Cosinusfunktion hat mehrere wichtige Eigenschaften: • • • • Amplitude: Die Höhe des höchsten Ausschlags Periode: Die Länge eines kompletten Durchlaufs, bis die Funktion sich wiederholt Frequenz: Wie viele Perioden auf einer bestimmten Länge Platz haben. Phase: Verschiebung entlang der x-Achse Amplitude (a) und Periode (l) sind in diesem Schaubild eingetragen: Diese Eigenschaften kann man beeinflussen. Die Gleichung der allgemeinen Cosinusfunktion lautet: f x=a⋅cos b⋅xc Der Faktor a bestimmt die Amplitude. Die Werte dieser Funktion bewegen sich zwischen -a und a. Das Schaubild wird vertikal gedehnt oder gestaucht, je nachdem ob a größer oder kleiner 1 ist. Der Faktor b heißt auch Frequenz. Je größer b ist, desto enger liegen die Berge und Täler beieinander und desto mehr Perioden passen auf eine bestimmte Länge, d.h. die Periode wird kleiner. Das Schaubild wird horizontal gedehnt oder gestaucht, je nachdem ob b größer oder kleiner 1 ist. Das c nennt man Phase. Sie gibt an, um welchen Winkel die Funktion entlang der x-Achse verschoben ist. Die eindimensionale DCT und iDCT Das Prinzip Die eindimensionale DCT ist eine Umformung, die eine Reihe von Zahlen in andere Zahlen umformt. Der Inhalt ist jedoch der selbe. Wir haben eine Kette aus acht Zahlenwerte, nennen wir sie Wert 0 bis 7: Index 0 1 2 3 4 5 6 7 Wert 4 -4 4 -4 4 -4 4 -4 Das könnte z.B. die Digitalisierung eines Tones sein. Deshalb nennen wir diese Zahlenkette auch Signal. Graphisch veranschaulicht sieht das so aus: Sofort fällt uns die Ähnlichkeit zwischen dem zwar ziemlich eckigen Schaubild unseres Signals und der viel runderen Cosinusfunktion auf. Wir könnten ja jetzt auf die Idee kommen, unser Signal durch eine modifizierte Cosinusfunktion auszudrücken z.B. mit dieser: An den wichtigen Stellen (0,1,2,...7) ergibt diese Funktion die Werte unseres Signals. Wir könnten jetzt also anstatt 8 Zahlen nur Frequenz, Amplitude und Phase der Funktion speichern, und man kann trotzdem das ursprünglich Signal wieder exakt herstellen, wenn man weiß, wie man diese drei Zahlen interpretieren muss. Doch das funktioniert nur in den wenigsten Fällen, da sich Signale selten so schön mit einer Cosinusfunktion darstellen lassen. Was machen wir z.B. bei den folgenden Werten? Index 0 1 2 3 4 5 6 7 Wert 4 1 5 3 8 0 3 2 Wir könnten versuchen, diese Daten mit einer einzigen Cosinusfunktion möglichst gut anzunähern. Aber diese Näherung wäre äußerst schlecht. Deshalb verwenden wir nicht nur eine Cosinusfunktion, sondern eine Summe aus mehreren. Um an allen 8 Stellen die richtigen Werte herauszubekommen benötigen wir 8 verschiedene Funktionen, so genannte Basisfunktionen. Das sind die 8 Basisfunktionen: Diese 8 Funktionen sind in ihrer Frequenz und Phase festgelegt. Die mit der niedrigsten Frequenz nennen wir f1, die mit der höchsten f7. Die Funktion f0 hat konstant den Wert 1, was auf der Zeichnung nicht zu erkennen ist. Wir ändern die Amplituden dieser Funktionen so ab, dass die Summe der Funktionen an den entsprechenden Stellen die richtigen Werte ergibt. Sie sehen dann so aus: Wir speichern nicht mehr die einzelnen Messpunkte ab, sondern die Amplituden der 8 bekannten Funktionen. Aus diesen lassen sich die Messpunkte wieder bestimmen. Die Amplituden lauten für dieses Beispiel: Funktion 0 1 2 3 4 5 6 7 Amplitude 9,19 1,05 -2,5 -0,04 2,83 -0,5 -0,49 5,28 Die Amplitude der Funktion f0 nennt man auch DC-Koeffizienten oder Gleichanteil. Bei der iDCT geht man diesen Weg einfach rückwärts. Ausgangspunkt sind die 8 Amplituden der Basisfunktionen Aus diesen Angaben lässt sich das Ausgangssignal ohne Probleme wiederherstellen. Man summiert einfach die Basisfunktionen, die mit den entsprechenden Amplituden gewichtet wurden, auf. Das sieht dann ungefähr so aus: Jetzt kann man die Werte unseres Ausgangssignals bestimmen. Diese Umwandlungen sind im Prinzip verlustfrei. Im Computer kann man die Amplituden jedoch nur mit begrenzter Genauigkeit speichern, weshalb es zu Rundungsfehlern kommt, die dafür sorgen, dass das wiederhergestellte Signal sich minimal vom Ausgangssignal unterschiedet. Die DCT reduziert die Daten auch nicht. Eher im Gegenteil. Während unsere ursprünglichen Werte positive Ganzzahlen waren, sind die Amplituden sowohl positiv als auch negativ und außerdem meist nicht abbrechende Dezimalzahlen. Die DCT führt die Daten aber in eine Form über, die die Reduktion über die Quantisierung erleichtert. Die Komprimierbarkeit der quantisierten Daten mit Kompressionsalgorithmen (wie Huffman, VLI, arithmetische Codierung) wird dabei drastisch verbessert, während die subjektive Bildqualität, je nach Kompressionsgrad, kaum leidet. Näheres dazu im Kapitel „In der Praxis“ Die Berechnung In diesem Teil geht es um die Mathematik hinter dem Prinzip. Das ist für das Verständnis des Prinzips nicht unbedingt erforderlich, aber vielleicht trotzdem für den einen oder anderen ganz interessant. Von den riesigen Formeln sollte man sich nicht abschrecken lassen, in Wirklichkeit sind sie gar nicht so schlimm. Die 8 Funktionen, deren Amplituden bestimmt werden, nennt man auch Basisfunktionen. Sie haben die folgenden Gleichungen: f 0 x=cos0=1 1⋅2 x1⋅ f 1 x=cos 16 2⋅2 x1⋅ f 2 x=cos 16 3⋅2 x1⋅ f 3 x=cos 16 4⋅2 x1⋅ f 4 x=cos 16 5⋅2 x1⋅ f 5 x=cos 16 6⋅2 x1⋅ f 6 x=cos 16 7⋅2 x1⋅ f 7 x=cos 16 Wir müssen jetzt die Amplituden der Basisfunktionen so anpassen, dass sie das ursprüngliche Signal ergeben. Das geschieht mit Hilfe der Formel der DCT: 7 k⋅2⋅n1⋅ 1 z k = ⋅c k⋅∑ x n⋅cos 2 16 n=0 mit c k = { 1 für k ≠0 1 für k =0 2 } zk ist die Amplitude der k-ten Basisfunktion ck ist ein so genannter Skalierungsfaktor, der aber nur bei der ersten Basisfunktion von Bedeutung ist, da er in allen andern Fällen 1 ist. xn ist der Wert n des Urspungssignal an der Stelle. In unserem Beispiel von oben wäre also z.B. x2 = 5. Dieser angst einflößende Haken zwischen ck und xn ist ein großes Sigma und wird in der Mathematik als Zeichen für eine Summe verwendet. Der Ausdruck hinter dem Sigma soll 8 mal addiert werden. Dabei soll jeweils ein anderes n eingesetzt werden, beginnend mit n=0 aufsteigend bis n=7. Wenn man diese Summe ausschreibt sieht das so aus: 7 ∑ x n⋅cos n=0 x 0⋅cos k⋅2⋅n1⋅ = 16 k⋅2⋅01⋅ k⋅2⋅11⋅ k⋅2⋅21⋅ k⋅2⋅31⋅ x 1⋅cos + x 2⋅cos x 3⋅cos + 16 16 16 16 x 4⋅cos k⋅2⋅41⋅ k⋅2⋅51⋅ k⋅2⋅61⋅ k⋅2⋅71⋅ x 5⋅cos + x 6⋅cos x 7⋅cos 16 16 16 16 Jetzt setzen wir die Werte unseres Ursprungssignals ein: 7 ∑ x n⋅cos n=0 4⋅cos k⋅2⋅n1⋅ = 16 k⋅2⋅01⋅ k⋅2⋅11⋅ k⋅2⋅21⋅ k⋅2⋅31⋅ 1⋅cos + 5⋅cos 3⋅cos + 16 16 16 16 8⋅cos k⋅2⋅41⋅ k⋅2⋅51⋅ k⋅2⋅61⋅ k⋅2⋅71⋅ 0⋅cos + 3⋅cos 2⋅cos 16 16 16 16 Um jetzt z.B. die Amplitude z4 der 4. Basisfunktion auszurechnen müssen wir für k=4 einsetzen: 1 z 4 = ⋅1⋅[ 2 4⋅2⋅01⋅ 4⋅2⋅11⋅ 4⋅2⋅21⋅ 4⋅2⋅31⋅ 4⋅cos 1⋅cos + 5⋅cos 3⋅cos + 16 16 16 16 8⋅cos 4⋅2⋅41⋅ 4⋅2⋅51⋅ 4⋅2⋅61⋅ 4⋅2⋅71⋅ 0⋅cos + 3⋅cos 2⋅cos 16 16 16 16 ] Wenn man dieses Monstrum in den Taschenrechner eingibt, zeigt er als Ergebnis 2,83 an. Für alle die zu faul sind, soviel zu tippen, habe ich eine Excel-Tabelle gebastelt, die das übernimmt. Für alle anderen Basisfunktionen erfolgt die Berechnung der Amplituden genauso, nur mit dem entsprechenden k. Alle 8 Werte zusammen sind das Ergebnis der DCT. Zu beachten ist, dass man bei der Berechnung des DC-Koeffizienten z0 für ck = einsetzen muss. 1 2 Der umgekehrte Vorgang, die iDCT (inverse Diskrete Cosinustransformation) funktioniert ähnlich, die Formel lautet diesmal: 7 k⋅2⋅n1 1 x n = ⋅∑ z k⋅c k⋅cos 2 k=0 16 { 1 für k ≠0 mit c k = 1 für k =0 2 } Der n-te Wert des ursprünglichen Signals errechnet sich aus der Summe der Werte der acht entsprechend gewichteten Cosinusfunktionen an der Stelle n. Diese Summe wird dann noch mit 0,5 multipliziert. Wir berechnen x6: n=6 einsetzen: 7 k⋅2⋅61 1 x 6 = ⋅∑ z k⋅c k⋅cos 2 k=0 16 Dann schreiben wir die Summe aus: 1 x 6= ⋅[ 2 0⋅2⋅61⋅ 1⋅2⋅61⋅ 1 ⋅9,19⋅cos 1⋅1,05⋅cos + 2 16 16 2⋅2⋅61⋅ 3⋅2⋅61⋅ 1⋅−2,5⋅cos 1⋅−0,04⋅cos + 16 16 4⋅2⋅61⋅ 5⋅2⋅61⋅ 1⋅2,83⋅cos 1⋅−0,05⋅cos + 16 16 6⋅2⋅61⋅ 7⋅2⋅61⋅ 1⋅−0,45⋅cos 1⋅5,28⋅cos 16 16 ] Und rechnen das aus. Oder wir lassen wieder Excel rechnen. Das Ergebnis sollte beide Male 3 ergeben. Die beiden Formeln der DCT und der iDCT, die oben angegeben sind sind Spezialfälle für 8 Datenpunkte und 8 Basisfunktionen. Die allgemeinen Formeln lauten: N −1 k⋅2⋅n1 2 zk= ⋅c k⋅∑ x n⋅cos N 2⋅N n=0 { 1 für k ≠1 mit c k = 1 für k =0 2 k⋅2⋅n1 2 x n= ⋅∑ z k⋅c k⋅cos N k=0 2⋅N { 1 für k ≠1 mit c k = 1 für k =0 2 DCT } N −1 } iDCT Das ist die sog. DCT Typ II, die in der digitalen Bildverarbeitung gebräuchlichste Form. Die zweidimensionale DCT Das Prinzip Vom Prinzip her funktioniert die zweidimensionale DCT nicht viel anders als die eindimensionale DCT, mit dem Unterschied, dass die eine eindimensional und die andere zweidimensional ist. Zweidimensional bedeutet dabei, dass wir nicht eine Reihe von Zahlen als Ausgangssignal haben, sondern ein Gitter: i\j 0 1 2 0 7 9 5 1 8 3 6 2 4 4 8 Die Mathematiker sagen dazu Matrix. Der Zeilenindex der Matrix ist i, der Spaltenindex j. Der Wert xij ist also der Wert in der i-ten Zeile und der j-ten Spalte der Matrix. Zum Beispiel x02 = 5 oder x22 = 8. Unser Beispiel ist nur eine 3x3 Matrix, da bei größeren Matrizen die Übersichtlichkeit bei der Berechnung stark beeinträchtigt wird. In der Praxis (JPEG, MPEG) werden 8x8 Matrizen verwendet. Auch die Basisfunktionen, die wir verwenden, sind 2-dimensional. Für eine 3x3 Matrix mit 9 Werten brauchen wir eine 3x3 Matrix mit 9 Funktionen. Graphisch veranschaulicht sehen sie ungefähr so aus: Jedes der Kästchen ist eine der Basisfunktionen für eine 3x3 Matrix. Man kann sich die 2dimensionalen Cosinusfunktionen als Oberflächenwellen vorstellen, wie zum Beispiel auf einem See, wenn man einen Stein ins Wasser geworfen hat. Wir schauen von oben auf den See. Die horizontalen Frequenzen nehmen nach rechts hin zu, die vertikalen nach unten hin. Oben links ist der Gleichanteil, rechts unten der höchstfrequente Anteil. Wieder werden die Amplituden dieser Basisfunktionen so angepasst, dass ihre Summe an allen relevanten Stellen den Wert unseres Ursprungssignals ergibt. Die Amplituden werden auch in einer Matrix angeordnet. Für unser Beispiel sieht das Ergebnis dann so aus: u\v 0 1 2 0 18 0 1,41 1 2,04 3 -2,89 2 0,71 -1,73 -3 Auch hier befindet sich der DC-Koeffizient in der linken oberen Ecke, nach unten hin nehmen die vertikalen Frequenzen zu, nach rechts hin die horizontalen. In der rechten unteren Ecke ist der höchstfrequente Anteil. Auch die 2D DCT ist nur eine andere Darstellungsform, die keine Datenreduktion zur Folge hat, aber die Quantisierung und Komprimierbarkeit erleichtert. Die iDCT summiert auch hier die Werte der Funktionen an jedem Punkt auf und stellt so aus der Amplitudenmatrix wieder die ursprüngliche Matrix her. Die Berechnung Die Berechnung der Amplituden der einzelnen Basisfunktionen funktioniert bei der 2D DCT ganz ähnlich wie bei bei der 1D DCT. Die Formel lautet hier aber für eine 3x3 Matrix: 2 2 2⋅i1⋅⋅u 2⋅j1⋅⋅v 2 Z u , v = ⋅c u⋅c v⋅∑ ∑ X i , j⋅cos ⋅cos 3 6 6 i=0 j=0 { 1 für x≠1 1 für x=0 2 mit c x = } Zu,v ist die Amplitude der u,v-ten Basisfunktion, die in der u-ten Zeile und der v-ten Spalte der Amplitudenmatrix steht. Xi,j ist der Wert der Ausgangsmatrix, der in der i-ten Zeile und der j-ten Spalte steht. cu und cv sind wieder sog. Skalierungsfaktoren. Die doppelte Summe bedeutet, dass erst der Ausdruck hinter den Summenzeichen mit aufsteigenden Werten von j summiert werden soll und dann diese Summe mit aufsteigenden Werten für i aufsummiert. Insgesamt haben wir dann eine Summe aus 9 Summanden, mit allen möglichen Kombinationen aus i und j. Jetzt rechnen wir als Rechenbeispiel einmal die Amplitude Z1,2 aus. Zuerst setzen wir für u 1 und für v 2 ein: 2 2 2⋅i1⋅⋅1 2⋅j1⋅⋅2 2 Z 1,2 = ⋅1⋅1⋅∑ ∑ X i , j⋅cos ⋅cos 3 6 6 i=0 j=0 Dann schreiben wir die Summen aus und setzen die Werte der Ausgangsmatrix ein: 2⋅01⋅⋅1 6 2⋅01⋅⋅1 5⋅cos 6 2⋅11⋅⋅1 3⋅cos 6 2⋅21⋅⋅1 4⋅cos 6 7⋅cos 2 Z 1,2 = ⋅1⋅1⋅[ 3 2⋅01⋅⋅2 2⋅01⋅⋅1 ⋅cos 9⋅cos ⋅cos 6 6 2⋅21⋅⋅2 2⋅11⋅⋅1 ⋅cos 8⋅cos ⋅cos 6 6 2⋅11⋅⋅2 2⋅11⋅⋅1 ⋅cos 6⋅cos ⋅cos 6 6 2⋅01⋅⋅2 2⋅21⋅⋅1 ⋅cos 4⋅cos ⋅cos 6 6 2⋅21⋅⋅1 2⋅21⋅⋅2 8⋅cos ⋅cos ] 6 6 2⋅11⋅⋅2 6 2⋅01⋅⋅2 6 2⋅21⋅⋅2 6 2⋅11⋅⋅2 6 + + + + Jetzt rechnen wir diesen Zahlenberg aus. Oder lassen wieder die Exceltabelle rechnen. Es sollte -2,89 herauskommen. Das kann man in gleicher Weise für die anderen 8 Amplituden tun. Dabei ist aber auf die Skalierungsfaktoren zu achten. Wollen wir aus unserer Amplitudenmatrix wieder die Ursprungsmatrix berechnen, so brauchen wir den umgekehrten Vorgang, die iDCT: { } 2 2 2⋅i1⋅⋅u 2⋅j1⋅⋅v 2 X i , j= ⋅∑ ∑ c u⋅c v⋅Z u , v⋅cos ⋅cos 3 u=0 v=0 6 6 1 für x≠1 mit c x = 1 für x=0 2 Wir rechnen jetzt als Beispiel den Wert X2,0 aus: Der erste Schritt ist wieder das einsetzen von i und j: 2 2 2⋅21⋅⋅u 2⋅01⋅⋅v 2 X 2,0 = ⋅∑ ∑ c u⋅c v⋅Z u , v⋅cos ⋅cos 3 u=0 v=0 6 6 { 1 für x≠1 mit c x = 1 für x=0 2 } Danach schreiben wir die Summe aus und setzen die Werte aus der Amplitudenmatrix ein: 2 X 2,0 = ⋅[ 3 2⋅21⋅⋅0 2⋅01⋅⋅0 1 1 ⋅ ⋅18⋅cos ⋅cos + 2 2 6 6 2⋅21⋅⋅0 2⋅01⋅⋅1 1 ⋅1⋅0⋅cos ⋅cos + 2 6 6 2⋅21⋅⋅0 2⋅01⋅⋅2 1 ⋅1⋅1,41⋅cos ⋅cos + 2 6 6 2⋅21⋅⋅1 2⋅01⋅⋅0 1 1⋅ ⋅2,04⋅cos ⋅cos + 2 6 6 2⋅21⋅⋅1 2⋅01⋅⋅1 1⋅1⋅3⋅cos ⋅cos + 6 6 2⋅21⋅⋅1 2⋅01⋅⋅2 1⋅1⋅−2,89⋅cos ⋅cos + 6 6 2⋅21⋅⋅2 2⋅01⋅⋅0 1 1⋅ ⋅0,71⋅cos ⋅cos + 2 6 6 2⋅21⋅⋅2 2⋅01⋅⋅1 1⋅1⋅−1,73⋅cos ⋅cos + 6 6 2⋅21⋅⋅2 2⋅01⋅⋅2 1⋅1⋅−3⋅cos ⋅cos 6 6 ] Falls sich jemand wirklich die Mühe machen sollte, das von Hand in einen Taschenrechner einzutippen, sollte er als Ergebnis 4 erhalten. Auch diese beiden Formeln sind Spezialfälle für eine 3x3 Matrix. Die allgemeine zweidimensionale DCT und iDCT lauten: N −1 N −1 2 Z u , v = ⋅c u⋅c v⋅∑ N i=0 ∑ X i , j⋅cos j=0 2⋅i1⋅⋅u 2⋅j1⋅⋅v ⋅cos 2⋅N 2⋅N { 1 für x≠1 mit c x = 1 für x=0 2 N −1 N −1 2 X i , j= ⋅∑ N u=0 ∑ c u⋅c v⋅Z u , v⋅cos v=0 { DCT } 2⋅i1⋅⋅u 2⋅j1⋅⋅v ⋅cos 2⋅N 2⋅N 1 für x≠1 mit c x = 1 für x=0 2 } iDCT Anhang Quantisierung Die DCT findet Anwendung in der digitalen Bildverarbeitung. Dazu wird das Bildmaterial in Blöcke von 8x8 Pixeln aufgeteilt und in seine Kanäle (Helligkeit und 2 Farbkanäle)aufgeteilt. Das Ergebnis sind Matrizen, ganz ähnlich der Matrix in unserem Beispiel. Diese werden dann transformíert. Doch die DCT allein verringert die Datenmenge nicht. Die eigentliche Datenreduktion erfolgt durch die Quantisierung. Da das menschliche Auge feine Details (hohe Frequenzen) weniger stark wahrnimmt als große Strukturen (niedrige Frequenzen), kann man diese mit geringerer Genauigkeit kodieren. Das geschieht, indem die DCT transformierten Bildblöcke quantisiert werden. Darunter versteht man die unterschiedliche Gewichtung und anschließende Rundung der verschiedenen Frequenzanteile. Dazu verwendet man eine Quantisierungsmatrix, in der für jede Frequenz ein Faktor (Quantiser genannt) angegeben ist, durch den die entsprechende Amplitude geteilt werden soll. Das Ergebnis wird gerundet. Viele der höheren Frequenzen, die sowieso schon eher niedrige Amplituden hatten, werden so 0, der Rest besteht nur noch aus kleinen Werten. Wir rechnen das mal an unserem Beispiel durch: Die Amplitudenmatrix: u\v 0 1 2 0 18 0 1,41 1 2,04 3 -2,89 2 0,71 -1,73 -3 Wir verwenden folgende Quantisierungsmatrix: 0 1 2 0 1 2 3 1 2 3 4 2 3 4 4 Man sieht, dass die Werte desto höher sind, desto höher die Frequenz ist. Die höheren Frequenzen werden so mit geringerer Genauigkeit und geringerem Platzbedarf abgelegt, da das Auge diese nicht so stark wahrnimmt. Jede Amplitude wird durch den entsprechenden Eintrag in der Quantisierungsmatrix geteilt und das Ergebnis gerundet: 0 1 2 0 18 0 0 1 1 1 -1 2 0 0 -1 Viele der Werte dieser Matrix sind null geworden. Die werden jetzt in einer bestimmten Reihenfolge ausgelesen und hintereinandergeschrieben. Diese Zahlenreihe kann jetzt mit Kompressionsalgorithmen platzsparend gespeichert werden, da viele Einträge 0 sind. Das Auge nimmt die Unterschiede jedoch nicht so krass wahr, solange die Quantisierung nicht übertrieben wird. Bei der Decodierung werden die quantisierten Amplituden wieder mit dem entsprechenden Faktor Quantisierungsmatrix multipliziert und dann der iDCT unterzogen. Je höher die Quantiser in der Matrix sind, desto stärker treten Rundungsverluste auf. Das kann man an einem Beispiel verdeutlichen: Wir quantisieren den Koeffizienten z2,1 mit unterschiedlichen Quantisern und vergleichen den Unteschied zwischen ursprünglichem Wert und wiederhergestelltem Wert: Wert Quantiser Gespeicherter Wert Wiederhergestellter Wert Fehler -1,73 1 -2 -2 16,00% -1,73 2 -1 -2 16,00% -1,73 3 -1 -3 73,00% -1,73 4 0 0 100,00% Das ist nur das Prinzip der Quantisierung, in der Realität funktioniert es noch etwas anders. Beispiel JPEG Das JPEG Bildformat basiert auf DCT. Das kann man z.B. an den Verblockungen erkennen, die bei zu großen Kompressionsraten auftreten. Original 470 kB Komprimiert mit JPEG auf 2,97 kB Die hohen Frequenzen, z.B. in der Filmkörnung im Hintergrund, werden komplett herausquantisiert, übrig bleibt nur der DC Anteil. Es entsteht der einfarbige Hintergrund. Am Kopf des Fuchses ist die Fellstruktur fast komplett verloren gegangen. Nur manchmal sind noch andere Frequenzen übrig geblieben. Zum Beispiel sind unterhalb des Halses in der Mitte und rechts einige Horizontalfrequenzen übrig geblieben. Es ist erstaunlich, wie gut das Bild bei einer Kompression von fast 160:1 noch zu erkennen ist. Man sieht ausserdem, dass dieses Verfahren vor allem bei scharfen Kanten Probleme hat. Das liegt daran, dass für scharfe Kanten hohe Frequenzen benötigt werden, fallen diese durch die Quantisierung heraus, so entstehen die auch „Moskitos“ genannten Artefakte. Diese kann man z.B. an der Kante zwischen Brett und Wand erkennen. In den nächsten 3 Bildern sind die hohen und niedrigen Bildfrequenzen getrennt worden. Das zeigt sehr eindrucksvoll, dass hohe Frequenzen für feine Strukturen zuständig sind und niedrige für die größeren Strukturen. Niedrige Frequenzen Hohe Frequenzen Überlagerung (Bilder aus []) Erläuterungen zur DCTKalk.sxc Es wurde im Laufe des Artikels mehrfach auf eine OpenOffice Tabelle verwiesen, die die Berechnungen vornimmt. Ich denke, sie könnte auch behilflich sein, ein Gefühl für diese Operation zu bekommen und sie besser zu verstehen. Dieses Tabellendokument wurde mit OpenOffice 1.1.0 erstellt. OpenOffice ist ein hervorragendes OpenSource Office Paket, dass man unter www.openoffice.org kostenlos herunterladen kann. Die Datei ist in 5 Tabellen aufgeteilt: • DCT In dieser Tabelle gibt man unter Signal die Werte eines beliebigen Signals an. Darunter in dem Feld mit den vielen zahlen werden die Amplituden der einzelnen Basisfunktionen ausgerechnet. Für jede Basisfunktion gibt es eine eigene Spalte. Die Summe der Spalte, multipliziert mit dem Skalierungsfaktor ck, ergibt die Amplitude. Die genauen Rechnungen sind dem Artikel zu entnehmen. Unter Summe werden die Amplituden der einzelnen Basisfunktionen angezeigt, also das Ergebnis der DCT. In der Zelle „Modus“ kann man auswählen, wie mit diesen Ergebnissen weiterverfahren werden soll: Modus 1 (unverändert übernehmen): Die Ergebnisse werden mit hoher Genauigkeit abgespeichert. Modus 2 (quantisieren und runden): Die Amplituden werden durch den entsprechenden Eintrag in der Zeile „Quantiser“ geteilt und dann auf ganze Zahlen gerundet. Modus 3 (manuelle Eingabe): Man kann manuell die Amplituden der verschiedenen Basisfunktionen in der Zeile „man. Eingabe“ eingeben. Je nach dem gewählten Modus tauchen in der Zeile „gespeicherte Werte“ unterschiedliche Zahlen auf. Diese werden automatisch an die nächste Tabelle weitergereicht. • IDCT Hier wird die inverse DCT auf diese weitergereichten Werte angewandt. In dem Feld darunter gibt es für jede Stelle des Signals eine Spalte. In jeder Zelle steht der Wert der entsprechenden Basisfunktion an dieser Stelle. Die Summe daraus ergibt den rekonsturierten Datenpunkt. Darunter sind zu Vergleichszwecken noch das ursprüngliche Signal, die absoluten, relativen und quadrierten absoluten Fehler und deren Summen angegeben. Ganz unten ist noch ein Diagramm mit Ursprungssignal, rekonstruiertem Signal und den abgespeicherten DCT Koeffizienten. • Schaubild In dieser Tabelle ist ein Schaubild mit den einzelnen Basisfunktionen, und deren kontinuierlicher Verlauf incl. Ihrer Überlagerung. • 2D DCT Die nächste Tabelle befasst sich mit der zweidimensionalen DCT. Unter „Input“ kann man eine 3x3 Matrix als Quelle angeben. Links davon wird dann gerechnet. Die Summe aus einer der kleinen Matrizen, multipliziert mit dem entsprechenden Skalierungsfaktor, ist die Amplitude einer Basisfunktion. Die Details sind dem Artikel zu entnehmen. Unter „Output“ wird das Ergebnis angezeigt. Wie damit verfahren wird, kann im Feld „Modus“ bestimmt werden. Die einzelnen Modi funktionieren gleich wie oben. • 2D iDCT Hier wird die inverse 2D DCT auf die übergebenen Daten angewandt. Die Summe jeder 3x3 Matrix links ist ein Datenpunkt. In jeder Zelle steht der Wert einer Basisfunktion an dieser Stelle, deren Summe ergibt den rekonstruierten Datenpunkt. Auch hier sind wieder das Ursprungssignal, die absoluten, relativen und absoluten quadrierten Fehler und ihre Summen angegeben. • 2D DCT 8x8 In der letzten Tabelle ist eine weniger ausführliche Variante der DCT aufgebaut. Diese Variante greift auf das in OpenOffice eingebaute Matrizenprodukt zurück. Diese Funktion führt im Grunde die selben Rechenschritte aus, ist aber deutlich platzsparender. Aus diesem Grund ist es hier möglich, die DCT auf eine in der Praxis übliche 8x8 Matrix anzuwenden. Quellen