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