Zusammenfassung zur DCT
Hier nochmal die Formel der forward DCT, auch
FDCT. Bei dieser Berechnung werden 8x8 Bildpunkte
s(y, x) in 8x8 Koeffizienten S(v, u)
transformiert.
mit
An der Information ändert dies nichts. In den
Koeffizienten ist immer noch das gleiche Bild
gespeichert, jedoch auf Grundlage einer anderen
Basis. Die angegebene Formel ist dabei nichts
anderes als eine gewöhnliche lineare Abbildung,
genauer eine Drehung. Wie in der Übung
besprochen werden die Grauwerte dabei so gedreht,
dass (hoffentlich) danach die meisten
Koeffizienten Null werden um möglichst einfach
lauflängenkodiert zu werden.
Die Drehung in die entgegengesetzte Richtung heißt
inverse DCT oder IDCT und ist dabei wie folgt
definiert. Dabei werden aus den Koeffizienten S(v,
u) wieder Grauwerte s(y, x) erzeugt.
Bemerkung:
Auch bei der Wavelettransformation in der
kommenden Vorlesung handelt es sich um eine
Drehung. Am Beispiel des Haarwavelets ist diese
Zerlegung aber intuitiver zu verstehen.
Wie
kommen die Faktoren C(.) zustande?
In der Übung kam noch die Frage auf, wie die
Vorfaktoren C(.) zustande kommen. Weil in einer
Drehung per Definition Längen und Winkel
erhalten bleiben müssen, muss auch jeder
Basisvektor die Länge eins haben und senkrecht
auf allen anderen stehen. Man kann das durch
Festhalten von (v, u) mit bel. Werten nachprüfen,
indem man jeden Cosinusterm cos(...)*cos(...)
innerhalb der Summe für alle x, y ausrechnet und
die 64 Werte in einen Spaltenvektor schreibt.
Dann wählt man andere Werte für v, u und tut
das gleiche. Das Produkt beider Vektoren muss
Null sein, die Länge eins.
Lediglich wenn u und v Null werden, wird der
Ausdruck im Argument des Cosinus immer Null.
Wegen cos(0)=1 hat der entsprechende Vektor 64
Einsen und somit die Länge 8. Das wird einfach
durch die Vorfaktoren ausgeglichen (siehe zweite
Zeile des folgenden Ausdrucks).
|
Beispielprogramm aus der
Übung zur DCT
Unter Linux das tar-file dct_reference.tar.gz auspacken, ins Verzeichnis
dct_reference wechseln und Programm (automatisch)
konfigurieren, dann kompilieren.
tar
xzf dct_reference.tar.gz (Auspacken)
cd
dct_reference
(Verz. wechseln)
./configure (konfigurieren)
make (kompilieren)
./dct_transform (starten)
Das gesamte Programm steht in dct_transform.cxx und es gibt folgende Möglichkeiten
mit der Transformation zu experimentieren:
|
Taste f |
forward DCT (Bild ->
Koeffizienten) |
|
Taste i |
inverse DCT (Koeffizienten
-> Bild) |
|
Taste u |
Quantisieren der
Koeffizienten |
|
Taste m |
Modifizieren eines
Koeff. |
|
Taste q |
Programm beenden |
Das Programm verwendet die SDL
Bibliothek die in allen Linux Distributionen
enthalten ist und auch auf Windows portiert wurde.
Eine ausführbare Version des Programmes befindet
sich hier.
Wer Zuhause kein Linux installiert hat kann das
Programm einfach im PI-Pool (D7) testen. dct_transform.cxx kann auch ohne Änderungen unter
Windows kompiliert werden, wenn man zuvor die SDL
installiert.
Mit der Funktion Modifikation kann man einen
einzelnen Koeffizienten in der 8x8 Matrix auswählen
(vorsicht: Der Index läuft von 0-7), mit einem
Faktor multiplizieren und einen Offset addieren (auch
negativ). Danach passiert erst mal nichts, denn
die Koeffizienten müssen noch mit der inversen
DCT wieder in Grauwerte zurückgewandelt werden (Taste
i).
|