Verlustbehaftete Kompression JPEG: Joint Photographic Experts Group ITU T8.1 definiert Zusammenarbeit von ITU, IEC, ISO Verfahren zur verlustbehafteten Bildkodierung (auch verlustfreier Modus vorhanden) Schritte: Farbraumumrechnung von RGB nach YUV Tiefpass-Filterung und Unterabtastung von U,V Diskrete Cosinus Transformation des Bildes, angewendet auf 8x8 Pixel große Blöcke Quantisierung (angepasst an Empf. des Auges, CSF) Umsortierung: Zick-Zack Scan Entropie Codierung (Lauflängen Codierung, Huffman...) Performance: 1.2.. 2 Bit Pro Pixel: etwa visuell verlustfrei 0.7-1 Bit pro Pixel: "gute" Ergebnisse unter 0,3 Bit pro Pixel: Praktisch unbrauchbar.
Verlustbehaftete Bildcodierung, JPEG Farbtransformation von JPEG: [ Y C r]=[ b C 0,299 0,587 0,114 0,1688 0,331 0,5 0,5 0,4187 0,0813] [ R G B] C r =(R Y )/1,402 C b =(B Y )/1,772 Faktoren, neu im Vergleich zu Normierung der Wertebereiche von C b, C r auf -0.5. 0.5 R, G, B: Bereich 0,, 0.5 Nächster Schritt der Farbcodierung: Tiefpassfilterung (Glättung, notwendig für Unterabtastung nach Nyquist), gefolgt von der Unterabtastung, meist um Faktor 2 in horizontaler und vertikaler Auflösung. (sh. auch:http://en.wikipedia.org/wiki/downsampling) Anschaulich: 3 unterschiedlich große Teilbilder: C b C r Y Nächster Schritt: Diskrete Cosinus Transformation (DCT) Weniger Pixel zu speichern! (¼) Datenreduktion ohne viel Aufwandt!
Zweck: weitere Eigenschaften (Schwächen?) des Auges zu nutzen. Nämlich die unterschiedliche Empfindlichkeit des Auges für unterschiedliche Ortsfrequenzen. Beispiel Bildmuster Vertikal: Ortsfrequenz Null Schwarz-weisses Streifenmuster (sin funktion der Helligkeit, aöso allmähliche Übergänge) 1 0 Blickwinkel, 1 sw Steifenmuster Horizontal: Ortsfreq. 1 per/grad Hier: 1 Periode/Grad horizontale Ortsfrequenz S 1 0 Ort (Winkel) Höhere Ortsfrequenz -> feineres Linienmuster. Auge hat unterschiedliche Empfindlichkeiten für unterschiedlich feine Linienmuster/ Ortsfrequenzen.
Empfindlichkeit Farbe (U, V) Helligk (Y) Contrast Sensitivity Function Ortsfrequenz (per./grad) Grund für Anwendung der DCT für die Codierung: DCT zerlegt das Bild in unterschiedliche Ortsfrequenzen, horizontal und vertikal. Veranschaulichung: Örtliche begrenztes Signal (Bild, Teil vom Bild) Diskrete Fourier Transformation ist unendlich lange Discrete Time Fourier Transform des periodisch fortgesetzten Signales: Sprünge Anfang Ende Ort Ort DFT DTFT
bekommen so nur endlich viele diskrete Frequenzen. wichtig für Codierung Aber: Sprünge durch Periodisierung bedeuten Verschlechterung der Frequenzauflösung. Vermeidung der Sprünge: Periodisierung durch Spiegelung des Signals x(n) 0 N 2N Ort Pixelraster Haben Sprünge vermieden Funktion, die symmetrisch um 0 ist: Discrete Time Fourier Transformation hat nur reelle Anteile, der Imaginärteil wird 0. -> Realteil wird mit Cosinus erzeugt. Für die periodische Fortsetzung mit Spiegelung wird das Pixelraster so gelegt, dass Position 0 genau zwischen zwei Pixeln liegt. D.h. wir haben einen Offset von 0.5 Pixeln, Noch zu beachten: Durch die Spiegelung wird Periodenlänge für Fourier Transformation doppelt so groß -> doppelt so feines Frequenzraster, doppelt so viele Frequenzwerte nach Anwenden der DTFT, können aber die obere Hälfte des Fourier Spektrums weg
lassen, da es symmetrisch zur unteren Hälfte ist (weil reelles Signal). -> Haben nun komplettes "Kochrezept" für unsere DCT! N ist Größe des DCT Bereiches Nur untere Hälfte: nicht bis 2N N 1 y(k )= x(n) cos( 2 π n=0 2 N K (n+0.5)) K=0,, N-1 Ortsfrequenzindex Ortsindex Freq. index Verschiebung um halbes Pixel x(n): Pixelwert bei Position n. Es gibt mehrere DCT Typen, diese nennt sich DCT Typ 2 Python Beispiel 1: Das Beispiel-Signal x ist eine kurze Zeile von 4 Pixeln, eine Helligkeits-Rampe: python import scipy import scipy.fftpack x=scipy.arange(4)*1.0 #Wende die DFT an: scipy.fftpack.fft(x) #array([ 6.+0.j, 2.+2.j, 2.+0.j, 2. 2.j]) #Wende die DCT an: scipy.fftpack.dct(x) #array([ 12., 6.30864406,0., 0.44834153])
Beachte: Bei der FFT haben alle Koeffizienten eine signifikante Groesse (Betrag ist >=2), bei der DCT bekommen wir in der Tat eine deutlich bessere Energie-Kompaktierung in die ersten beiden Koeffizienten. Python Beispiel 2: Wir koennen die DCT vom Typ 2 der Länge N in Python mittels einer FFT der Länge 4N implementieren, ähnlich wie wir oben sahen: ipython pylab import scipy.fftpack as ftp a=arange(1,5) #Example signal block plot(a) #Implementation of DCT2 using FFT: arev=a[:: 1] #reverse order, flip asym=hstack((a,arev)) #symmetric extension plot(asym) asym_up=zeros(16) asym_up[1::2]=asym #upsample by 2 and starting at index 1, and later taking half of half the FFT spectrum, #gives an effect like shift of 0.5 in time or space. Asym_up=ftp.fft(asym_up) #apply FFT Asym=np.real(Asym_up[0:4]) #Take relevant part of it Asym #Out[31]: array([ 20., 6.30864406, 0., 0.44834153]) #Comparison with DCT2 from fftpack: ftp.dct(a) Out[32]: array([ 20., 6.30864406,0., 0.44834153]) #Identical!
Beachte: Der Output mittels gespiegeltem Signal und FFT ist in der Tat identisch zur DCT! Was ist mit den zu 2 Dimensionen eines Bildes? Antwort: DCT wird hintereinander auf Zeilen und Spalten angewendet. Das heisst hier: erst z.b. jede Zeile durch das Resultat der DCT ersetzten, dann darauf aufbauend jede Spalte durch das Resultat der DCT ersetzen. Mathematisch bedeutet dies: N 1 M 1 y(k,l)= x(n,m) cos( π n=0 m=0 N (K (n+0.5))) cos( π M (l(m+0.5))) Wobei n und m die Indizes in x und y Richtung des Bildes sind. k und l sind die Indizes für die Ortsfrequenzen in x und y Richtung. DC wird die Orstfrequenc k=0 und l=0 genannt (DC für Direct Current, also Gleichstrom, hier: konstanter Wert im Bild, der sie bei diesen Frequenzkoeffizienten zeigt) -> Reihenfolge von DCT (erst Spalte oder Zeile) ist egal, da es eine lineare Transformation ist -> separabel Beispiel: Zebra-Bild: y(0,0): Gleichanteil, y(1,0): Wert ungleich 0, y (0,1)=0, denn cos addiert sich bei konstantem x zu 0! DCT wird auf Bild angewendet, aber da die Ortsfrequenzen in verschiedenen Bereichen des Bildes sehr unterschiedlich sein können, wird das Bild in kleinere Komponenten aufgeteilt, auf die dann die DCT angewendet wird.
Bei JPEG: 8x8 Blöcke. 8x8 Blöcke, auf die DCT angewendet wird N=M=8 wir haben damit Zugriff auf die unterschiedlichen Ortsfrequenzen an unterschiedlichen Orten im Bild. Codieren, Quantisieren entsprechend Augenempfindlichkeit. -Beachte: Bei 8x8 kleinen Blöcken ist die Ortsfrequenz bei 0,0 recht breit, reicht noch ins Maximum der Contrast Sensitivity Function herein. Daher muss auch y(0,0) schon fein quantisiert werden. Z.B. y(7,7) kann aber grob quantisiert oder sogar weggelassen werden, weil es nur die feinsten Muster im Block enthält, für die das Auge weniger empfindlich ist (nach C.S.F.)! D.h. Maximum ist gleich bei den tiefsten Ortsfrequenzen des 8x8 Blocks.