03.09.2013 Aufrufe

15.11.06 - Fachbereich 4: HTW Berlin

15.11.06 - Fachbereich 4: HTW Berlin

15.11.06 - Fachbereich 4: HTW Berlin

MEHR ANZEIGEN
WENIGER ANZEIGEN

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 -

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!