15.11.06 - Fachbereich 4: HTW Berlin
15.11.06 - Fachbereich 4: HTW Berlin
15.11.06 - Fachbereich 4: HTW Berlin
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Katja Belitz s0515246<br />
Kevin Dreher s0515247<br />
Miguel Dietz s0515288<br />
MEDIENTECHNIK II<br />
Prof. Dr. Kai-Uwe Barthel<br />
Vorlesungsmitschrift<br />
15.11.2006<br />
Seite - 1 -
Wiederholung<br />
Zu Begin der Vorlesung wurden wie immer die Inhalte der letzen Vorlesung<br />
wiederholt. Thema war hier die Codierung von Informationen nach dem Huffman<br />
Verfahren und das Verhältnis zwischen Entropie und der mittleren Codelänge.<br />
Huffman Codierung<br />
Das Prinzip der Huffman Codierung sei hier nur noch einmal kurz zusammengefasst.<br />
Das Huffman Verfahren wird verwendet, um Informationen zu kodieren. Hierbei gilt,<br />
dass je wahrscheinlicher ein Ereignis für ein Symbol, desto kürzer ist der Code, mit<br />
dem es kodiert wird. Man muss außerdem beachten, dass die gefundenen Codes<br />
präfixfrei sind, das heißt, dass keine Codierung für ein Symbol der Anfang der<br />
Codierung eines anders Symbols sein darf.<br />
Wie wichtig es ist, dass man immer mit den Symbolen mit den kleinsten<br />
Wahrscheinlichkeiten beginnt, verdeutlicht das folgende Beispiel, welches in der<br />
Vorlesung besprochen wurde.<br />
Aufgabe<br />
Es soll eine Codierung nach dem Huffman-Verfahren für die Symbole A-F mit den<br />
folgenden Wahrscheinlichkeiten gemacht werden.<br />
A => 0,4<br />
B => 0,1<br />
C => 0,1<br />
D => 0,1<br />
E => 0,1<br />
F => 0,2<br />
Entwicklung des Baumes 1<br />
Symbol resultierender Code Codelänge<br />
A 0 1<br />
B 1000 4<br />
C 1001 4<br />
D 1010 4<br />
E 1011 4<br />
F 11 2<br />
Seite - 2 -
Man kann den Baum jedoch auch ganz anders entwickeln.<br />
Entwicklung des Baumes 2<br />
Symbol resultierender Code Codelänge<br />
A 00 2<br />
B 010 3<br />
C 011 3<br />
D 100 3<br />
E 101 3<br />
F 11 2<br />
Auf den ersten Blick scheint hier ein Problem aufzutreten, denn die errechneten<br />
Codelängen sind unterschiedlich. Eine Überprüfung der benötigten Bit pro Symbol<br />
zeigt jedoch, dass beide Codes gleichwertig sind.<br />
Wie viele Bits pro Symbol benötigt werden, kann berechnet werden, indem man die<br />
erlangte Codelänge mit der jeweiligen Wahrscheinlichkeit des Symbols multipliziert.<br />
1. Beispiel<br />
Codelänge Wahrscheinlichkeit Ergebnis<br />
1 0,4 0,4<br />
4 0,1 0,4<br />
4 0,1 0,4<br />
4 0,1 0,4<br />
4 0,1 0,4<br />
2 0,2 0,4<br />
2,4 Bits/Symbol<br />
2. Beispiel<br />
Codelänge Wahrscheinlichkeit Ergebnis<br />
2 0,4 0,4<br />
3 0,1 0,4<br />
3 0,1 0,4<br />
3 0,1 0,4<br />
3 0,1 0,4<br />
2 0,2 0,4<br />
2,4 Bits/Symbol<br />
Seite - 3 -
Dieses Beispiel zeigt also, dass es unwichtig ist, wie der Baum konstruiert wird,<br />
solange die Regel, dass immer mit den kleinsten Wahrscheinlichkeiten begonnen<br />
werden muss, beachtet wird.<br />
Verhältnis Entropie und mittlere Codelänge<br />
Bei der Ermittlung der Entropie ist zu beachten, dass eine rechnerische Ermittlung<br />
der Wahrscheinlichkeiten nicht immer sinnvoll ist. Dies ist nämlich nur möglich, wenn<br />
die Pixel in einem Bild statistisch unabhängig sind, das heißt, dass die<br />
Wahrscheinlichkeit für den nächsten Pixel unabhängig davon ist, welcher Pixel davor<br />
lag. Da das aber bei Bildern natürlich nicht der Fall ist, bringt eine Kodierung anhand<br />
der rechnerischen Wahrscheinlichkeiten nichts. Man würde hier keine Verkleinerung<br />
erreichen.<br />
Beim Betrachten des Verhältnisses von Entropie und mittlerer Codelänge fällt auf,<br />
dass die mit der Entropie errechnete optimale Codelänge häufig kleiner ist als die<br />
schließlich gefundene mittlere Codelänge. Dies liegt daran, dass die bei der Entropie<br />
berechneten Codelängen meist keine ganzzahligen Werte sind. Ein Code kann aber<br />
nur aus natürlichen Zahlen bestehen. Im Allgemeinen ist die Abweichung zwischen<br />
Entropie und mittlerer Codelänge jedoch nicht allzu groß. Bei Schwarzweißbildern ist<br />
der Unterschied jedoch erheblich. Generell ist festzuhalten, dass die Faustregel<br />
gilt.<br />
Arithmetische Codierung<br />
mittlere Codelänge 1 bit/Symbol<br />
Die Arithmetische Codierung ist ein weiteres verlustfreies Datenkompressions-<br />
Verfahren, welches der Entropie noch näher kommt. Die Grundidee der<br />
Arithmetischen Codierung stellt sich als relativ simpel dar, wogegen die<br />
Implementierung komplizierter verläuft. Wegen der guten Datenkompression wird in<br />
den Videocodierungsverfahren DivX oder Mpeg4 (Parts 10) das Arithmetische<br />
Codierungsverfahren verwendet.<br />
Bei diesem Beispiel handelt es sich um ein Bild, das schwarze und weiße Elemente<br />
besitzt. In Abbildung 1 nimmt man die senkrechte Seite als<br />
Wahrscheinlichkeitsintervall (mit einer Gesamtwahrscheinlichkeit von 1) und die<br />
waagrechten Blöcke entsprechen der Anzahl der eingelesenen Pixel<br />
Für den ersten Pixel beträgt die Wahrscheinlichkeit 2/3 für Schwarz und 1/3 für Weiß.<br />
Bei dem zweiten Pixel entsteht wieder eine Aufteilung in<br />
die Wahrscheinlichkeiten von 2/3 für einen schwarzen<br />
und 1/3 für einen weißen gezogenen Pixel. Für die<br />
Kombination Schwarz-Schwarz beträgt die<br />
Wahrscheinlichkeit also 2/3 * 2/3 = 4/9. Bei der<br />
Addierung aller Kombinationen muss die<br />
Gesamtwahrscheinlichkeit wieder 1 ergeben, in diesem<br />
Beispiel also: SS = 4/9<br />
+ SW = 2/9 [2/3 * 1/3]<br />
+ WS = 2/9 [1/3 * 2/3]<br />
+ WW = 1/9 [1/3 * 1/3]<br />
---------------------------------------<br />
Abbildung 1 = 1<br />
Seite - 4 -
Beim Einlesen des dritten Pixels werden die Intervalle der Teilwahrscheinlichkeiten<br />
erneut in 2/3 und 1/3 aufgeteilt. Die Wahrscheinlichkeit für SSS beträgt also 2/3 * 2/3<br />
* 2/3 = 8/27, für WWW 1/3 * 1/3 * 1/3 = 1/27.<br />
Bei Abbildung 1 kann man<br />
anhand der Höhe der vertikalen<br />
Kästchen die<br />
Wahrscheinlichkeiten ablesen.<br />
Die Höhe der hinteren Kästchen<br />
entspricht also immer der<br />
Wahrscheinlichkeit, dass der<br />
dazugehörige Fall eintritt. Auffällig<br />
ist auch, dass die<br />
Gesamtwahrscheinlichkeit immer<br />
eins beträgt, was man auch an<br />
der gleich bleibenden<br />
Gesamthöhe sehen kann.<br />
Da wir das Bild nun in einen<br />
Bitcode umwandeln müssen, wird<br />
jedes Intervall in zwei gleichgroße<br />
Abschnitte aufgeteilt. Anhand des<br />
folgenden Schaubildes wird die<br />
Codegenerierung deutlich<br />
gemacht. Der grüne Abschnitt<br />
wird als 0er-Bit, der rote als 1er-<br />
Bit festgelegt. Mit einem Bit kann<br />
man also Unterscheiden ob man in der oberen oder unteren Hälfte ist. Wäre der<br />
erste Pixel weiß so würde der Code mit 1 anfangen, da der weiße Abschnitt sich<br />
eindeutig in der oberen Hälfte befindet.<br />
Mit einem ersten schwarzen Pixel könnte man nicht eindeutig festlegen, ob es sich in<br />
der oberen oder der unteren Hälfte befindet. Also muss der nächste Pixel<br />
herangezogen werden. Falls der Pixel erneut Schwarz ist, kann man sichergehen,<br />
dass das erste Bit 0 beträgt, da der SS-Teil komplett in die untere Hälfte des 0er-<br />
Intervalles fällt. Bei einem weißen Pixel wäre die Zuordnung immer noch unklar und<br />
es müsste das nächste Pixel betrachtet werden, um eine Unterscheidung festlegen<br />
zu können. Es folgt eine Code-Tabelle für das obere Schaubild:<br />
W 1 S ?<br />
WW 11 WS 1? SW ? SS 0?<br />
WW<br />
W<br />
111 WWS 111 WSW 110 WSS 1?? SWW 10? SWS ??? SSW 01? SSS 0??<br />
Um WWW und WWS unterscheiden zu können, muss mit dem nächsten Pixel weiter<br />
deferenziert werden. Gleiches gilt für SWS, da das Feld immer noch nicht zum<br />
oberen oder unteren Feld zuzuordnen ist. Das arithmetische Codierverfahren<br />
funktioniert also so, dass immer bei Eindeutigkeit eine 0 oder 1 ausgegeben wird, um<br />
danach den überbleibenden Teil auf die 1 aufzublasen und man so wieder von vorne<br />
anfängt. Was man erkennen kann ist, dass desto größer die Wahrscheinlichkeitsintervalle,<br />
desto länger dauert es bis der Bereich kleiner als geworden ist und<br />
somit als Bit-Code ausgegeben werden kann. Kleinere Bereiche geben also<br />
schneller Bits aus als größere Bereiche.<br />
Seite - 5 -
Durch diese Bit-Code-Aufteilung kann man das Schaubild auch als Zahlenbereich<br />
ansehen, sodass die horizontalen Abschnitte die Dezimalstellen darstellen.<br />
Dezimalstellen werden im Binärsystem wie folgt ausgegeben:<br />
Dezimalsystem: 0,3 = 3 * 10^-1<br />
Binärsystem: 0,1 = 1 * 2^-1<br />
0,01 = 1 * 2^-2<br />
Die Dezimalzahl 0,8 würde also in unserem oberen Schaubild mit 0,110 beginnen, da<br />
die blaue Linie erst durch zwei rote und dann durch ein grünes Feld verläuft. Jede<br />
Zahl zwischen 0 und 1 kann so als gebrochene Binärzahl dargestellt werden. Da jede<br />
gebrochene Binärzahl mit Null anfängt, kann die erste Stelle weggelassen werden<br />
(0,110 => 110).<br />
Die adaptive Arithmetische Codierung geht nicht von einer vorgegebenen<br />
Wahrscheinlichkeitsverteilung aus, sondern gestaltet diese dynamisch zu den vorher<br />
eingelesenen Daten. Es werden also die bereits kodierten Zeichen betrachtet und die<br />
Wahrscheinlichkeitswerte P(j) dementsprechend neu berechnet. Diese permanente<br />
Adaption der Wahrscheinlichkeitstabelle erfordert natürlich einen erheblichen<br />
zusätzlichen Rechenaufwand.<br />
Mit dieser Codierung kann man jedoch fast genau die Entropie erreichen.<br />
Grundlagen der Bildkompression 2<br />
Prinzip der Entropiekodierung<br />
1 2 3 4<br />
4 3 2 1<br />
5 6 7 8<br />
… … … …<br />
Anhand dieses kleinen Beispiels haben wir das Prinzip der Entropiekodierung<br />
besprochen. Bei näherer Betrachtung fällt auf, dass die Werte der zweiten Zeile<br />
denen der ersten in gespiegelter Form entsprechen. Diese Art von Muster gilt es bei<br />
der Entropiekodierung auszunutzen. Denn die zweite Zeile muss hier nicht mit<br />
übertragen werden. Stattdessen wird dem Decoder mitgeteilt, dass die zweite Zeile<br />
genau der Spiegelung der ersten entspricht und<br />
so können viele Daten gespart werden.<br />
Bei der Entropiekodierung gilt es also Zusammenhänge zwischen den Werten in<br />
einem Signal zu finden. Daraus werden dann statistische Modelle gebaut, in denen<br />
Wahrscheinlichkeiten für bestimmte Ereignisse sowie Redundanzen von Werten<br />
festgehalten werden. Ein Beispiel für ein solches Modell wäre, dass die<br />
Wahrscheinlichkeit, dass auf zwei Vokale noch ein dritter folgt, sehr gering ist.<br />
Trifft so ein gefundenes Ereignis immer zu, kann man es beim Coder/Decoder<br />
vorausgesetzt werden. Ansonsten analysiert der Coder das Signal, filtert<br />
Redundanzen, Muster etc. heraus und sendet sie dann als Nebeninformation mit an<br />
Seite - 6 -
den Decoder. Ein Problem hierbei ist jedoch, dass durch diese Modelle zwar sehr viel<br />
eingespart werden kann, hat man am Ende aber zu viele verschiedene Modelle,<br />
muss man das, was man eingespart hat, wieder dafür aufbrauchen, um die Modelle<br />
als Nebeninformationen an den Decoder zu senden.<br />
Lauflängenkodierung<br />
Die Lauflängenkodierung ist ein Verfahren zur verlustfreien Komprimierung von<br />
digitalen Daten. Hierbei wird überprüft, wie viele aufeinander folgende Bits denselben<br />
Wert haben. Dann wird die Anzahl der Bits und der entsprechende Wert gespeichert.<br />
Daher kommt die Lauflängenkodierung vor allem dann zum Einsatz, wenn die zu<br />
komprimierende Datei viele Wiederholungen oder Sequenzen von gleichen Werten<br />
enthält.<br />
Bei der Lauflängenkodierung besteht der Code aus zwei Werten: einer kodierten<br />
Variante der gefundenen Farbe und einer kodierten Variante der Länge des Laufes,<br />
d.h. der Häufigkeit, wie oft die entsprechende Farbe hintereinander vorkommt.<br />
Als Beispiel haben wir dieses Bild verwendet. Es enthält nur drei Farben: weiß,<br />
orange und blau. Für die Kodierung werde pro Farbe werden 2 Bits verwendet. Wie<br />
viele Bits für die Kodierung der Lauflänge verwendet werden, sollte davon abhängig<br />
gemacht werden, wie häufig die Farbe wechselt. Je mehr Bits man „spendiert“, desto<br />
länger werden die Läufe. Für unser Beispiel haben wir uns für eine Kodierung von 5<br />
Bits entschieden, was bedeutet, dass ein Lauf maximal 32 lang sein darf. Insgesamt<br />
werden pro Lauf also 7 Bits benötigt.<br />
Will man jetzt herausfinden, wie viel Bits für das gesamte Bild benötigt werden, muss<br />
man nur die Bitzahl pro Lauf mit der Zeilenzahl mal nehmen. Für unser Beispiel<br />
bedeutet das:<br />
Dies entspricht 0,43 Bit pro Pixel.<br />
99 Läufe x 7 Bit = 693 Bits<br />
Lauflängenkodierung ist nicht geeignet für Fotos oder Texte, da es hier sehr selten<br />
vorkommt, dass zweimal hintereinander dieselbe Farbe oder derselbe Buchstabe<br />
kommt.<br />
Bekannte Dateiformate, die das Prinzip der Lauflängenkodierung anwenden, sind<br />
besonders ältere Grafikformate wie Bitmap, GEM Image, Targa oder PCX.<br />
Quelle: http://de.wikipedia.org/wiki/Laufl%C3%A4ngenkodierung<br />
Seite - 7 -
Lempel-Ziv-Welch-Algorithmus<br />
Der LZW- oder auch Lempel-Ziv-Welch-Algorithmus ist ein Algorithmus, der zur<br />
Datenkompression dient. Er wird häufig bei Grafikformaten, wie z.B. GIF angewandt.<br />
Im Jahre 1978 entwickelten Abraham Lempel & Jacob Ziv den Algorithmus unter<br />
dem Namen LZ78. Terry A. Welch verbesserte diesen im Jahre 1984.<br />
Das LZW- Komprimierungsverfahren ist verlustfrei und wird in den bekannten<br />
Bildformaten GIF, TIFF und JPEG verwendet. Da das erzeugte Wörterbuch von LZW<br />
aber erst zu Laufzeit generiert wird und somit formatunabhängig ist, eignet sich LZW<br />
für jede Form von Daten. Außerdem ist LZW von der Byteanordnung der<br />
verschiedenen Plattformen unabhängig, da es seine komprimierten Daten als Bytes<br />
und nicht als Strings ablegt.<br />
Weitere Bezeichnungen für den LZW sind Substitutions- oder wörterbuchbasierender<br />
Algorithmus.<br />
Der ''LZW'' Algorithmus ist keine frei verfügbare Software. Die Firma Unisys hat<br />
zusammen mit ''CompuServe Information Service'' einen Lizenzvertrag zur Nutzung<br />
des LZW im GIF-Dateiformat.<br />
Wird also ein ''CompuServe Information Service'' genutzt oder das GIF-Dateiformat<br />
bearbeitet, müsste mit CompuServe ein Lizenzvertrag abgeschlossen werden,<br />
welcher an eine Lizenzgebühr für jede verkaufte Kopie geknüpft wäre. Diese<br />
Vereinbarungen gelten nur für Rechner von CompuServe, deshalb müssen für alle<br />
anderen Programme, die GIF-Dateien benutzen, Gebühren an Unisys entrichtet<br />
werden.<br />
Funktion:<br />
Zuerst wird aus den unkomprimierten Daten ein Wörterbuch erstellt, was auch String-<br />
oder Übersetzungstabelle genannt wird. Die unkomprimierten Daten werden in<br />
einzelne Zeichenketten zerlegt, die dann mit den bereits vorhandenen<br />
Wörterbucheinträgen verglichen werden.<br />
Falls schon ein Eintrag vorhanden ist, wird nur die Kennung des Worterbucheintrags<br />
in der komprimierten Ausgabe wiedergegeben. Ist dies nicht der Fall, wird ein Eintrag<br />
erstellt, sodass man diesen bei Bedarf später wieder verwenden kann.<br />
Einer der Vorteile des Algorithmus ist, dass das Wörterbuch nicht zusätzlich abgelegt<br />
wird. Es wird direkt in die Datei geschrieben. Wörterbucheinträge werden über einen<br />
12 Bit langen Index angesprochen.<br />
LZW im PhotoShop:<br />
- Für Web speichern<br />
- Farbpalette<br />
- Auf lossy stellen<br />
- Datei wird kleiner<br />
- Strukturen, welche gleich sind werden erzeugt<br />
- Man macht das Bild extra „kaputt“<br />
Seite - 8 -
Beispiel:<br />
Die Zeichenkette ABABCAB sei gegeben. Der Coder sowie der Decoder kennt in<br />
diesem Beispiel die Symbole A, B und C. Das Kodierungsverfahren funktioniert nach<br />
folgendem in Pseudocode verfasstem Prinzip.<br />
set w =”“<br />
loop<br />
read a character k<br />
if wk exists in the dictionary<br />
w = wk<br />
else<br />
output the code for w<br />
add wk to the dictionary<br />
w = k<br />
end loop<br />
Wie man an dem Code sehen kann, ist der Wert für „w” anfangs leer. Jetzt wird<br />
nacheinander immer ein Buchstabe eingelesen. Wenn A gelesen wird kommt es in<br />
die Variable „k“ hinein, „wk“ wäre demzufolge A. Da A in der Bibliothek (auch<br />
Wörterbuch) steht, wird nichts ausgegeben und A wird in „w“ gespeichert.<br />
Das nächste Zeichen wird gelesen, hier wäre es das B, welches in der Variable „k“<br />
steht. „wk“ ist also AB. Da „w“ nicht mehr gleich „wk“ ist, kommt man in den else-Teil<br />
und gibt A aus (output the code for w). AB kommt in die Bibliothek (add wk to the<br />
dictionary). B wird jetzt in „w“ gespeichert.<br />
Der nächste zu lesende Wert ist A , wird in „k“ gespeichert. „wk“ entspricht nun BA.<br />
BA ist unbekannt, wird in der Bibliothek gespeichert und der Code für B wird<br />
ausgegeben.<br />
A ist nun in „w“, B wird gelesen und in der Variable „k“ gespeichert. „wk“ entspricht<br />
AB<br />
Da AB schon in der Bibliothek vorhanden ist wird nichts ausgegeben und unser „wk“<br />
wird zu „w“. „w“ entspricht nun AB, „k“ ist nun C. „wk“ ist also ABC und kommt wieder<br />
in die Bibliothek und der Code für AB wird ausgegeben.<br />
Dies wird dann für die restlichen Zeichen fortgesetzt. Hier sind noch einmal alle<br />
Schritt in einer kurzen Tabelle zusammengefasst:<br />
w k wk Output<br />
„“ A A -<br />
A B AB Code für A<br />
B A BA Code für B<br />
A B AB -<br />
AB C ABC Code für<br />
AB<br />
Seite - 9 -