Académique Documents
Professionnel Documents
Culture Documents
Bilddatenkompression Entropiecodierung
Arithmetische Codierung Spezialflle: Huffman-Codierung Golomb-Code Implementierungen Das Carry-Over Problem: Bit-Counting Das EOF-Problem Adaptive Codierung Kontextmodellierung Implementierungen Der MQ-Coder Bit-Stuffing
Bilddatenkompression Entropiecodierung
Ziel: Codierung einer Wahrscheinlichkeitsprozesses durch einen Bitstrom einer Lnge, die so kurz wie mglich (= die Entropie) der Quelle ist. Annahme (fr den Augenblick): Prozess 0-ter Ordnung, unabhngige aber nicht gleichverteilte Symbole. Alphabet ={a1,a2,..,an}, Wahrscheinlichkeiten p(ai). Entropie dann: H = -i pi log2(pi)
Ein asymptotisch optimales Verfahren zur Codierung von Nachrichten aus W.keitsprozessen.
Codierungsvorschrift: Starte mit dem Einheitsintervall [0,1) und teile dies proportional zu den W.keiten der Symbole auf:
p(a1)
p(a2)
p(a3)
p(a4)
Whle das Teilintervall, welches dem ersten Symbol der Nachricht entspricht, etwa a4:
p(a1) p(a2) p(a3) p(a4)
p(a1)
p(a2)
p(a3)
Whle erneut das Teilintervall, welches dem nchsten Symbol der Nachricht entspricht, etwa a1:
p(a1)
p(a2)
p(a3)
p(a2)
p(a3)
etc,etc...
p(a1) p(a2) p(a3)
Die codierte Nachricht besteht aus einer (beliebigen) Zahl aus dem Intervall nach Codierung des letzten Symbols.
Bentigte Anzahl von Bits zum Erreichen der Genauigkeit = Logarithmus der Lnge des Intervalls.
L p1, , p N 1log 2
i =1
pi =1i=1 log 2 pi
N =1
pi pi L pi ,, p i
1 N 1 N N
i =1 i
1
=1
pi pi 1 j=1 log 2 pi
1
=1i =1 pi log2 pi i
1 1 1
=1
pi log 2 pi =1 NH
N N
i =1 p i k =1
k
Eingabe ist eine einzige Zahl im Intervall [0,1). Gesucht ist eine Symbolfolge, die diese Zahl codiert.
p(a1) p(a2) p(a3) p(a4)
Bilddatenkompression Decodierung
Input Bei bekannten Wahrscheinlichkeiten kann geschlossen werden, in welchem Intervall der Input liegt. Hier ist das erste Symbol a 4. Das Intervall 4 wird jetzt weiter gem den W.keiten unterteilt:
p(a1) p(a2) p(a3)
k i
k i
p(a4)
p(a3)
0.0000 0.1000 0.1100 0.1110 Hier aufgetragen: Die untere Intervallgrenze als Binrbruch. Beobachtung: Im Intervall zum Symbol ai sind die ersten ki Stellen aller Zahlen innerhalb des Intervalles konstant. Diese Zahlen knnen also schon als Ergebnis herausgeschrieben werden, whrend die Codierung noch luft.
p(a1)
0.0000
0.1000
0.1100 0.1110
Rekursive Aufteilung des Intervals: Die Teilintervalle sind jeweils ein 2k-tel kleiner, d.h. Die Binrbrche der Intervall-Anfnge sind jeweils nur im Vergleich zum ersten Symbol ein ki-tel nach rechts verschoben: 0.101100 0.101110 0.101000
p(a1) p(a3) p(a4)
0.0000
0.1000000
0.1100 0.1110
Ausgabe: 0.100
0.101110
p(a3) p(a4)
0.0000
0.1000000
0.1100 0.1110
Zu jedem Symbol gehrt in dieser Codierung somit eine Ziffernfolge: a1 a2 a3 a4 : : : : 0 10 110 111 Diese Ziffern knnen ohne weiteres direkt vom Codierer geschrieben werden. Dies ist die Huffman-Codierung.
blicherweise stellt man den Code dann in einem Baum(-graphen) dar, bei dem die Bltter die Symbole und die Zweige die Entscheidungspunkte sind, bei denen entweder eine 0 oder eine 1 geschrieben wird.
Bilddatenkompression Huffman-Baum
0
a1 ber diesen Baum kommt man auch sofort zu einem Decodierungsalgorithmus. (wie?)
0
a2 a3
1 0 1
a4
Offenbar ist fr W.keiten, die Zweierpotenzen sind, der HuffmanCode identisch zum arithmetischen Code und damit ebenso optimal. Sind die W.keiten keine Zweierpotenzen, so ist der Code offenbar nicht mehr optimal, bzw. erzeugt zu lange Sequenzen. Um im Rahmen der von der Huffman-Codierung gegebenen Einschrnkung den besten Code fr gegebene Wahrscheinlichkeiten zu finden gibt es den Huffman-Algorithmus. Dieser ist recht aufwndig, und schwierig adaptiv zu machen (spter). Wir werden uns jedoch mit dem optimalen Code begngen...
Bilddatenkompression Huffman-Codierung
Annahme: W.keitsverteilung vom Typ p a k =2 , k =1 Nach dem gleichen Rezept wie oben erhalten wir den folgenden Code: a1 a2 a3 a4 ak : : : : : 0 10 110 1110 111....1110
Da dies auch ein arithmetischer Code ist, ist er fr diese Verteilung auch optimal. Diesen Code kann man auch als Komma-Code lesen: Die 0 dient als Komma zwischen den Codewrtern, die Anzahl der 1en identifiziert das Codewort.
Die Verteilung oben ist ein Spezialfall geometrischer W.keitsverteilungen (oder Laplace-Verteilungen) fr =1/2, die sehr typisch fr Bilddaten sind:
p k =1 k
Der obige Komma-Code ist sicherlich nur optimal fr =1/2, aber lsst sich fr andere aus dem Komma-Code ein guter Code bauen? Erstelle hierzu ein neues Alphabet basiertend auf einem Parameter m auf die folgende Weise:
a0 a1 a2 a4 a4 a5 a6 a7 a8 a9 a10 a11
....
bq:={aqm,aqm+1,aqm+2,...aqm+m-1} cr:={ar,ar+m,ar+2m,ar+3m,...} Aus bq und cr lsst sich ak rekonstruieren: k = mq+r b codiert den Block, c die Position innerhalb des Blockes.
i=0
m1
also wieder eine geometrische Verteilung mit Exponent qm (statt q) p c r =i=0 pa imr =1
r
i=0
im=r
1 m 1
auch eine geometrische Verteilung, aber ber einem endlichen Intervall mit einem um m kleineren Exponenten. Trick: Whle nun m so, dass m 1/2. Codiere b (Block-Index) mit dem Komma-Code, und codiere r (Position im Block) mit ceil(log2m) Bits in der Binrdarstellung. ak :11...110rr..rr q-1 mal 1, einmal 0, Binrdarstellung von r, wobei k=mq + r
Problem bei der Implementierung auer in Spezialfllen unendliche Genauigkeit scheint notwendig!
Reprsentiere das augenblickliche Codeintervall durch zwei Zahlen: A: die Lnge des Codeintervalls C: die untere Intervallgrenze Beide Zahlen werden als Fixkommazahlen in endlicher Genauigkeit reprsentiert, etwa mit 16 Bit.
p(a1) p(a2) p(a3) p(a4)
Lnge A=0x10000 C = 0x0000 Initialisierung des Codeintervalls vor Beginn der Codierung
Der Codierungsschritt: Update von A und C bei der Codierung eines Symbols mit W.keit p(ai)=Pi Vor der Codierung:
Update-Algorithmus: Untere Intervallgrenze verschieben durch die skalierte Gre aller Teilintervalle links von i Intervallgre mit Pi skalieren. Nach der Codierung: A
C C A ji P j A AP i
Normalisieren: Ohne einen weiteren Schritt wrde A immer kleiner werden. Beobachtung: Ein Bit kann aus dem Strom geschrieben werden, sobald das Codierungsintervall vollstndig in der ersten oder zweiten Hlfte des Einheitsintervalles liegt. Falls C+A 0.5: Schreibe 0 Falls C0.5: Schreibe 1
0.5 A
C In diesem Falle kann das halbe Intervall um den Faktor zwei aufgezogen, man sagt, renormalisiert werden.
Normalisierungsalgorithmen:
Hierdurch bleibt das Code-Intervall immer hinreichend gro. Problem: Was geschieht, wenn das Intervall gerade ber die 0.5 hinwegreicht und immer kleiner wird?
Dies ist gleichbedeutend damit, dass fr die den Codestream codierende Zahl noch nicht klar ist, ob es einen berlauf auf das nchste auszugebende Bit gibt. A =0x013f = 0.0000000100111111 0.5 ? C=0x7fef = 0.0111111111101111 Durch Codierung weiterer Symbole kann es passieren, dass A nur immer kleiner wird, diese Entscheidung aber immer weiter nach hinten verzgert wird.
Lsungsmglichkeit 1 (#2 folgt spter): Bits zhlen. Hier steht immer die Bitkombination 01 C=0x7fef = 0.0111111111101111 A=0x013f = 0.0000000100111111 Hier steht fr kleine A immer das Bit 0 Solange C < 0.5 und A+C > 0.5 mssen die grnen Bits gar nicht aufgehoben werden! Entferne diese und zhle mit, wieviele entfernt wurden.
C 2C 1 2
Normalisierung falls C0.25, A < 0.5 und C < 0.5, A+C 0.5
A 2A D D1
Graphische Interpretation der Operation 1 C 2C Normalisierungvorschrift falls C0.25, A < 0.5 2 und C < 0.5, A+C 0.5 A 2A D D1 A 0.25 C A 0.5 C Diese Operation zieht das Codeinterval um 0.5 herum auf. 0.5 0.75
Durch diesen Trick ergibt sich eine Anpassung der gewhnlichen Normalisierung: Die gezhlten Bits mssen geschrieben werden. Gibt es einen berlauf, also C 0.5, so sind dabei die unterdrckten grnen Bits von A null geworden.
Gibt es keinen berlauf, also A+C < 0.5, so sind alle grnen Bits von A eins geblieben.
C= 0.0111111111101111... A= 0.0000000000010000...
Iterationen spter... kein berlauf, A+C < 0.5, alle grnen Bits wurden zwischenzeitlich entfernt
Schreibe das nun bekannte rote 0 Bit, sowie die nicht in C und A gespeicherten, aber gemerkten grnen Bits. Lsche danach den Zhler.
Falls A+C < 0.5: Schreibe eine 0, schreibe D eins-Bits A2A C2A D0 Falls C 0.5: Schreibe eine 1, schreibe D null-Bits A2A C2C-1 D0 Ansonsten falls C 0.25 und A < 0.5: A2A C2C- DD+1 Hierdurch bleiben immer gengend Bits zur Reprsentierung von A und C verfgbar.
Der Decodierer verkleinert zwar stetig das Codeintervall, hat aber keine Information darber, wann die Decodierung abgeschlossen ist und das letzte Symbol decodiert worden ist. Zwei Lsungsmglichkeiten: mit EOF-Symbol: Erweitere das Alphabet geringfgig um ein Symbol EOF mit sehr geringer W.keit: ={a1,a2,...,an,EOF} codiere EOF als Abschluss der Codierung und stoppe die Decodierung sobald ein EOF-Symbol gefunden wurde. bermittle die Anzahl der Symbole in der Nachricht in einem Seitenkanal, etwa in einem formatspezifischen Header, der vorausgeschickt wird.
Selten kennt man die W.keiten im Voraus. Man kann diese in einem ersten Durchgang ber die Daten abschtzen und dann bermitteln, allerdings will man groe Datenmengen in einem Durchgang bermitteln.
Verzgerungsglied 010101... Codierer
ai
p(ai)
Rckwrtsadaptive Anpassung der W.keiten nach Codierung: Intervallunterteilung ndert sich in jedem Schritt.
Obwohl der Codierer das i-te Symbol bereits kennt,werden die W.keitstabellen erst nach der Codierung von ai angepasst, denn...
p(a1)
p(a2)
p(a3)
Die Unterteilung des nchsten Teilintervalles wurden aufgrund der genderten Abschtzungen gendert.
p(a1)
p(a2)
p(a3)
Teile dieses Intervall erneut proportional zu den Wahrscheinlichkeiten der Symbole, ndere die W.keiten erneut...
p(a1) p(a2) p(a3)
... der Decodierer kennt das Symbol erst nach der Decodierung, kann aber die gleiche Anpassung durchfhren.
010101... Decodierer
p(ai)
Hierdurch bleiben die beim Codierer und Decodierer vorliegenden W.keitsabschtzungen synchron und mssen nicht bertragen werden. Mgliche Abschtzung fr p(ai): ~(Anzahl aufgetretener ai Symbole+1)/(Gesamtzahl der Symbole+1)
Bislang: W.keitsmodelle 0-ter Ordnung. Jetzt: Hhere Ordnung, statt W.keiten p(ai) etwa bedingte W.keiten p(ai|ai-1) erste Ordnung. Mache die Intervall-Unterteilung abhngig vom vorherigen Symbol, verwende eine zweidimensionale Tabelle p(at|at-1). Zeile: Auswahl durch das letzte Symbol, der p(a1|a1) p(a2|a1) p(a3|a1) Kontext, whlt die Intervallunterteilung p(a1|a2) p(a2|a2) p(a3|a2)
p(a1|a3) p(a2|a3) p(a3|a3)
Bilddatenkompression Kontextmodellierung
Bislang: W.keitsmodelle 0-ter Ordnung. Jetzt: Hhere Ordnung, statt W.keiten p(ai) etwa bedingte W.keiten p(ai|ai-1) erste Ordnung. Codiererdesign mit Rckwrtsadaption:
Verzgerungsglied Verzgerungsglied 010101...
Bilddatenkompression Kontextmodellierung
ai
Codierer
p(at|at-1)
Verzgerungsglied
Beim Decodierer muss natrlich eine analoge Anpassung vorgenommen werden, damit die Tabellen beim Codierer und Decodierer immer synchron bleiben.
010101... Decodierer
Bilddatenkompression Kontextmodellierung
ai
Verzgerungsglied
p(at|at-1)
Schneller Binrer Arithmetischer Codierer Wird verwendet in JBIG-2 (Bilevel-Codierung), JPEG 2000 Modifizierte Version des Q-Coders, optionaler AC in JPEG Entwickelt von IBM, mit Patenten von IBM & Mitsubishi
LPS
Qe
MPS
1-Qe
Binrer Codierer, es gibt nur zwei Symbole: MPS: Most Probable Symbol mit W.keit 1-Q , oberes Intervall e LPS: Least Probable Symbol, W.keit Q e Code-Intervall hat nicht die Lnge 1 proportionale Unterteilung Der MQ-Coder verzichtet auf alle langsamen oder aufwndigen Operationen. Keine Multiplikation, nur Addition, Subtraktion und Shifts.
C LPS-Codierung: CC AQeA Qe fr A 1
Qe
A
1-Qe
Das A-Register
Falls = 0, so Normalisierung Anders als bei der allgemeinen Darstellung werden bei der Normalisierung nicht sofort die oberen Bits aus C herausgeschrieben,sondern bleiben gebuffert, bis sich ein ganzes Byte angesammelt hat. Register CT zhlt die dort freien Bits.
Ausgabebits 3 Spc 16 Bit
Ausgabe-Bereich
Spacer-Bits
Falls A zu klein wird, muss normalisiert werden. Der MQ-Coder schreibt aber die oberen Bits von C nicht sofort in den Strom, sondern akkumuliert jeweils 8 Bits in der oberen Registerhlfte von C, die dann in einem Zusatzregister B gebuffert werden. Solange A < 0x8000, dann Normalisierung: A 2A C 2C CTCT-1 (Bitcounter, freie Ausgabebits in C) Falls CT = 0: Rume Ausgaberegister B (schreibe in den Ausgabestrom) Kopiere Ausgabebits von C in B Lsche freie Bits in C Setze CT auf die Anzahl der freigewordenen Bits
8 Bit Ausgabebits 3 Spc 16 Bit
Ausgabebuffer B
CT freie Bits
Rechenregister C
Genau wie oben gibt es auch beim MQ-Coder das Carry-Over Problem. Es knnen sich mehr als 8 Bits im Ausgabebereich von C ansammeln, die dann in das B-Register berlaufen mssen. Im Prinzip knnte dann das B-Register ebenso berlaufen und der bisher geschriebene Strom wre ungltig. Qe Carry ?? Carry
8 Bit
Carry
Ausgabebits 3 Spc
+
16 Bit
Ausgabestrom
C-Register
Das Problem des Carry-Over wird hier aber anders als oben gelst: Um ein mehrfaches berlaufen zu verhindern, wird nach je acht 8Bits ein Null-Bit eingefgt, in das das Carry berlaufen kann. Dieser Prozess heit Bit-Stuffing (etwa: Einfttern von Bits).
Algorithmische Beschreibung des Bit-Stuffings: Freilassen von Bits, um das Carry aufzunehmen. Geschieht beim Freirumen des BRegisters und der bernahme von Daten aus C. C hat ein zustzliches Bit, welches das Carry zunchst aufnehmen kann, bis das B-Register beim Rumen angepasst wird.
8 Bit B C 8-Bits 3 Spc 16 Bit
Ausgabebits
Rum-Algorithmus Falls B = 0xff (nchste Ausgabe knnte hier hinein berlaufen) Schreibe B, bertrage nur 7 Bits aus C in B, CT7 Sonst: Ist Carry-Bit in C gesetzt? (berlauf stattgefunden?) BB+1, Carry-Bit0 (bertrage das Carry) Falls B = 0xff (nchste Ausgabe knnte berlaufen, Bitstuffing) Schreibe B, bertrage 7 Bits aus C in B, CT7 Sonst: Schreibe B, bertrage 8 Bits aus C in B, CT8 Sonst: (Normalfall): Schreibe B, bertrage 8 Bits aus B in C, CT8
Erinnerung: Abschtzung im MPS-Fall war: A(1-Qe) A-Qe Intervallgre vor MPS Codierung: A Intervallgre nach MPS Codierung: A-Qe
Das MPS Intervall sollte immer grer als das LPS-Intervall sein, also A-Qe A/2 LPS
Qe
MPS
1-Qe
A-Qe A/2 Das ist fr A < 2Qe nicht mehr der Fall! (Umformung) Mitsubishi-Patent: Codiere in diesem Fall ein LPS wie ein MPS und umgekehrt (Conditional Exchange)
Qe
1-Qe
Codiere stattdessen im Falle A < 2 Qe das jeweils inverse Symbol! LPS-Codierung: Falls A < 2Q : e AA-Q CC+Q e, e Sonst A Q e
MPS-Coding: Falls A< 2Q : (A zu klein) e A Q (LPS-Codierung im MSP-Fall) e Sonst AA-Q ,CC+Q (normale MPS-Codierung) e e
Wie beim gewhnlichen AC-Codierer passt der MQ-Coder Q e adaptiv an die beobachtete Quelle an. Dies geschieht aber ber einen endlichen Automaten abhngig vom Zustand S des Coders. Eintrge in der Tabelle des Automaten: Q (S): Abschtzung der LPS-W.keit im Zustand S e NextLPS(S): Nchster Zustand bei Codierung eines LPS NextMPS(S): Nchster Zustand bei Codierung eines MPS SWITCH(S): Flag, ob LPS und MPS vertauscht werden sollen. (nicht Conditonal Exchange wird verwendet falls Qe>1/2 abgeschtzt werden soll)
Qe NLPS NMPS SWTCH Qe Qe NLPS NMPS SWTCH
NLPS
NMPS SWTCH
Eine Anpassung der Abschtzung der LPS-W.keit Qe geschieht jeweils bei der Codierung eines LPS-Symbols, und manchmal bei der Codierung eines MPS-Symbols, um die Geschwindigkeit zu verbessern: Code-LPS Adaption: If SWITCH(S) then MPS1-MPS SNextLPS(S) Q Q (S) e e Code-MPS Adaption: If A-Q < 0.75 (hier muss sowieso normalisiert werden!) e SNextMPS(S) Q Q (S) e e
011101011...
MQ-Coder
Beispiel fr einen kausalen Kontext: Die Pixelwerte a,b,c und d sind dem Decodierer schon bekannt und knnen zur Bestimmung eines Kontexts verwendet werden.