C. Reinsch: Die diskrete Cosinus

Transcription

C. Reinsch: Die diskrete Cosinus
Die diskrete Cosinus-Transformation
in der JPEG-Kompression
0. Einleitung
Digitalkameras haben heute Photosensoren mit 10, 12 oder sogar 15 Millionen Pixeln,
die Farbwerte für Rot, Grün und Blau mit je 8, 10 oder 12 Bits abspeichern. Scanner
tasten eine DIN A4 oder DIN A3 Vorlage ab mit 1200, 2400 oder sogar 4800 dots/inch
und ebenfalls mehr als 8 Bits für die drei Farben. In beiden Fällen sind die so erzeugten
digitalen Rohdaten sehr viele Megabytes und der Bedarf besteht für eine starke DatenKompression bei der Archivierung.
Bei Diagrammen, technischen Zeichnungen, Straßenkarten und dergleichen hat man
Linien-orientierte Bilder und benötigt nur relativ wenige verschiedene Farben. Zur
Kompression bietet sich hier die Vektorisierung oder eine Lauflängen-Kodierung an
und die Verwendung einer Farbtabelle (Palette) mit entsprechend wenigen Einträgen.
Dazu dienen vor allem TIFF und GIF-Dateien.
Bei Photos, Videos und anderen Flächen-orientierten Bildern mit weichen Übergängen
in Farben und Helligkeit anstelle von scharfer Grenzen ist dagegen die sogenannte
JPEG-Kompression höchst erfolgreich und weit verbreitet. Sie erlaubt meist eine
Daten-Reduktion um einen Faktor 10 bis 100 ohne sichtbare Qualitätsverluste. Hier
kommt Mathematik neu ins Spiel neben Physik (bei TV und Video) oder Chemie
(beim Film) als den zuständigen Wissenschaften. Mathematik dabei im Hintergrund,
unauffällig und unbeachtet.
Der Zweck dieses Referates ist nicht, diese JPEG-Kompression mit allen Aspekten erschöpfend zu diskutieren und zu demonstrieren, denn das kann man heutzutage viel
besser haben zum Beispiel mit Hilfe der beiden Artikel zum Stichpunkt JPEG in der
Deutsch- und Englisch-sprachigen Ausgabe der Wikipedia, der ”freien Enzyklopädie”
im World-Wide-Web, die sich im technisch-wissenschaftlichen Bereich stets von ihrer
besten Seite zeigt: alles, was dort zu lesen und als Demonstration zu betrachten
ist, wird deshalb hier ausgelassen. Das heutige Referat soll diese beiden WikipediaArtikel nicht wiederholen, ersetzen oder gar verbessern. Es soll nur als Brücke dienen
vom Standard-Lehrstoff des Mathematik-Grundstudiums zu den konkret eingesetzten
Formeln wie etwa DCT-II und DCT-III. Sinnvoll ist es also, die Wikipedia zu benutzen
und bei Rückfragen zu den Formeln der diskreten Cosinus-Transformation (DCT) die
Herleitung und Diskussion im hier vorliegenden Referat nachzulesen.
1
1. Die Eingabe-Daten
Grundlage der JPEG-Kompression ist ein fiktives, rechtwinkliges Gitter zur Nummerierung der Stützpunkte für die Farbangaben Rot, Grün und Blau:
x = 1, . . . , nx ,
y = 1, . . . , ny .
x zählt von links nach rechts und y von oben nach unten. Der Abstand dieser Gitterlinien kann spezifiziert werden, spielt aber für die Kompression keine Rolle.
Dieses JPEG-Gitter ist nicht das Raster der Rohdaten, welches die hardware liefert.
Bei Digitalkameras und Scannern kann man in der Regel zwischen mehreren, unterschiedlich groben Gittern wählen und es dieser hardware überlassen, gleich die internen
Rohdaten in den Maschen [x − 0.5, x + 0.5] × [y − 0.5, y + 0.5] um die Gitterpunkte
zu konzentrieren und zu integrieren. Zum Beispiel kann man bei einer Digitalkamera
mit knapp 4 Megapixeln für die JPEG-Ausgabe Gitter wählen im Format 2048×1536,
1600×1200, 1280×960 oder noch weniger.
y-1
y
y+1
x-1
x
x+1
Abb. 1 Hardware-Pixel (rot, grün, blau) und JPEG-Gitter (schwarz)
Das JPEG-Gitter erlaubt es auch, dass die hardware nicht-rechtwinklige Anordnungen
der Farbpixel verwendet, zum Beispiel Digitalkameras mit Photosensoren, bei denen
die Elemente schachbrettartig (Abb. 2) oder hexagonal (Abb. 3) angeordnet sind.
2
Abb. 2 Schachbrett-Anordnung der hardware-Pixel 1 : 2 : 1,
in jeder Ecke (weiß) Information zu Rot, Grün, Blau
120°
0°
−120°
Abb. 3 Hexagonale Anordnung der hardware-Pixel 1 : 1 : 1,
in jeder Ecke (weiß) Information zu Rot, Grün, Blau,
doppelt so viele Ecken wie Pixel
3
Die Einführung des JPEG-Gitters sorgt auf triviale Weise für einen Großteil der Datenkompression. nx und ny sind am besten Vielfache von 16, sonst kann es bei der JPEGKompression zu Artifakten (sichtbare Effekte) am rechten und unteren Bildrand kommen, wie erläutert in Kapitel 5.
Übrigens wird bei der JPEG-Kompression eine primäre Farbinformation in der Form
R, G, B (Rot, Grün, Blau) für jeden Gitterpunkt umgerechnet in Y, Cb , Cr (Helligkeit
und Farbton, englisch luminance, blueness, redness). Der JPEG-Standard definiert
dazu







Y
0
+0.299
+0.587
+0.114
R
 Cb  =  128  +  −0.168736 −0.331264 +0.5
 G .
Cr
128
+0.5
−0.418688 −0.081312
B
Bei der Translation um 128 ist unterstellt, dass R, G, B ∈ [0, 256). So sind es dann auch
Y, Cb , Cr . Die Matrix ist nicht-singulär, sodass die Umrechnung rückgängig gemacht
werden kann (modulo Rundungsfehler).
Der Farbton Cb , Cr wird dann durch Mittelbildung auf ein in x- und y-Richtung doppelt
so weites Gitter (nur die geraden x und y) verteilt. Einem 8 × 8 Block beim Farbton
entspricht also ein 16 × 16 Block bei Rot, Grün, Blau (”Unterabtastung 4:2:0”). Das
ist seit der Erfindung des Farbfernsehens üblich und der Natur abgeschaut, weil auf
unserer Netzhaut die für Hell/Dunkel zuständigen Stäbchen auch dichter stehen als die
farbspezifischen Zäpfchen.
Diese Unterabtastung bewirkt auch Informations-Verlust und Daten-Kompression.
4
2. Vom Ortsraum zum Frequenzraum
Die folgende Diskussion soll zweierlei zeigen: Erstens ist die Möglichkeit zur Kompression im Frequenzraum zu suchen, wo Vernachlässigungen leicht zu überschauen
sind. Und zweitens soll man dafür die Cosinus-Transformation anstelle der normalen
Fourier-Transformation benutzen.
Bekanntlich zerlegt die Cosinus-Transformation eine gerade Funktion f : [−1, 1] → R
unter minimalen Voraussetzungen in eine überall konvergente Reihe:
Z 1
f (t) = c0 /2 + c1 cos(πt) + c2 cos(2πt) + . . . ,
ck = 2
f (t) cos(kπt)dt.
0
Nur für 0 ≤ t ≤ 1 sei f (t) gegeben und für t < 0 sei f (t) = f (−t) definiert. Dadurch
tauscht man in der üblichen Fourier-Transformation einer Funktion f : [0, 1] → R die
Terme sin(2kπt) ein für die Terme cos(kπt) mit ungeradem k. Man hat dann also
eine Hin- und Rücktransformation zwischen der Funktion f : [0, 1] → R und der reellen
Folge c0 , c1 , c2 , . . . der Cosinus-Koeffizienten.
Je glatter die Funktion, desto schneller ist bekanntlich die Konvergenz der Folge. Dabei
kommt es auch auf die Stetigkeit an den beiden Endpunkten t = ±1 an, wo die
gerade Funktion f periodisch fortgesetzt werden muss, damit sie mit ihrer geraden,
periodischen Cosinus-Reihe überall auf der rellen Achse vergleichbar wird. Hier zeigt
sich der entscheidende Vorteil der Cosinus-Transformation gegenüber der normalen
Fourier-Transformation: ein stetiges f : [0, 1] → R, gerade und periodisch fortgesetzt,
ist überall stetig selbst wenn f (0) 6= f (1). Dann fallen die Cosinus-Koeffizienten ck
mindestens wie O(k −2) ab für k → ∞. Die Information über den Funktionsverlauf
wird also auf weniger Koeffizienten konzentriert.
Für die Koeffizienten der üblichen Fourier-Transformation gilt das nur wenn f (0) =
f (1) ist. Dies ist für ein willkürliches Funktionsstück in der Regel nicht der Fall,
sodass die Fourier-Koeffizienten im allgemeinen nur abfallen wie O(|f (1) − f (0)|/k).
Die Information zum Funktionsverlauf ist dann viel weiter ausgebreitet.
Erwähnt sei: Die Cosinus-Transformation beseitigt zwar den Einfluss der Sprünge
f (1) − f (0), doch leider nicht den von f ′ (1) − f ′ (0). Ein Abklingen mit k −3 ist so
nicht zu erreichen. Keine Randbedingung für f an den Endpunkten des Ausschnittes
[0, 1] wird bei der Cosinus-Transformation erkauft durch ungewollte Randbedingungen
für f ′ dort, nämlich f ′ (0) = f ′ (1) = 0.
5
3. Die diskrete Cosinus-Transformation (DCT)
Die zu transformierende Funktion f : [0, 1] → R wird an äquidistanten Stellen im
Einheits-Intervall abgetastet. Dafür gibt es zwei Möglichkeiten und diese führen auf
geringfügig unterschiedliche Formeln für die DCT:
(a)
Gitterpunkte j/n, j = 0, . . . , n.
(b)
Mittelpunkte (j + 0.5)/n, j = 0, . . . , n − 1.
In beiden Fällen ist n ∈ N, also n ≥ 1.
Gitterpunkte
Mittelpunkte
f(t)
0
1
Abb. 4
t
Abtasten an den Gitterpunkten bei DCT-I (rot)
und an den Mittelpunkten bei DCT-II/III (blau),
die Ordinaten stammen von f (t) = 1 + 3t − 2t2
Die JPEG-Kompression wählt die Alternative (b), was besser im Einklang ist mit
dem in Kapitel 1 diskutiertem Umstand, dass die Maschen des JPEG-Gitters oft
gröber sind als das Muster der hardware-Pixel. Die Beiträge aller Pixel innerhalb
einer Gittermasche ergeben dann zusammen den Funktionswert wj am Mittelpunkt
(j + 0.5)/n, j = 0, . . . , n − 1.
An die Stelle der unendlichen Cosinus-Reihe tritt die endliche trigonometrische Summe
n−1
X
1
T (t) =
d0 +
dk cos (πkt),
2
k=1
welche die Funktionswerte wj bei (j + 0.5)/n interpoliert.
6
Die diskrete Cosinus-Transformation berechnet die dk aus den wj und umgekehrt. Die
Formeln dafür sind
DCT-II:
DCT-III:
dk
n−1
2 X
:=
wj cos (j +0.5)kπ/n,
n j=0
n−1
X
1
wj =
d0 +
dk cos (j +0.5)kπ/n,
2
k=1
k = 0, . . . , n − 1.
j = 0, . . . , n − 1.
DCT-II ist die ”Hin-Transformation” und DCT-III ist die ”Rück-Transformation”
(oder andersrum). Die Skalierung der Koeffizienten dk ist beliebig und reine Geschmacksache, insbesondere wird oft d0 anstelle von hier d0 /2 gesetzt, oder man läßt den Faktor
2 in DCT-II weg und schreibt dafür 2dk in DCT-III. Obige Schreibweise ist die in der
JPEG-Norm. Wir kommen zum Beweis.
2 cos (j + 0.5)ϕ sin ϕ/2 = sin (j + 1)ϕ − sin jϕ.
Summation über j von 0 bis n − 1 und Division durch 2 sin ϕ/2 macht daraus
n−1
X
cos (j +0.5)ϕ =
j=0
sin nϕ
,
2 sin ϕ/2
0 < ϕ < 2π.
2 cos α cos β = cos (α + β) + cos (α − β) für α = (j + 0.5)kπ/n, β = (j + 0.5)lπ/n
mit k und l ∈ {0, . . . , n − 1} macht daraus die entscheidende Formel

n−1
 2n falls k = l = 0,
X
n falls k = l > 0,
2
cos (j +0.5)kπ/n cos (j +0.5)lπ/n =

0 falls k 6= l.
j=0
p
√
Sei γ0 := 1/ n, γk := 2/n für k > 0 und die reelle n×n Matrix
Ω := γk cos (j +0.5)kπ/n j=0,...,n−1, k=0,...,n−1 .
Dieses Ω hat somit orthonormalisierte Spalten: ΩT Ω = I, also ist Ω−1 = ΩT .
Für die Zeilenvektoren w := (w0 , . . . , wn−1 ) und a := (a0 , . . . , an−1 ) definiere die
Vorwärts/Rückwärts-Transformation
w = a ΩT .
a = w Ω,
Setzt man noch d0 := 2 γ0 a0 und dk := γk ak für k > 0, so ergeben sich die oben
angegebenen Formeln DCT-II und DCT-III.
7
P
T (t) = 12 d0 + n−1
k=1 dk cos(πkt) ist also symmetrisch mit Periode [−1, 1]. Es interpoliert
die Funktionswerte w0 , . . . , wn−1 an den Stellen t = (j + 0.5)/n, j = 0, . . . , n − 1 und
hat die (ungewollten) Randbedingungen T ′ (0) = T ′ (1) = 0.
Per Definition läßt man die Formeln DCT-II und DCT-III gelten für alle k ∈ Z und
alle j ∈ Z. Dann ist dn immer 0 und w2n+j = w2n−1−j = wj für alle j. Wenn man
anstelle von wj die Bezeichnung wj+0.5 benutzen würde, wäre die Symmetrie vielleicht
offensichtlicher.
Es sollte noch erwähnt werden, dass die reell-orthogonale Matrix Ω natürlich auch
auf komplexe Vektoren angewendet werden kann: die diskrete Cosinus-Transformation
geht genauso gut und unverändert auch für komplexe Daten, d.h. Paare von reellen
Daten, zum Beispiel nicht nur für die Helligkeit Y , sondern auch für blueness und
redness (Cb , Cr ).
An dieser Stelle wird nicht darauf eingegangen, dass es eine ”schnelle” Ausführung der
Formeln DCT-II und DCT-III gibt, entsprechend der FFT bei der diskreten FourierTransformation mit den Funktionen exp (2πikt) anstelle von cos (πkt).
Stattdessen wollen wir noch kurz auf die Variante (a) eingehen, die zu Beginn dieses
Kapitels erwähnt wurde, also die Interpolation an den n+ 1 Gitterpunkten j/n anstelle
der n Mittelpunkte (j + 0.5)/n. Wir brauchen dafür Summen, die von 0 bis n laufen
und bei denen der 0-te und n-te Term nur halbes Gewicht haben:
P
1
1
′′
k Xk := 2 X0 + X1 + · · · + Xn−1 + 2 Xn , n ≥ 1. Dafür gelten die Formeln
Hin-DCT-I:
Rück-DCT-I:
ck :=
2 X′′
wl cos (πkl/n),
n l
wj =
X
′′
ck cos (πjk/n),
k = 0, . . . , n.
j = 0, . . . , n.
k
Hin- und Rücktransformation sind bis auf den Faktor 2/n identisch, deswegen haben
beide
den Namen DCT-I bekommen. Natürlich kann man auch beide Formeln mit
p
2/n schreiben. Der Beweis dieser Formeln geht wie zuvor, diesmal beginnend mit
(cos kϕ + cos(k − 1)ϕ) sin(ϕ/2) = (sin kϕ − sin(k − 1)ϕ) cos(ϕ/2),
sodass
n
X
sin nϕ cos ϕ/2
,
0 < ϕ < 2π,
2 sin ϕ/2
k=0
X
n falls j = 0 or j = 2n,
′′
cos (πjk/n) =
0 falls 0 < j < 2n,
k
X
X
X
′′
′′
′′
2 cos (πjk/n) cos (πkl/n) =
cos π(j + l)k/n +
cos π(j − l)k/n
k
′′
cos kϕ =
k
k

 2n falls j = l = 0 or j = l = n,
n falls 0 < j = l < n,
=

0 falls j =
6 l.
8
Daher
X X
′′
k
′′
wl 2 cos (πkl/n) cos (πjk/n) = n wj ,
j = 0, . . . , n.
l
Mit den obigen
P ′′ Koeffizienten c0 , . . . , cn interpoliert das trigonometrische Polynom
T (t) :=
k ck cos (πkt) die Funktionswerte w0 , . . . , wn auf dem Gitter tj = j/n,
j = 0, . . . , n. Wieder ist es symmetrisch mit Periode [−1, 1] und T ′ (0) = T ′ (1) = 0.
Per Definition gilt die Formel DCT-I wieder für alle k ∈ Z and all j ∈ Z. Dann ist
w2n+j = w2n−j = wj für alle j. Beachte, dass w0 6= wn sodass im allgemeinen T (t)
nicht das Grund-Intervall [0, 1] als Periode hat.
(a) DCT-I
0
1
t
(b) DCT-II, DCT-III
0
Abb. 5
1
t
Die Interpolanten T (t) bei DCT-I und DCT-II, DCT-III
9
4. Cosinus-Transformation in x und y-Richtung
Die JPEG-Kompression verwendet ein Gitter in x- und y-Richtung. Dementsprechend
geht es vom Ortsraum in den Frequenzraum mit einer zweidimensionalen DCT, was
aber nichts anderes ist als die DCT erst in x-Richtung und danach auch noch in yRichtung anzuwenden. Bei der Cosinus-Transformation hat man dann zweifach indizierte Terme ck,l cos(kπx) cos(lπy) , die wie O(k −2 l−2 ) abklingen.
Die Formeln der DCT-II mit m Punkten in x-Richtung und n Punkten in y-Richtung
benötigen m2 Operationen für jede der n DCTs in x-Richtung, zusammen n m2 flops.
Ferner benötigen sie n2 Operationen für jede der m DCTs in y-Richtung, zusammen
m n2 flops. Naiv ausgeführt, benötigt also die zwei-dimensionale DCT mit m × n
Punkten n m2 + m n2 = (m + n) m n Operationen. Das ist genau was die FFT-Technik
im ersten Schritt benötigt bei m n Datenpunkten. Den ersten und wichtigsten FFTSchritt bekommt man bei zwei Dimensionen also automatisch und ohne eigenes Zutun.
Mehr solche Einsparungen sind möglich, wenn die Punktzahl m n weiter faktorisierbar ist, weil m und n selbst in Faktoren zerfallen. Das ist der Fall bei der JPEGKompression, wo m = n = 8 (siehe unten). Allerdings lohnt bei so kleinen Werten die
aufwändigere Programmierung nicht so recht.
10
5. Anwendung in der JPEG-Kompression
Die JPEG-Kompression wählt einen Mittelding zwischen Orts- und Frequenzraum:
Sie unterteilt die nx ny Punkte des gewählten Gitters in quadratische Blöcke zu je 8 × 8
Punkte und wendet die zweidimensionale DCT-II mit m = n = 8 auf jeden Block für
sich an. Die Wahl eines relativ kleinen Wertes für die Parameter m und n führt zu
sehr vielen völlig unabhängigen Blöcken und erlaubt deshalb sehr viel Parallelarbeit.
Das ist sehr günstig für die modernen GPUs auf den Grafikkarten.
Die Formel DCT-II für die Cosinus-Koeffizienten im 8 × 8-Block ist also
7
dk,l
7
1 XX
=
wi,j cos (π(2i+1)k/16) cos (π(2j+1)l/16),
16 i=0 j=0
k = 0, . . . , 7, l = 0, . . . , 7.
d0,0 ist viermal der Mittelwert der Ordinaten wk,l . Zahlenbeispiel:






w := 




25.04
35.17
42.46
46.92
48.54
47.33
43.27
36.38
42.40
56.44
66.54
72.72
74.97
73.28
67.67
58.12
55.42 64.10 68.44 68.44 64.10
72.39 83.02 88.34 88.34 83.02
84.61 96.65 102.67 102.67 96.65
92.07 104.97 111.42 111.42 104.97
94.79 108.00 114.61 114.61 108.00
92.75 105.73 112.22 112.22 105.73
85.96 98.16 104.26 104.26 98.16
74.43 85.29 90.73 90.73 85.29
55.42
72.39
84.61
92.07
94.79
92.75
85.96
74.43






,




gibt






d = 





326.21 −37.65 −36.87 −3.94 −8.27 −1.17 −2.62 −0.30
−17.49
1.62
1.59
0.17
0.36
0.05
0.11
0.01 

−29.97
2.78
2.72
0.29
0.61
0.09
0.19
0.02 

−1.83
0.17
0.17
0.02
0.04
0.01
0.01
0.00 
.
−6.72
0.62
0.61
0.07
0.14
0.02
0.04
0.00 
−0.55
0.05
0.05
0.01
0.01
0.00
0.00
0.00 

−2.13
0.20
0.19
0.02
0.04
0.01
0.01
0.00 
−0.14
0.01
0.01
0.00
0.00
0.00
0.00
0.00
11
i=0, j=0
i=7, j=7
j
i
i=7, j=0
Abb. 6 Die Funktionswerte wi,j des Zahlenbeispiels
d
d=0
d=−40
l
k
Abb. 7 Die Cosinus-Koeffizienten dk,l des Zahlenbeispiels
12
6. Quantisierung
[Quantelung, Engl. quantization]
Wir haben gesehen, dass die Einführung des JPEG-Gitters und der Unterabtastung
4:2:0 eine wichtige Datenkompression erlaubt. Die danach besprochene DCT gibt dagegen für sich keine weitere Kompression, denn die Transformation ist ja umkehrbar. Sie
zeigt aber, welche Daten wichtig und welche vernachlässigbar sind. Sie zeigt auch die
Wirkung solcher Vernachlässigungen und wie weit man damit gehen kann.
Naheliegend ist, eine Schranke σ einzuführen und einen Cosinus-Koeffizienten dk,l durch
null zu ersetzen wenn sein Betrag kleiner als σ/2 ist. Das verändert auch den Interpolanten T überall um weniger als σ/2.
Das gilt aber genauso für Veränderungen an größeren Koeffizienten. Hier ist das Ziel
der Manipulation eine Konfektionierung der Koeffizienten, was Einsparungen durch
Kodierung ermöglicht analog zu S, M, L und XL bei Kleidung. Die JPEG-Norm
arbeitet sogar mit 64 individuellen Schranken σk,l für die 64 Cosinus-Koeffizienten dk,l
und rundet dk,l/σk,l zur nächsten ganzen Zahl. Eine typische Wahl:


10 15 25 37 51 66 82 100
 15 19 28 39 52 67 83 101 


 25 28 35 45 58 72 88 105 


 37 39 45 54 66 79 94 111 
σ = 
.
 51 52 58 66 76 89 103 119 
 66 67 72 79 89 101 114 130 


 82 83 88 94 103 114 127 142 
100 101 105 111 119 130 142 156
Für die einheitliche Schranke σk,l := 4 ergibt die Quantelung
beispiel

82 −9 −9 −1 −2 0 −1
 −4
0
0
0
0 0
0

1
1
0
0 0
0
 −7

0
0
0
0
0
0
0

d˜k,l = 
0
0
0
0 0
0
 −2
 0
0
0
0
0
0
0

 −1
0
0
0
0 0
0
0
0
0
0
0 0
0
bei dem obigen Zahlen0
0
0
0
0
0
0
0






.




Die kleinsten Cosinus-Koeffizienten dk,l erwartet man für die größten Indices k, l und
die meisten Nullen daher in der rechten, unteren Ecke der Matrix. Deswegen wählt
die JPEG-Norm eine Anordnung der Koeffizienten im Zickzack entlang der Diagonalen
k + l = const (Abb. 8) und setzt nach dem letzten Koeffizienten 6= 0 ein ”end-of-block”
Symbol (EOB-Marke). Die meisten Nullen werden dann erst garnicht gespeichert.
Woanders spielt diese Anordnung keine Rolle.
13
0,0
0,1
0,2
0,3
0,4
0,5
0,6
0,7
1,0
1,1
1,2
1,3
1,4
1,5
1,6
1,7
2,0
2,1
2,2
2,3
2,4
2,5
2,6
2,7
3,0
3,1
3,2
3,3
3,4
3,5
3,6
3,7
4,0
4,1
4,2
4,3
4,4
4,5
4,6
4,7
5,0
5,1
5,2
5,3
5,4
5,5
5,6
5,7
6,0
6,1
6,2
6,3
6,4
6,5
6,6
6,7
7,0
7,1
7,2
7,3
7,4
7,5
7,6
7,7
Abb. 8
Reihenfolge der Cosinus-Koeffizienten für die Kompression
Je größer die Schranken σk,l gewählt werden, desto mehr der Cosinus-Koeffizienten
werden zu null gemacht und desto gröber wird die Klassifikation der übrigen. Umso
weniger Bits benötigt die Kodierung dieser Information (siehe unten).
Damit hat auch die zweite Methode zur Bild-Kompression ein bequemes und zuverlässiges Mittel, um den Kompressionsgrad zu beeinflussen.
14
7. Entropie- und Huffman-Kodierung
Die durch Quantelung konfektionierten Cosinus-Koeffizienten aller 8×8 Blöcke bilden
eine Folge mit einem knappen Vorrat {s0 , s1 , s2 , . . . , sN −1 } verschiedener Werte.
(Dazu gehört auch die EOB-Marke.) Schon während der Quantelung ermittelt man
die Häufigkeit νs der erzeugten Werte s. Für diese Werte wird eine sparsame Kodierung
gesucht. Das ergibt eine dritte Daten-Kompression, die jetzt verlustfrei ist und rückgängig gemacht werden kann. Dieser letzte Teil ist Routine-Informatik.
Statt der üblichen Indices (Nummerierung) ist eine Kodierung günstiger mit wenig Bits
für die häufigen Werte und dafür mehr Bits für die seltenen Werte. (Binäre Codewörter
erlauben die feinste Abstufung bei der Länge.)
Eine solche variable Länge der Codewörter erfordert einen Präfix-freien Code: kein
Codewort darf der Anfang eines anderen Codewortes sein (so wie bei der Ortsvorwahl
im Telefonnetz). Notwendig und hinreichend dafür ist ein Binärbaum mit den N
Symbolen als Blättern: jeder Knoten, der kein Blatt ist, verzweigt zu genau zwei
tieferen Knoten (echter oder strikter Binärbaum). Der Abstand eines Knotens von der
Wurzel (”root”) ist seine Ordnung λ und jeder Knoten bekommt ein Codewort mit λ
Bits: 0 als letztes Bit bei der Verzweigung nach links-unten und 1 bei der Verzweigung
nach rechts-unten. Insbesondere ist der Abstand des Blattes s von der Wurzel seine
Ordnung λs und sein Codewort hat λs Bits. (Abb. 9, Schritt 4)
Wenn man einen Binärbaum von den N Blättern her aufbaut, hat man die Wahl von
zwei beliebigen Blättern für den ersten darüberstehenden Knoten, also N(N − 1)/2
Möglichkeiten. Für den zweiten Knoten gibt es dann nur noch (N − 1) (N − 2)/2
Wahlmöglichkeiten, usw. Insgesamt gibt es N! (N − 1)!/2N −1 echte Binärbäume mit
N Blättern und ebensoviele Präfix-freie Kodierungen.
Sei νs die Häufigkeit des Symbols sP
in der zu kodierenden Symbolkette. Dann hat
die kodierte Symbolkette die Länge s νs λs Bits. Eine Kodierung, die diese Summe
minimal macht über alle Präfix-freien Kodierungen, heißt Entropie-Kodierung nach
einer Formel-Analogie aus der statistischen Wärmelehre. Wegen der nur endlich vielen
Möglichkeiten existiert immer ein Minimum und mindestens ein optimaler Binärbaum.
Bei einem optimalen Baum gehören die Blätter mit den kleinsten Häufigkeiten νs zu
den längsten Pfaden λs :
νs < νs′ =⇒ λs ≥ λs′ .
In der Tat, bei νs < νs′ und λs < λs′ kann man die beiden Blätter s und s′ im
Binärbaum vertauschen (umhängen), was die Zielfunktion verkleinert:
(νs λs + νs′ λs′ ) − (νs′ λs + νs λs′ ) = (νs − νs′ )(λs − λs′ ) > 0.
{z
}
|
{z
}
|
vorher
nachher
Bei einem optimalen Baum ist das also ein Widerspruch.
Einen eleganten Algorithmus zur Konstruktion einer solchen Kodierung fand David A.
Huffman 1952. Die damit erzeugte Kodierung heißt Huffman-Kodierung – de facto
zum Synonym geworden, weil jeder diesen Huffman-Algorithmus verwendet, der eine
Entropie-Kodierung benötigt.
15
Wie schon oben beim Zählen, fängt man die Konstruktion eines optimalen Baumes bei
den vorhandenen Blättern als einziger Zeile an und trägt dort ihre Häufigkeit ein. Als
erstes Paar wählt man die Blätter s und s′ mit den kleinsten Häufigkeiten. Sie werden
um eine Zeile nach unten verschoben und der neue Knoten tritt an ihre Stelle mit νs +νs′
als seine eingetragene Häufigkeit. Diese Operation wird (N −1)mal
P durchgeführt. Dann
ist die oberste Zeile erreicht mit nur noch einem Knoten und s νs als Häufigkeit. Es
ist nicht schwer zu beweisen, dass auf diese Weise ein optimaler Binärbaum und eine
optimale Kodierung entstehen.
Start:
5
2
2
Schritt 1:
5
2
2
2
1
3
2
Schritt 2:
5
4
2
Schritt 3:
3
2
5
2
1
7
4
2
Schritt 4:
1
3
2
12
0
5
1
1
7
10
100
2
4
2
11
101
110
2
2
3
111
1
Abb. 9 Huffman-Algorithmus für 5 Symbole mit der Häufigkeit 5, 2, 2, 2, 1.
Im Knoten die Häufigkeit, oberhalb des Knotens das binäre Codewort (blau)
16
8. Rücktransformation
Jeder ”Browser” für das Internet und jeder Photo-Editor (wie zum Beispiel Adobe’s
Photoshop) haben einen Bildbetrachter implementiert. Dieser muss die JPEG-Datei
zurück ins Pixel-Format wandeln, indem die beschriebenen Kompressions-Schritte in
der umgekehrten Reihenfolge rückgängig gemacht werden. Also:
1) Verlustfreie Huffman-Kodierung entschlüsseln und EOB-Marken expandieren,
2) Mittels DCT-III vom Frequenzraum zurück in den Ortsraum gehen,
3) Y Cb Cr -Pixel in RGB-Pixel wandeln und in das JPEG-Gitter eintragen.
Der Informationsverlust durch die Quantelung läßt sich natürlich nicht beheben. Das
Gitter der Rohdaten wieder herzustellen, lohnt im allgemeinen nicht, obwohl der vorhandene Interpolant sehr wohl die Möglichkeit für die scheinbare Verfeinerung bietet.
17
9. Nachbearbeitung von JPEG-Bildern
Vor allem Photos muss man oft nachbearbeiten, zum Beispiel
•
einen Ausschnitt wählen (”cropping”),
•
Drehen, entweder um ±90o oder zum Ausrichten um wenige Grad,
•
Farbstiche korrigieren,
•
Retouchen vornehmen, zum Beispiel rote Blitzlicht-Augen,
•
Staub und Korn mittels Filtern entfernen,
•
Beschriften mit Legende und Datum.
Im allgemeinen muss man dazu die Rohdaten benutzen und nicht die mit JPEG komprimierte Datei. Wenn die Rohdaten nicht zur Verfügung stehen, muss man genau
wie bei der simplen Bildbetrachtung die JPEG-Datei ins Pixel-Format wandeln. Wenn
man dann nach der Bearbeitung wieder zum JPEG-Format komprimiert, gibt es einen
erneuten Informationsverlust. Nach mehrmaligem Hin und Her leidet die Qualität
sichtbar.
Es gibt aber einige Ausnahmen, wo die Nachbearbeitung im JPEG-Format stattfinden
kann und soll. Dies ist dann verlustfrei und kann ohne Qualitäts-Einbuße beliebig oft
durchgeführt werden.
Dazu gehören Ausschnitte entlang von 16×16-Blöcke des JPEG-Gitters und Spiegelungen an der x-Achse, an der y-Achse und an der Winkelhalbierenden, also die Übergänge
y → −y, x → −x, x ←→ y. Die Kombination der beiden letzten bewirkt die Drehung
des Bildes um ±90o , die also ebenfalls verlustfrei durchgeführt werden kann (wenn auch
nicht beim Microsoft Internet Explorer ). Die Teilschritte sind:
1) Verlustfreie Huffman-Kodierung entschlüsseln und die EOB-Marken expandieren.
2) Die entsprechenden Vertauschungs-Operationen an den 8 × 8 Blöcken durchführen.
3a) Bei x ←→ y die x-y-Vertauschung auch innerhalb der 8 × 8 Blöcke durchführen,
3b) Bei x → −x die Vorzeichen von dk,l für k = 1, 3, 5, 7 umgekehren,
3c) Bei y → −y die Vorzeichen von dk,l für l = 1, 3, 5, 7 umgekehren,
(das zeigt die Ersetzung von wj durch wn−1−j in der Formel für DCT-II).
4) Verlustfreie Huffman-Kodierung neu erstellen.
18