Die diskrete Cosinustransformation - Gleitz

Werbung
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⋅xc
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=cos0=1
1⋅2 x1⋅
f 1  x=cos
16
2⋅2 x1⋅
f 2  x=cos
16
3⋅2 x1⋅
f 3  x=cos
16
4⋅2 x1⋅
f 4  x=cos
16
5⋅2 x1⋅
f 5  x=cos
16
6⋅2 x1⋅
f 6  x=cos
16
7⋅2 x1⋅
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⋅n1⋅
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⋅n1⋅
=
16








 
 


k⋅2⋅01⋅
k⋅2⋅11⋅
k⋅2⋅21⋅
k⋅2⋅31⋅
 x 1⋅cos
+ x 2⋅cos
x 3⋅cos
+
16
16
16
16
x 4⋅cos
k⋅2⋅41⋅
k⋅2⋅51⋅
k⋅2⋅61⋅
k⋅2⋅71⋅
 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⋅n1⋅
=
16
k⋅2⋅01⋅
k⋅2⋅11⋅
k⋅2⋅21⋅
k⋅2⋅31⋅
1⋅cos
+ 5⋅cos
3⋅cos
+
16
16
16
16
8⋅cos
k⋅2⋅41⋅
k⋅2⋅51⋅
k⋅2⋅61⋅
k⋅2⋅71⋅
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⋅01⋅
4⋅2⋅11⋅
4⋅2⋅21⋅
4⋅2⋅31⋅
4⋅cos
1⋅cos
+ 5⋅cos
3⋅cos
+
16
16
16
16


8⋅cos
 
 
 
 
 
 


4⋅2⋅41⋅
4⋅2⋅51⋅
4⋅2⋅61⋅
4⋅2⋅71⋅
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⋅n1
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⋅61
1
x 6 = ⋅∑ z k⋅c k⋅cos
2 k=0
16

Dann schreiben wir die Summe aus:
1
x 6= ⋅[
2
0⋅2⋅61⋅
1⋅2⋅61⋅
1
 ⋅9,19⋅cos
1⋅1,05⋅cos
+
2
16
16
2⋅2⋅61⋅
3⋅2⋅61⋅
1⋅−2,5⋅cos
1⋅−0,04⋅cos
+
16
16
4⋅2⋅61⋅
5⋅2⋅61⋅
1⋅2,83⋅cos
1⋅−0,05⋅cos
+
16
16
6⋅2⋅61⋅
7⋅2⋅61⋅
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⋅n1
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⋅n1
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⋅i1⋅⋅u
2⋅j1⋅⋅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⋅i1⋅⋅1
2⋅j1⋅⋅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⋅01⋅⋅1
6
2⋅01⋅⋅1
5⋅cos
6
2⋅11⋅⋅1
3⋅cos
6
2⋅21⋅⋅1
4⋅cos
6
7⋅cos
2
Z 1,2 = ⋅1⋅1⋅[
3
2⋅01⋅⋅2
2⋅01⋅⋅1
⋅cos
9⋅cos
⋅cos
6
6
2⋅21⋅⋅2
2⋅11⋅⋅1
⋅cos
8⋅cos
⋅cos
6
6
2⋅11⋅⋅2
2⋅11⋅⋅1
⋅cos
6⋅cos
⋅cos
6
6
2⋅01⋅⋅2
2⋅21⋅⋅1
⋅cos
4⋅cos
⋅cos
6
6
2⋅21⋅⋅1
2⋅21⋅⋅2
8⋅cos
⋅cos
]
6
6













 













2⋅11⋅⋅2
6
2⋅01⋅⋅2
6
2⋅21⋅⋅2
6
2⋅11⋅⋅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⋅i1⋅⋅u
2⋅j1⋅⋅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⋅21⋅⋅u
2⋅01⋅⋅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⋅21⋅⋅0
2⋅01⋅⋅0
1 1
⋅ ⋅18⋅cos
⋅cos
+
2 2
6
6
2⋅21⋅⋅0
2⋅01⋅⋅1
1
⋅1⋅0⋅cos
⋅cos
+
2
6
6
2⋅21⋅⋅0
2⋅01⋅⋅2
1
⋅1⋅1,41⋅cos
⋅cos
+
2
6
6
2⋅21⋅⋅1
2⋅01⋅⋅0
1
1⋅ ⋅2,04⋅cos
⋅cos
+
2
6
6
2⋅21⋅⋅1
2⋅01⋅⋅1
1⋅1⋅3⋅cos
⋅cos
+
6
6
2⋅21⋅⋅1
2⋅01⋅⋅2
1⋅1⋅−2,89⋅cos
⋅cos
+
6
6
2⋅21⋅⋅2
2⋅01⋅⋅0
1
1⋅ ⋅0,71⋅cos
⋅cos
+
2
6
6
2⋅21⋅⋅2
2⋅01⋅⋅1
1⋅1⋅−1,73⋅cos
⋅cos
+
6
6
2⋅21⋅⋅2
2⋅01⋅⋅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⋅i1⋅⋅u
2⋅j1⋅⋅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⋅i1⋅⋅u
2⋅j1⋅⋅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
Herunterladen