Tilo Strutz Bilddatenkompression
Aus dem Programm
Informations- und Kommunikationstechnik
Telekommunikation von D. ...
308 downloads
1270 Views
8MB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
Tilo Strutz Bilddatenkompression
Aus dem Programm
Informations- und Kommunikationstechnik
Telekommunikation von D. Conrads Einführung in die Digitale Bildverarbeitung von A. Erhardt Digitale Signalverarbeitung von K.-D. Kammeyer und K. Kroschel Nachrichtenübertragung von K.-D. Kammeyer Satellitenortung und Navigation von W. Mansfeld Grundlagen der Informationstechnik von M. Meyer Kommunikationstechnik von M. Meyer Signalverarbeitung von M. Meyer Digitale Sprachsignalverarbeitung von P. Vary, U. Heute und W. Hess Information und Codierung von M. Werner Digitale Signalverarbeitung mit MATLAB® von M. Werner Digitale Signalverarbeitung mit MATLAB®-Praktikum von M. Werner Nachrichtentechnik von M. Werner Nachrichten-Übertragungstechnik von M. Werner Digitale Audiosignalverarbeitung von U. Zölzer www.viewegteubner.de
Tilo Strutz
Bilddatenkompression Grundlagen, Codierung, Wavelets, JPEG, MPEG, H.264 4., überarbeitete und ergänzte Auflage Mit 189 Abbildungen und 72 Tabellen STUDIUM
Bibliografische Information der Deutschen Nationalbibliothek Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über abrufbar.
Das in diesem Werk enthaltene Programm-Material ist mit keiner Verpflichtung oder Garantie irgendeiner Art verbunden. Der Autor übernimmt infolgedessen keine Verantwortung und wird keine daraus folgende oder sonstige Haftung übernehmen, die auf irgendeine Art aus der Benutzung dieses Programm-Materials oder Teilen davon entsteht. Höchste inhaltliche und technische Qualität unserer Produkte ist unser Ziel. Bei der Produktion und Auslieferung unserer Bücher wollen wir die Umwelt schonen: Dieses Buch ist auf säurefreiem und chlorfrei gebleichtem Papier gedruckt. Die Einschweißfolie besteht aus Polyäthylen und damit aus organischen Grundstoffen, die weder bei der Herstellung noch bei der Verbrennung Schadstoffe freisetzen.
1. Auflage 2000 2., aktualisierte und erweiterte Auflage 2002 3., aktualisierte und erweiterte Auflage 2005 4., überarbeitete und ergänzte Auflage 2009 Alle Rechte vorbehalten © Vieweg +Teubner | GWV Fachverlage GmbH, Wiesbaden 2009 Lektorat: Reinhard Dapper | Walburga Himmel Vieweg+Teubner ist Teil der Fachverlagsgruppe Springer Science+Business Media. www.viewegteubner.de Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Jede Verwertung außerhalb der engen Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlags unzulässig und strafbar. Das gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Verarbeitung in elektronischen Systemen. Die Wiedergabe von Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. in diesem Werk berechtigt auch ohne besondere Kennzeichnung nicht zu der Annahme, dass solche Namen im Sinne der Warenzeichen- und Markenschutz-Gesetzgebung als frei zu betrachten wären und daher von jedermann benutzt werden dürften. Umschlaggestaltung: KünkelLopka Medienentwicklung, Heidelberg Technische Redaktion: FROMM MediaDesign, Selters/Ts. Druck und buchbinderische Verarbeitung: Krips b.v., Meppel Gedruckt auf säurefreiem und chlorfrei gebleichtem Papier. Printed in the Netherlands ISBN 978-3-8348-0472-3
V
Vorwort zur vierten Auf lage Das Entwickeln und Anwenden eines Systems zur Kompression von Daten sind wie das Kochen einer Mahlzeit. Folgende Dinge sind mindestens zu beachten: • • • • • • •
F¨ ur wen wird gekocht (Applikation)? Welche Zutaten werden ben¨ otigt (Methoden, Techniken)? Was kosten die Zutaten (Komplexit¨at der Algorithmen, Hardwarekosten)? Wie groß ist der Vorbereitungsaufwand (Entwicklungskosten)? Wie lange muss gekocht werden (Dauer der Kompression eines Signals)? Welchen optischen Eindruck wird das angerichtete Essen machen (Signalqualit¨at)? Wie gut wird das Essen schmecken (Kompressionsverh¨altnis)?
Es ist leicht einzusehen, dass der Aufwand f¨ ur die Zubereitung m¨oglichst klein sein sollte, der Genuss beim Essen aber m¨ oglichst groß. F¨ ur manche Anl¨asse kommt es auch nur auf den maximalen Genuss an, f¨ ur andere ist es in erster Linie wichtig, dass das Essen schnell auf den Tisch kommt. Das Buch Bilddatenkompression“ enth¨alt alle Zutaten, die f¨ ur das Entwickeln eines ” Kompressionssystems hilfreich sind, sortiert sie nach Einsatzgebiet und beschreibt ihre Wirkungsweise. Außerdem findet der Leser einige Rezepte, wie die Ingredienzen erfolgreich miteinander kombiniert werden k¨ onnen. Die vierte Auflage wurde wieder um einige Zutaten bereichert, andere wurden ausf¨ uhrlicher erl¨ autert. ¨ Neben den 28 neuen Abbildungen und Tabellen sowie den vielen kleinen Anderungen und Verbesserungen, die teilweise durch meine Studenten angeregt wurden, f¨allt vor allem auf, dass den meisten Kapiteln ein Abschnitt mit Testfragen und Aufgaben nachgestellt wurde. Dies erm¨ oglicht dem Leser, das Verst¨andnis f¨ ur den dargebotenen Stoff besser zu pr¨ ufen. F¨ ur ausgew¨ ahlte Aufgaben sind die L¨osungen am Ende des Buches aufgelistet. Die wichtigsten inhaltlichen Erweiterungen sind mit Angabe der Kapitel: • Beispiele f¨ ur die Bildkompression mit Vektorquantisierung (3), • bessere Strukturierung des Abschnitts zur Codierungsadaptation (4), • wesentliche Erweiterung der Ausf¨ uhrungen zu den informationstheoretischen Grundlagen (Markow-Modell, Verbund- und bedingte Wahrscheinlichkeit) (5), adiktion von Signalwerten (6), • erg¨ anzende Angaben zur Pr¨ • Beschreibung des Wavelet-Filterentwurfs anhand von Pol-Nullstellen-Pl¨anen (6), • wesentliche Erweiterung des Abschnitts zum Lifting-Schema (6), • Beschreibung der ganzzahligen Wavelet-Transformation (6), • leichte Modifikationen am WaveQA-Algorithmus (Quelltexte, 9/7-Wavelet-Transformation u.a.) (7, Anhang D), • wichtige Erg¨ anzungen zur optimalen Anpassung der Quantisierungsintervalle an die Zerlegungsstufen der Wavelet-Transformation (7), • erweiterte Ausf¨ uhrungen zum YCbCr-Farbraum, um den Varianten in verschiedenen Standards gerecht zu werden (8), • neue Farbraumtransformationen (YCgCo und YCgCo-R) (8),
VI • Abbildungen (auch farbig) zur besseren Erl¨auterung der verschiedenen Farbraumtransformationen (8), • wesentliche Erg¨ anzungen zur DCT-basierten Kompression im JPEG-Standard (Basisbilder, Codetabellen, Syntax, ausf¨ uhrliches Decodierungsbeispiel im Anhang) (9), ¨ • JPEG 2000: vollst¨ andige Liste der Teile des Standards, Uberblick u ¨ber Part 2 (9), Codierungsbeispiel (Anhang C), • Erl¨ auterungen zu den aktuellen Formaten f¨ ur das hochaufl¨osende Fernsehen (HDTV) (10), • L¨ osungen zu ausgew¨ ahlten Aufgaben (Anhang E), • Aktualisierung von Sachwortregister und Formelzeichenliste und • Anpassen der Terminologie an international u ¨ bliche Schreibweisen. Die Erweiterungen der Ausf¨ uhrungen zum DCT-basierten JPEG-Standard sind der Tatsache geschuldet, dass auch nach neun Jahren JPEG 2000 der alte“ JPEG-Standard ” immer noch die dominierende Rolle in digitalen Ger¨aten und im Internet spielt. Das vorliegende Buch ist im Einzelnen wie folgt gegliedert: ¨ Kapitel 1 f¨ uhrt den Leser in die Problematik der Ubertragung von Daten und in die Notwendigkeit der Kompression ein. Anschließend werden im zweiten Kapitel die Grundlagen der Datenkompression behandelt. Es wird begr¨ undet, warum Kompression m¨oglich ist und wie man die Leistungsf¨ ahigkeit eines Kompressionsalgorithmus bewerten kann. Kapitel 3 besch¨ aftigt sich mit der Datenreduktion, also dem Weglassen von (irrelevanten) Informationen. Es werden die Abtastratenumsetzung und Verfahren zur Quantisierung diskutiert. Die Kapitel 4 und 5 befassen sich mit den Codierungsverfahren. Anhand von einfachen Beispielen wird zun¨ achst die Codierung einzelner Symbole und die Anpassung an die statistischen Eigenschaften des zu verarbeitenden Signals beschrieben. Anschließend werden Verfahren erl¨ autert, welche die Beziehungen zwischen den Symbolen eines Signals zur Steigerung der Kompression ausnutzen. Die Ausf¨ uhrungen im Kapitel 6 beinhalten drei wesentliche Methoden zur Dekorrelation von Signalwerten. Den Beginn machen Techniken zur Pr¨adiktion von Signalwerten. Danach werden die Grundlagen diskreter Transformationen erl¨autert und verschiedene Transformationsarten vorgestellt. Eine besondere Stellung nehmen dabei die WaveletTransformation und die fraktale Transformation ein. Im dritten Teil dieses Kapitels werden die Grundlagen von Filterb¨ anken behandelt. Die wichtigen Eigenschaften von Wavelet-Filterb¨ anken und die Probleme bei der Implementierung der diskreten WaveletTransformation werden anhand von Quelltextbeispielen diskutiert. Kapitel 7 widmet sich ausschließlich den Aspekten der waveletbasierten Kompression. Anhand von Quelltexten eines lauff¨ ahigen C-Programms wird eine m¨ogliche Variante zur Codierung auf Basis der diskreten Wavelet-Transformation vorgestellt. Kapitel 8 beschreibt die Eigenschaften des menschlichen Auges, das Helligkeits- und das Farbsehen. Das Verst¨ andnis der visuellen Wahrnehmung ist eine Voraussetzung f¨ ur die sinnvolle Entwicklung von Algorithmen zur Bilddatenkompression. Es werden alle modernen Farbr¨ aume und die entsprechenden Transformationen erl¨autert.
VII Das Kapitel 9 befasst sich mit den Standards zur Einzelbildkompression JPEG, JPEG-LS und JPEG 2000. Es wird gezeigt, wie Verfahren und Methoden der Datenkompression zu leistungsf¨ ahigen Systemen kombiniert werden k¨onnen. Ziel ist dabei nicht die vollst¨andige Darlegung der Standards, sondern die Darstellung der Konzepte unter Bezugnahme auf die in den vorangegangenen Kapiteln beschriebenen Grundlagen. Kapitel 10 stellt grundlegende Verfahren zur Bildsequenzkompression vor. Dabei geht es im Wesentlichen um die Verringerung der zeitlichen Korrelation durch Methoden der Bewegungskompensation. Das letzte Kapitel behandelt die Standards zur Kompression von Videodaten. Es beschreibt die Besonderheiten bei der Verarbeitung von Bildsequenzen und zeigt die Entwicklung der Methoden beginnend mit MPEG-1 bis hin zum neuen Standard H.264. Im Anhang des Buches finden sich die verwendeten Testbilder, ein vollst¨andiges Beispiel f¨ ur die Decodierung eines JPEG-Bitstroms, ein Beispiel zur Codierung in JPEG 2000, die Quelltexte der beschriebenen Algorithmen und L¨osungen zu ausgew¨ahlten Testfragen. Leipzig, im Mai 2009
Tilo Strutz
VIII
Vorwort zur ersten Auf lage (Auszug) Die digitale Kommunikationstechnik hat in den letzten Jahrzehnten eine enorme Entwicklung erfahren und ist dabei, nach und nach jene Verfahren zu verdr¨angen, die zeitund wertekontinuierliche Signale verarbeiten. Digitales Telefonieren ist mittlerweile der Standard, digitales Fernsehen wird bereits praktiziert. Auch das Radio erreicht den H¨orer unter anderem durch das Internet in digitaler Form. F¨ ur den zunehmenden Einsatz von Digitaltechnik gibt es gute Gr¨ unde. Erstens ist dadurch meist eine bessere Qualit¨at der ¨ Signale realisierbar, vor allem weil die digitale Ubertragung einen besseren Schutz gegen ¨ Ubertragungsfehler erm¨ oglicht. Zweitens ist die Verarbeitung digitaler Signale oft auch einfacher als die von analogen Signalen. Diese Vorteile m¨ ussen allerdings durch einen Nachteil erkauft werden: digitale Signalquellen produzieren sehr große Datenmengen. Trotz der rasanten Entwicklung von Speichermedien (Festplatten im mehrstelligen Giga¨ byte-Bereich) und Ubertragungsmedien mit Bandbreiten von vielen Megabit pro Sekunde st¨ oßt man in der Praxis st¨ andig an Leistungsgrenzen, da die Datenflut in gleichem Maße steigt. Oft ist die modernste Technik nicht jedem Nutzer zug¨anglich. Aber auch die Bed¨ urfnisse der Technikbenutzer sind dem technisch Machbaren stets einen Schritt voraus. Dies ist der Grund, warum Informationstechnologien zur effizienten Datenkompression f¨ ur ¨ die Speicherung und Ubertragung von Signalen immer wichtiger werden. Insbesondere die Bild- und Video-Codierung hat eine wachsende Bedeutung, da hier zwei- und sogar mehrdimensionale Signale verarbeitet werden m¨ ussen. Typische Anwendungen der Datenkompression sind: Archivierung von Daten jeglicher Art, digitales Fernsehen, Videoaufzeichnung, Bildtelefon, Videokonferenz, digitale Fotografie, Video¨ uberwachung, Telemedizin u.v.a.m. Dieses Buch wendet sich an Ingenieure der Nachrichten-, Informations- und Medientechnik, Informatiker und Physiker sowie an Studierende in einem entsprechenden Hauptstudium. Aber auch der interessierte Leser mit einer ad¨aquaten technischen Vorbildung findet hier einen geeigneten Lesestoff. Das Buch vermittelt allgemeine informationstheoretischen Grundlagen f¨ ur die Datenkompression, erl¨autert Algorithmen verschiedener Codierungsmethoden und beschreibt spezielle Verfahren und Methoden f¨ ur die Bild- und Videokompression. Insbesondere wird auf die modernen Verfahren der waveletbasierten Kompression und die damit verbundenen Problemstellungen eingegangen. Besonderer Wert wurde auf die Anreicherung der theoretischen Basis mit Beispielen gelegt, die eine Diskussion der Effekte und Ergebnisse erm¨oglichen. Desweiteren sind die Quelltexte einiger Algorithmen, wie zum Beispiel der arithmetischen Codierung, im Anhang abgedruckt. Das Lehrbuch ist somit als vorlesungsbegleitendes Material, f¨ ur das Selbststudium und als Nachschlagewerk geeignet.
Rostock, im Oktober 2000
Tilo Strutz
IX
Inhaltsverzeichnis 1 Einf¨ uhrung
1
2 Grundlagen der Datenkompression 2.1 Informationsgehalt und Entropie . . . . . . . . . 2.2 Kriterien zur Kompressionsbewertung . . . . . . 2.2.1 Kompressionsverh¨ altnis . . . . . . . . . . 2.2.2 Signalqualit¨ at . . . . . . . . . . . . . . . . 2.2.3 Rate-Distortion-Funktion . . . . . . . . . 2.2.4 Merkmale eines Kompressionsalgorithmus 2.3 Redundanz und Irrelevanz . . . . . . . . . . . . . 2.3.1 Redundanz . . . . . . . . . . . . . . . . . 2.3.2 Irrelevanz . . . . . . . . . . . . . . . . . . 2.4 Testfragen . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
5 5 10 10 10 13 14 15 15 16 17
3 Datenreduktion 3.1 Modifikation der Abtastrate . 3.1.1 Unterabtastung . . . . ¨ 3.1.2 Uberabtastung . . . . 3.2 Quantisierung . . . . . . . . . 3.2.1 Skalare Quantisierung 3.2.2 Vektorquantisierung . 3.3 Praktische Anwendung . . . . 3.4 Testfragen . . . . . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
18 18 18 20 21 21 26 28 30
. . . . . . . . . .
31 31 33 34 35 38 38 40 41 42 44
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
4 Entropiecodierung 4.1 Codierungstheorie . . . . . . . . . . 4.2 Morse-Code . . . . . . . . . . . . . . 4.3 Shannon-Fano-Codierung . . . . . . 4.4 Huffman-Codierung . . . . . . . . . . 4.5 Golomb- und Rice-Codes . . . . . . . 4.5.1 Golomb-Codes . . . . . . . . 4.5.2 Rice-Codes . . . . . . . . . . 4.5.3 Exponentielle Golomb-Codes 4.6 Universelle Pr¨ afixcodes . . . . . . . . 4.7 Decodierung von Pr¨ afixcodes . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
X
Inhaltsverzeichnis 4.8
Arithmetische Codierung . . . . . . . . . . . . . 4.8.1 Festkomma-Implementierung . . . . . . . 4.8.2 Beschleunigte Implementierung . . . . . . 4.8.3 Bin¨ are arithmetische Codierung . . . . . . 4.9 Codierungsadaptation . . . . . . . . . . . . . . . 4.9.1 Semi-adaptive Anpassung von Pr¨afixcodes 4.9.2 Kontextbasierte Codierung . . . . . . . . 4.9.3 Anpassung durch Sortieren . . . . . . . . 4.9.4 Voll-adaptive Anpassung von Pr¨afixcodes 4.9.5 Adaptation der arithmetischen Codierung 4.10 Codierung von sehr großen Symbolalphabeten . . 4.11 Testfragen . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
47 49 55 59 60 60 61 63 63 63 64 68
5 Pr¨ acodierung 5.1 Informationstheoretische Grundlagen . . . . . . . . 5.1.1 Markow-Modell . . . . . . . . . . . . . . . . 5.1.2 Verbundwahrscheinlichkeit . . . . . . . . . . 5.1.3 Verbundentropie und bedingte Entropie . . 5.1.4 Praktische Implikationen . . . . . . . . . . 5.2 Laufl¨ angencodierung . . . . . . . . . . . . . . . . . 5.2.1 Allgemeine Codierung mehrwertiger Signale 5.2.2 Signale mit Vorzugsamplitude . . . . . . . . 5.2.3 Verarbeitung bin¨ arer Signale . . . . . . . . 5.3 Phrasen-Codierung . . . . . . . . . . . . . . . . . . 5.3.1 Der LZ77-Algorithmus . . . . . . . . . . . . 5.3.2 Der LZ78-Algorithmus . . . . . . . . . . . . 5.3.3 Der LZW-Algorithmus . . . . . . . . . . . . 5.4 Blocksortierung . . . . . . . . . . . . . . . . . . . . 5.5 Bit-Markierung . . . . . . . . . . . . . . . . . . . . 5.6 Viererbaum-Codierung . . . . . . . . . . . . . . . . 5.7 Maximalwert-Codierung . . . . . . . . . . . . . . . 5.8 Minimalwert-B¨ aume . . . . . . . . . . . . . . . . . 5.9 Testfragen . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
69 69 70 71 73 76 78 78 80 81 82 82 83 83 86 89 89 93 94 96
. . . . .
99 99 100 102 103 103
6 Techniken zur Dekorrelation 6.1 Pr¨ adiktion von Signalwerten . . . . . . . . . 6.1.1 Einfache lineare Pr¨ adiktion . . . . . 6.1.2 Lineare Pr¨ adiktion h¨ oherer Ordnung 6.1.3 Pr¨ adiktion mit Quantisierung . . . . 6.1.4 2D-Pr¨ adiktion . . . . . . . . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
Inhaltsverzeichnis
XI . . . . . . . . . . . . . . . . . . . . . .
104 106 107 108 108 109 111 111 112 112 113 115 120 126 127 136 140 142 145 148 154 156
. . . . . . . . . . .
158 158 158 159 160 162 164 165 165 165 166 166
8 Wahrnehmung und Farbe 8.1 Visuelle Wahrnehmung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.1.1 Netzhaut und Sehnerven . . . . . . . . . . . . . . . . . . . . . . . . 8.1.2 Die Lichtempfindung . . . . . . . . . . . . . . . . . . . . . . . . . .
173 173 173 174
6.2
6.3
6.4 6.5
6.1.5 Nichtlineare Pr¨ adiktion . . . . . . . . . . . . . . . 6.1.6 Der Wertebereich von Pr¨adiktionsfehlern . . . . . 6.1.7 Anmerkungen . . . . . . . . . . . . . . . . . . . . . Transformationen . . . . . . . . . . . . . . . . . . . . . . . 6.2.1 Diskrete Transformationen . . . . . . . . . . . . . 6.2.2 Orthogonale Transformation . . . . . . . . . . . . 6.2.3 Biorthogonale Transformation . . . . . . . . . . . . 6.2.4 Diskrete Fourier-Transformation (DFT) . . . . . . 6.2.5 Karhunen-Lo`eve-Transformation (KLT) . . . . . . 6.2.6 Diskrete Kosinus-Transformation (DCT) . . . . . . 6.2.7 Diskrete Walsh-Hadamard-Transformation (WHT) 6.2.8 Diskrete Wavelet-Transformation (DWT) . . . . . 6.2.9 Fraktale Transformation . . . . . . . . . . . . . . . Filterb¨ anke . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3.1 Zwei-Kanal-Filterb¨ anke . . . . . . . . . . . . . . . 6.3.2 Oktavfilterb¨ anke . . . . . . . . . . . . . . . . . . . 6.3.3 2D-Filterung . . . . . . . . . . . . . . . . . . . . . 6.3.4 Beste Basen — Wavelet-Pakete . . . . . . . . . . . 6.3.5 Implementierung von Filterb¨anken . . . . . . . . . 6.3.6 Das Lifting-Schema . . . . . . . . . . . . . . . . . Kompressionssysteme . . . . . . . . . . . . . . . . . . . . Testfragen . . . . . . . . . . . . . . . . . . . . . . . . . . .
7 Waveletbasierte Bildkompression ¨ 7.1 Uberblick . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 Encoder . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2.1 Transformation . . . . . . . . . . . . . . . . . . . 7.2.2 Quantisierung . . . . . . . . . . . . . . . . . . . . 7.2.3 Pr¨ acodierung . . . . . . . . . . . . . . . . . . . . 7.2.4 Entropiecodierung . . . . . . . . . . . . . . . . . 7.3 Decoder . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.3.1 Decodierung des Bitstroms . . . . . . . . . . . . 7.3.2 Rekonstruktion der Transformationskoeffizienten 7.3.3 R¨ ucktransformation . . . . . . . . . . . . . . . . 7.4 Kompressionsergebnisse . . . . . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . .
XII 8.2
8.3
Inhaltsverzeichnis Farbsysteme . . . . . . . . . 8.2.1 Was ist Farbe? . . . 8.2.2 CIE-Normfarbtafel . 8.2.3 Der RGB-Farbraum 8.2.4 Der CYM-Farbraum 8.2.5 Der HLS-Farbraum . 8.2.6 Die Yxx-Farbr¨ aume 8.2.7 Farbpaletten . . . . Testfragen . . . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
. . . . . . . . .
9 Standards zur Einzelbildkompression (JPEG) 9.1 Historie . . . . . . . . . . . . . . . . . . . . . . . . 9.2 JPEG . . . . . . . . . . . . . . . . . . . . . . . . . 9.2.1 DCT-basierte Kompression . . . . . . . . . 9.2.2 Die Arbeitsmethoden . . . . . . . . . . . . 9.2.3 JPEG-Syntax und Organisation der Daten 9.2.4 Kompressionsergebnisse . . . . . . . . . . . 9.3 JPEG-LS – Verlustlose Kompression . . . . . . . . 9.3.1 Der Kompressionsalgorithmus . . . . . . . . 9.3.2 Encodierungsprozeduren . . . . . . . . . . . 9.3.3 Das Datenformat . . . . . . . . . . . . . . . 9.3.4 Resultate der verlustlosen Kompression . . 9.4 JPEG 2000 – Waveletbasierte Kompression . . . . 9.4.1 Das Kompressionsverfahren . . . . . . . . . 9.4.2 Die Datenstruktur . . . . . . . . . . . . . . 9.4.3 Dateiformat-Syntax (JP2) . . . . . . . . . . 9.4.4 Erweiterungen im Part 2 . . . . . . . . . . . 9.4.5 Kompressionsergebnisse im Vergleich . . . . 9.5 Testfragen . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . .
10 Grundlegende Verfahren zur Bildsequenzkompression 10.1 Struktur eines Video-Codecs . . . . . . . . . . . . . . . . 10.2 Bewegungssch¨ atzung und -kompensation . . . . . . . . . 10.2.1 Bewegungsarten und Sch¨atzverfahren . . . . . . 10.2.2 Block-Matching . . . . . . . . . . . . . . . . . . . 10.2.3 Warping . . . . . . . . . . . . . . . . . . . . . . . 10.3 Testfragen . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . . . . .
177 177 178 179 180 181 182 189 191
. . . . . . . . . . . . . . . . . .
192 192 194 194 204 209 218 225 225 226 232 235 239 240 248 256 257 258 258
. . . . . .
261 261 263 263 264 271 272
11 Standards zur Bildsequenzkompression 273 11.1 Einf¨ uhrung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Inhaltsverzeichnis
XIII
11.2 Bildformate . . . . . . . . . . . . . . . . . . . . . . . 11.3 MPEG-Systemschicht . . . . . . . . . . . . . . . . . 11.4 Kompressionsverfahren (MPEG-1/2) . . . . . . . . . 11.4.1 Struktur von Video-Elementarstr¨omen . . . . 11.4.2 Verarbeitung von I-Bildern . . . . . . . . . . 11.4.3 Verarbeitung von P- und B-Bildern . . . . . . 11.4.4 Bewegungskompensation . . . . . . . . . . . . 11.4.5 Bitratensteuerung . . . . . . . . . . . . . . . 11.4.6 Besonderheiten von MPEG-2 . . . . . . . . . 11.5 H.263 und MPEG-4 . . . . . . . . . . . . . . . . . . 11.5.1 H.263 . . . . . . . . . . . . . . . . . . . . . . 11.5.2 MPEG-4 . . . . . . . . . . . . . . . . . . . . 11.6 H.264 . . . . . . . . . . . . . . . . . . . . . . . . . . 11.6.1 Grundkonzept . . . . . . . . . . . . . . . . . 11.6.2 Dekorrelation . . . . . . . . . . . . . . . . . . 11.6.3 Quantisierung . . . . . . . . . . . . . . . . . . 11.6.4 Codierung . . . . . . . . . . . . . . . . . . . . 11.6.5 Filter zur Unterdr¨ uckung von Blockartefakten 11.6.6 Profile und Levels . . . . . . . . . . . . . . . 11.6.7 Erweiterungen . . . . . . . . . . . . . . . . . 11.7 Testfragen . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . .
275 277 278 278 281 282 283 283 284 288 288 289 294 294 296 305 306 308 310 310 311
A Testbilder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313 B JPEG Decodier-Beispiel
. . . . . . . . . . . . . . . . . . . . . . . . . . . 317
C JPEG 2000 Codier-Beispiel . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 D Quelltexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 E L¨ osungen zu ausgew¨ ahlten Aufgaben . . . . . . . . . . . . . . . . . . . . . 366 Formelzeichen und Abk¨ urzungen . . . . . . . . . . . . . . . . . . . . . . . . . 369 Literatur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 Sachwortverzeichnis
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
1
Kapitel 1
Einfu ¨ hrung Die Kompression von Daten ist eine Form der digitalen Signalverarbeitung. Im Gegensatz zu analogen Signalen sind digitale Signale sowohl wertdiskret als auch zeitdiskret. Sofern eine Signalquelle keine digitalen, sondern analoge Signale produziert (z.B. Mikrofon), die komprimiert werden sollen, ist eine Digitalisierung erforderlich. Dazu wird das analoge Signal zu diskreten Zeitpunkten abgetastet und anschließend jedem Abtastwert ein diskreter Amplitudenwert zugeordnet. In Abbildung 1.1 ist der Zusammenhang von analogen und digitalen Signalen veranschaulicht. Es gibt aber auch Quellen, die direkt digitale Signale erzeugen. Ein einfaches Beispiel hierf¨ ur ist ein Texteditor-Programm. Jedem eingegebenen Zeichen wird ein Codewort, also ein digitaler Wert (z.B. ASCIICode) zugeordnet. Digitale Signale k¨ onnen nach verschiedenen Gesichtspunkten klassifiziert werden. (Abb. 1.2). Von diesen Merkmalen h¨angen die M¨oglichkeiten der weiteren Verarbeitung ab. Bevor ein Signal gespeichert oder u ¨bertragen wird, durchl¨auft es eine Verarbeitungsstre¨ cke. Abbildung 1.3 zeigt ein vereinfachtes Ubertragungsmodell. Die von einer Nachrichtenquelle1 erzeugten Daten werden durch Verfahren der Datenkompression komprimiert. Redundante und gegebenenfalls auch irrelevante Anteile werden beseitigt. Als Synonym f¨ ur Datenkompression“ wird aus historischen Gr¨ unden auch noch der Begriff Quel” ” lencodierung“ verwendet, um anzudeuten, dass die Verfahren an die Eigenschaften der Signalquelle angepasst sind. Moderne Kompressionssysteme (wie zum Beispiel zur Bildoder Audiokompression) m¨ ussen jedoch auch die Eigenschaften des Signalempf¨angers ber¨ ucksichtigen, wenn Ver¨ anderungen am digitalen Signal erlaubt sind. Deshalb sollte der umfassendere Begriff Datenkompression“ benutzt werden. ” Die nachfolgende Kanalcodierung f¨ ugt gezielt wieder etwas Redundanz (zus¨atzliche Daten) hinzu, um einen Fehlerschutz oder zumindest eine Fehlererkennung zu erm¨oglichen. Einfache Beispiele daf¨ ur sind Parit¨ at-Bits oder CRC-Codes. Durch die Kanalcodierung 1 Die
Begriffe Signalquelle, Nachrichtenquelle und Informationsquelle werden als Synonyme verwendet.
A
A
analog
t
A
zeitdiskret
t
A
wertdiskret
Abbildung 1.1: Digitalisierung
t
digital
t
2
1 Einfuhrung ¨
Digitale Daten
Herkunft − Digitalisierung analoger Daten (Mikrofonaufnahmen, Fotografie) − digitale Erzeugung (z.B. MIDI, Computergrafik, ASCII−Text, Maschinencode)
Format
Auflösung
− eindimensional (Audiosignale, Ultraschallechos, Text) − zweidimensional (Bildsignale, Echogramme) − dreidimensional (Bildsequenzen) − ...
− binär (z.B. schwarz−weiß) − mehrwertig (z.B. Graustufen mit 8 Bit) − mehrkanalig (z.B. Farbbilder mit 3 x 8 Bit)
Abbildung 1.2: Einteilung von digitalen Daten nach verschiedenen Gesichtspunkten
Quelle
Daten− kompression
Kanalcodierung (Fehlerschutz)
Modulation Störungen
Kanal (Übertragung/Speicherung)
Senke
Daten− rekonstruktion
Fehlererkennung Fehlerkorrektur
Demodulation
¨ Abbildung 1.3: Allgemeines Modell einer Ubertragungsstrecke wird der Informationsfluss an die Eigenschaften des Kanals, wie zum Beispiel Bandbreite und Fehlerrate, angepasst. Auf der Empf¨angerseite k¨onnen dadurch Fehler erkannt und zum Teil auch korrigiert werden. Durch die anschließende Modulation wird die Information einem physikalischen Tr¨ ager aufgepr¨agt, der entweder die Speicherung (z.B. durch Magnetisieren) oder das Senden (z.B. mittels Funkwellen) erm¨oglicht. Dieses Buch befasst sich ausschließlich mit der Datenkompression. Es werden die allgemein g¨ ultigen Grundlagen und darauf aufbauend spezielle Verfahren f¨ ur die Bilddatenkompression behandelt. Zur Unterscheidung der Verarbeitung auf Sender- und Empf¨ angerseite spricht man auch von Encodierung und Decodierung. Die Kombination von Encoder und Decoder wird h¨ aufig als Codec bezeichnet. ¨ Die Ubermittlung von Informationen ist an einen Datenstrom gekoppelt, der als informationstheoretische Verpackung betrachtet werden kann. Von der Art der Verpackung h¨angt ¨ die zur Ubertragung erforderliche Datenmenge ab. Man stelle sich vor, jemand hat einen kurzen Brief geschrieben und m¨ ochte diesen verschicken. Im Allgemeinen wird niemand auf die Idee kommen, einen solchen Brief statt in einen kleinen Umschlag in einen großen Karton zu packen, da erstens der Transport zum Postamt unhandlich und zweitens die ¨ Bef¨ orderung durch die Post wahrscheinlich teurer ist. Ahnlich ist es mit Informationen.
1 Einführung
Information
Information
Information
Info rma tion
unterschiedliche Träger mit gleicher Information
Information
3
Information Abbildung 1.4: Tr¨ager gleicher Information
Sie stecken im Ausgangszustand in einer großen Verpackung und sind an einen Trager ¨ gebunden, der eine große Datenmenge verursacht. Man spricht auch von Rohdaten. Ein konkretes Beispiel w¨ are die Digitalisierung von Audiosignalen mit einer Aufl¨osung von 16 Bits pro Abtastwert. Diese 16 Bits sind die Verpackung (oder Tr¨ager) f¨ ur eine Amplitudeninformation. In Abbildung 1.4 sind verschiedene Verpackungen dargestellt. Sie enthalten alle die gleiche Information, auch wenn sie einmal doppelt vorkommt (Abb. 1.4 oben links) oder segmentiert wurde (links unten). Wenn nun Gr¨oße der Verpackung und Datenmenge direkt proportional zueinander sind, w¨ urde man von den f¨ unf dargestellten Varianten die Verpackung unten in der Mitte ausw¨ahlen. Ziel der Datenkompression ist es, die Information von einem Tr¨ ager loszul¨osen, der eine große Datenmenge verursacht, und an einen neuen Tr¨ ager mit m¨ oglichst geringer Datenmenge zu binden. F¨ ur das Beispiel des Audiosignals w¨ urde das bedeuten, man sucht nach einem Informationstr¨ager, der im statistischen Mittel weniger als 16 Bits pro Abtastwert ben¨otigt. Grunds¨atzlich unterteilt man die elementaren Verfahren und Hilfsmittel zur Verringerung von Datenmengen in drei Gruppen (Abb. 1.5). Die erste Gruppe kann mit dem Begriff Datenreduktion umschrieben werden. Dazu geh¨oren alle Verfahren, die etwas von der Signalinformation wegnehmen, die Information also ver¨andern. Die zweite Gruppe umfasst alle Codierungsalgorithmen, welche ohne Informationsverlust die Daten verarbeiten, um eine Kompression zu erzielen bzw. zu unterst¨ utzen. Dementsprechend unterscheidet man verlustbehaftete (engl.: lossy compression) und verlustlose (engl.: lossless compression) Kompressionsstrategien. Verlustlose Strategien arbeiten ausschließlich mit Codierung, w¨ahrend verlustbehaftete Verfahren Codierung und Datenreduktionsverfahren miteinander kombinieren. Erg¨ anzt wird dies durch eine dritte Klasse von Verarbeitungsmethoden, die durch Dekorrelation der Signaldaten sowohl verlustbehaftete als auch reversible Kompressionsverfahren unterst¨ utzen k¨ onnen. Hinzu kommen Mittel und Methoden zur Adaptation der Verarbeitung an die Signaleigenschaften. Verlustbehaftete Kompressionsverfahren erzielen h¨aufig eine deutlich bessere Kompression als verlustlose. Sie k¨ onnen allerdings nur dann eingesetzt werden, wenn der Empf¨anger ¨ die Anderung des Signals toleriert. Dies ist zum Beispiel bei der Wahrnehmung von Bild und Ton durch den Menschen der Fall. Wertet eine Maschine die empfangenen Daten
4
1 Einf¨ uhrung
Datenkompression
Codierung − reversibel − Entfernen von Redundanz
Dekorrelation − mit Einschränkung reversibel − Konzentration der Signalenergie bzw. der Informaion
Datenreduktion − nicht reversibel − Entfernen von Irrelevanz
Adaptation Abbildung 1.5: Einteilung von Methoden und Hilfsmitteln zur Verringerung der Datenmenge (z.B. ein ausf¨ uhrbares Computerprogramm) aus, so k¨onnen sie durch Datenreduktion unbrauchbar werden. Es gibt aber auch F¨alle, in denen die Maschine toleranter ist als der Mensch. Nimmt man einen Quelltext in der Programmiersprache C, so kann dieser durchaus ver¨ andert werden, wenn man sich auf das Weglassen von Leerzeichen, Tabulatoren, Zeilenumbr¨ uchen und Kommentaren beschr¨ankt. Das Ergebnis des Compilierens wird dadurch in keiner Weise beeinflusst, w¨ahrend die Lesbarkeit durch den Menschen stark herabgesetzt w¨ are.
Notation Das Buch verwendet im Prinzip drei Arten von Variablen. Skalare werden immer in kursiver Schrift notiert, wie zum Beispiel x, ci , I(si ), p1 etc. Kleine, fett gedruckte Buchstaben werden f¨ ur Vektoren verwendet, wie x = (x1 , x2 , . . . xN )T . Der Exponent T bedeutet ‘transponiert’, d.h. x ist ein Spaltenvektor. Bitte beachten, dass T nicht kursiv dargestellt ist, weil es keine Variable ist. Das Gleiche gilt f¨ ur Indices, die keine laufende Nummer wie zum Beispiel i in xi andeuten, sondern nur die Relation der Variable zu etwas anderem kennzeichnen wie bei σy2 . Hier ist y keine Z¨ahlvariable, sondern signalisiert, dass σ 2 die Varianz von y ist. Matrizen sind der dritte Typ von Variablen. Sie werden mit großen fett gedruckten Buchstaben bezeichnet wie H oder W zum Beispiel. Die Elemente von Matrizen sind Skalare, deshalb werden die Elemente von Matrix A mit aij notiert, wobei i = 1, . . . , N und j = 1, . . . , M die Indices f¨ ur Zeilen und Spalten sind.
5
Kapitel 2
Grundlagen der Datenkompression Dieses Kapitel f¨ uhrt den Leser in die verwendete Terminologie ein und behandelt die wichtigsten informationstheoretischen Grundlagen. Es werden die Ansatzpunkte zur Datenkompression herausgearbeitet und Kriterien f¨ ur die Bewertung von Kompressionsstrategien zusammengestellt. Damit bildet dieses Kapitel die Grundlage f¨ ur das Verst¨andnis der meisten nachfolgenden Kapitel.
2.1
Informationsgehalt und Entropie
Ein Zeichen, Symbol oder Ereignis sei mit si bezeichnet. Dann umfasst das Alphabet X = {si } mit i = 1, 2, . . . , K die Menge aller vorkommenden (unterschiedlichen) Symbole. Signale werden mit x[n] beschrieben, wobei die eckigen Klammern symbolisieren, dass das Signal zeitdiskret ist. x[n] ist gleichzeitig als endliche Folge von Symbolen aus X zu betrachten. Jedes Ereignis si besitzt eine Auftretenswahrscheinlichkeit pi = p(si ). In Abh¨ angigkeit von pi ermittelt man den Informationsgehalt des Symbols I(si ) mit I(si ) = log2
1 pi
[1 bit] .
(2.1)
Die Einheit des Informationsgehalts wird in 1 bit (analog zu 1 Volt) angegeben. Neben dieser informationstheoretischen Einheit ist auch der Gebrauch des Begriffs das Bit“ ” (Synthesewort aus binary digit, Mehrzahl: die Bit(s)) gebr¨auchlich, wenn ein Schalter mit zwei Zust¨ anden gemeint ist. Zum Beispiel besteht ein Byte aus 8 Bits. Bits sind z¨ ahlbar und im Gegensatz zur Einheit 1 bit nur ganzzahlig verwendbar.1 Gleichung (2.1) dr¨ uckt aus, dass der Informationsgehalt eines Ereignisses umso kleiner ist, je h¨ aufiger das Ereignis auftritt. Oder anders gesagt: je u ¨berraschender das Auftreten eines Symbols, desto gr¨ oßer die damit verbundene Information. Am Beispiel der Wettervorhersage soll das Verwenden des Informationsgehalts demonstriert werden. Man stelle sich vor, ein Meteorologe m¨ochte das aktuelle Wetter seiner Station t¨ aglich an seine Zentrale u uhen ¨ bermitteln. Wir befinden uns in einem sehr fr¨ Stadium der Wetterforschung und unterscheiden lediglich vier Zust¨ande: Sonne, Wolken, Regen und Schnee (Tab. 2.1 links). 1 Wenn eine mittlere Anzahl von Bits angegeben wird, wie zum Beispiel bei der Einheit ’Bits pro Symbol’, sind auch gebrochene Zahlen u ¨blich.
6
2 Grundlagen der Datenkompression si Sonne Wolken Regen Schnee
p(si ) 0.25 0.25 0.25 0.25 = 1.0
I(si ) [bit] 2 2 2 2
Code 00 01 10 11
si Sonne Wolken Regen Schnee
p(si ) 0.5 0.25 0.125 0.125 = 1.0
I(si ) [bit] 1 2 3 3
Code ? ? ? ?
Tabelle 2.1: Wetterinformation, links: gleichverteiltes Wetter, rechts: Ergebnis einer Langzeit-Observation Zun¨ achst sei angenommen, dass jeder der vier Wetterzust¨ande gleich h¨aufig eintritt, die Auftretenswahrscheinlichkeiten betragen pi = p = 0.25. Die Summe aller Wahrscheinlichkeiten ist immer gleich Eins. Daraus l¨asst sich nun ein Informationsgehalt von 2 bit pro Wetterzustand errechnen und, hier zeigt sich die enge Verwandtschaft von bit und Bit, jedes Ereignis kann durch ein zweistelliges bin¨ares Codewort repr¨asentiert und unterschieden werden. Beobachtungen u angeren Zeitraum ergeben allerdings eine andere Verteilung ¨ber einen l¨ des Wetters (Tab. 2.1 rechts). Rund 50 Prozent aller Tage scheint die Sonne, ein Viertel des Jahres ist es wolkig, den Rest teilen sich Regen und Schnee. Daraus ergibt sich ¨ f¨ ur die Ubermittlung jedes einzelnen Wetter-Ereignisses ein anderer Informationsgehalt. Hier stellt sich die Frage, welche Codew¨ orter den Symbolen Sonne bis Schnee zugewiesen werden m¨ ussen, um eine optimale Codierung zu erreichen. Die Antwort darauf wird im Kapitel 4 gegeben. An dieser Stelle l¨ asst sich aber bereits vermuten, dass der neue Code variable L¨ angen aufweist, w¨ ahrend die alten Codew¨orter eine feste L¨ange von 2 Bits haben. Als Codew¨ orter werden hier und in den folgenden Ausf¨ uhrungen Aneinanderreihungen von Nullen und Einsen (Bits) bezeichnet, die eine Einheit bilden. Jedes Codewort kann durch einen Codewert und eine Codewortl¨ange definiert werden. Die L¨ange gibt die Anzahl der zusammenh¨ angenden Bits an. Der Codewert ist derjenige Zahlenwert, der sich bei Interpretation des Codewortes als bin¨ are Zahl ergibt. Das Codewort 00011“ zum Beispiel ” hat eine Codewortl¨ ange von 5 Bits und einen Codewert von 3. Die Gesamtheit aller Codew¨ orter eines Alphabets wird als Code bezeichnet. In diesem Buch wird ausschließlich die Abbildung von Informationen auf bin¨are Codes betrachtet. Theoretisch k¨ onnte man an Stelle von 2 jede andere ganze Zahl gr¨oßer Eins als Basis b verwenden. Die Frage ist, wie viel bit erforderlich sind, um die Information einer n-stelligen Zahl eines b-wertigen Zahlensystems zu beschreiben. Die gr¨oßte, mit n Ziffern darstellbare Zahl jedes Zahlensystems betr¨agt bn − 1. L¨ost man die Gleichung bn − 1 = 2k − 1 nach der Anzahl der bin¨aren Stellen k auf, erh¨alt man k =n·
log(b) = n · log2 (b) . log(2)
Daraus ergibt sich zum Beispiel, dass eine Ziffer des Dezimalsystems (b = 10) einer Information von log2 (10) ≈ 3.32 bit entspricht. Codes mit b = 1 nennt man un¨ar. Abbildung 2.1 zeigt 3 Varianten zur un¨ aren Darstellung zweier Zahlen. Wichtig ist die Markierung
2.1 Informationsgehalt und Entropie
7
000000010001
oder
oder
111111101110
Abbildung 2.1: Varianten der un¨aren Codierung der Zahlen 7 und 3 des Endes jedes Codewortes. Im Strichcode dient dazu ein zus¨atzlicher Abstand, in der Zahlendarstellung ist ein alternatives, terminierendes Zeichen n¨otig. Dabei ist es unerheblich, ob man zum Beispiel Nullen, gefolgt von einer terminierenden Eins, oder Einsen mit einer terminierenden Null verwendet. In den meisten praktischen F¨ allen wird sich der Austausch von Nachrichten nicht auf einzelne Symbole beschr¨ anken. F¨ ur die Berechnung des mittleren Informationsgehalts einer Folge von statistisch unabh¨ angigen Symbolen verwendet man die Entropie H. Sie berechnet sich aus der Summe der gewichteten Einzelinformationen H=
K i=1
pi log2
K 1 =− pi log2 pi pi i=1
[bit/Symbol] .
(2.2)
Die Einheit ist 1 bit pro Symbol. Der Wertebereich der Entropie ist durch die Anzahl K verschiedener Symbole definiert 0 ≤ H ≤ log2 (K) .
(2.3)
Die Entropie hat ihren h¨ ochsten Wert, wenn alle Symbole gleich verteilt sind (pi = 1/K) Hmax =
K 1 log2 (K) = log2 (K) . K i=1
(2.4)
Dieser Wert entspricht auch dem so genannten Entscheidungsgehalt H0 einer Quelle, welcher aussagt, wie groß die Entropie bei Gleichverteilung w¨are. Je ungleichm¨ aßiger die Symbole verteilt sind, desto geringer ist der Informationsgehalt des Signals. Der Extremfall H = 0 ist erreicht, wenn nur ein einziges Symbol des Alphabets im Signal vorkommt 1.0 i = j H = 0.0 wenn pi = . (2.5) 0.0 i = j Betrachtet man die durch eine Signalquelle produzierten Symbole si , spricht man auch von einer Signal- oder Quellenentropie (engl.: source entropy) H(X) = H,
wenn si ∈ Quellalphabet .
H¨ aufig sind die Symbole des Quellalphabets in einem gewissen Maße voneinander abh¨ angig. Sie werden deshalb im Laufe des Codierungsprozesses auf Symbole eines anderen Alphabets abgebildet, das eine kleinere Entropie besitzt. Kapitel 5 widmet sich diesem Thema.
8
2 Grundlagen der Datenkompression
Abbildung 2.2: Physikalisches Experiment: Diffusion von Fl¨ ussigkeiten Der Entropiebegriff hat seinen Ursprung in der klassischen Physik (2. Hauptsatz der Thermodynamik). Ist ein thermodynamisches System (oder eine Nachrichtenquelle) klar organisiert und nur durch ein geringes Maß an Zuf¨alligkeit charakterisiert, dann ist die Entropie niedrig. Der Zustand gr¨ oßter Entropie bezeichnet den Zustand gr¨oßter Unordnung. Im informationstheoretischen Sinne bedeutet gr¨oßte Unordnung die Gleichverteilung. Zur Veranschaulichung soll ein physikalischer Versuchsaufbau beschrieben werden (Abb. 2.2). In einem Beh¨ alter befinden sich zwei unterschiedliche Fl¨ ussigkeiten, die durch eine Scheidewand voneinander getrennt sind. Informationstheoretisch haben wir es mit zwei Symbolen zu tun. Betrachten wir nun den Zustand in der linken H¨alfte des Beh¨alters. Die Auftretenswahrscheinlichkeit der Teilchen der dunklen Fl¨ ussigkeit s1 ist p1 = 1.0, w¨ahrend Teilchen der hellen Fl¨ ussigkeit s2 nicht auftreten (p2 = 0.0). Nach Gleichung (2.5) ist die Entropie des Systems H = 0.0 bit pro Symbol. Entfernt man nun die Trennwand, so streben die Teilchen beider Fl¨ ussigkeiten zu einem Zustand gr¨oßerer Entropie, sie vermischen sich. Wenn die Diffusion der Teilchen abgeschlossen ist, sind in der linken H¨alfte (und nat¨ urlich auch in der rechten) die hellen und dunklen Teilchen zu gleichen Anteilen vertreten. Es gilt p1 = p2 = 0.5, der Zustand gr¨oßter Entropie ist erreicht (Hmax = 1 bit pro Symbol). Wenn ein Alphabet nur zwei verschiedene Symbole enth¨alt, spricht man von einer bin¨aren Quelle. Die Wahrscheinlichkeiten k¨ onnen mit p2 = 1 − p1 angegeben werden. F¨ ur jedes Mischungsverh¨ altnis l¨ asst sich damit die Entropie nach Gleichung (2.2) berechnen H = − [p1 · log2 p1 ] − [(1 − p1 ) · log2 (1 − p1 )] .
(2.6)
In Abbildung 2.3 ist die Entropie eines bin¨aren Signals in Abh¨angigkeit von der Verteilung der Symbole aufgetragen. Anzumerken ist hierbei allerdings, dass die Entropieberechnung f¨ ur das physikalisches Experiment weitaus komplizierter ist, da das Verh¨altnis der Fl¨ ussigkeiten theoretisch in jedem Punkt des Beh¨alters anders sein kann, solange das Vermischen nicht vollst¨ andig abgeschlossen ist. ¨ Kommen wir nun noch einmal zur Ubermittlung von Wetterdaten zur¨ uck. Wie groß ist der mittlere Informationsgehalt der Nachrichten an die Zentrale bei ungleichm¨aßiger Verteilung des Wetters entsprechend Tabelle 2.1 rechts? Die Entropie betr¨agt nach Gleichung (2.2) H(X) = 0.5 · 1 bit + 0.25 · 2 bit + 0.125 · 3 bit + 0.125 · 3 bit = 1.75 bit/Symbol . (2.7) F¨ ur die Datenkompression bedeutet dies, es muss einen Weg geben, die vier Wetterlagen im Durchschnitt mit weniger als 2 Bits pro Nachricht zu unterscheiden.
2.1 Informationsgehalt und Entropie
9
1
H=f(p1)
0.8 0.6 0.4 0.2 0 0
0.2
0.4
0.6
0.8
1
p1
Abbildung 2.3: Entropie eines bin¨ aren Signals als Funktion der Symbolwahrscheinlichkeit p1 Wenn ein Signal Tr¨ ager von Information sein soll, darf es nicht vollst¨andig vorhersagbar sein. Ein System, das eine Folge von Ereignissen mit einer gewissen Wahrscheinlichkeit (also auch mit einer gewissen Unsicherheit) erzeugt, wird als stochastischer Prozess bezeichnet. Informationstheoretisch gesehen ist der mittlere Informationsgehalt einer Ereignisfolge dann am gr¨ oßten, wenn keine statistisch g¨ ultige Aussage getroffen werden kann, welches Ereignis als n¨ achstes folgt, also die Ereignisse v¨ollig zuf¨allig eintreten, und die Auftretenswahrscheinlichkeiten aller Ereignisse dieses Alphabets gleich groß sind. Solche Signale bezeichnet man als gleichverteiltes weißes Rauschen. Dies scheint nun im Widerspruch zum gesunden Menschenverstand zu stehen, da sich die Frage stellt, welche Informationen dem Rauschen zu entnehmen sind. Man muss dabei jedoch beachten, dass der Begriff Information“ in der Kommunikationstechnik an die Wahrscheinlichkeit ” gekoppelt ist, w¨ ahrend im allt¨ aglichen Gebrauch die Gr¨oße einer Information von der Interpretation der Nachricht, also vom Werturteil des Empf¨angers abh¨angt. Shannon und Weaver [Sha76] haben das so ausgedr¨ uckt: Information in der Kommunikationstheorie bezieht sich nicht so sehr auf das, was gesagt wird, sondern mehr auf das, was gesagt werden k¨onnte. Je ungewisser es ist, welches Ereignis eintreten wird, desto gr¨oßer ist die damit verbundene Information nach Bekanntwerden des Ereignisses. Man definiert deshalb: Information = beseitigte Ungewissheit/Unbestimmtheit“. Das Maß der Unbe” stimmtheit ist somit zugleich ein Maß f¨ ur die Information. Das Attribut zuf¨ allig“ wird im deutschen Sprachgebrauch f¨ ur verschiedene Dinge ver” wendet, die zum Beispiel im Englischen eigene Bezeichnungen haben. Als zuf¨allig bezeichnet man zum Beispiel das Zusammentreffen von zwei oder mehreren Ereignissen, die scheinbar nichts mit einander zu tun haben (coincidental), das unerwartete Eintreffen eines Ereignisses (by chance, by accident) oder die chaotische (ziellose, wahllose) Abfolge von Ereignissen (random). In der Informationstheorie spricht man von zuf¨alligen Ereignissen oder Symbolen, wenn auf einer bestimmen Abstraktionsebene (innerhalb eines gegebenen Kontexts) keine oder nur begrenzte Abh¨angigkeiten zwischen den Ereignissen erkennbar sind und deshalb keine exakte Voraussage u ¨ ber das Eintreffen eines bestimmten Symbols, sondern nur eine Aussage u ¨ber dessen Wahrscheinlichkeit m¨oglich ist. Verl¨asst man jedoch diese Abstraktionsebene und betrachtet die Ereignisse aus einem gr¨oßeren
10
2 Grundlagen der Datenkompression
Blickwinkel, werden unter Umst¨ anden Zusammenh¨ange sichtbar, die f¨ ur eine erfolgreiche Kompression ausgenutzt werden k¨ onnen. Unter Voraussetzung einer uneingeschr¨ankten Kausalit¨ at f¨ uhrt jede Ursache (oder die Kombination von allen m¨oglichen Ursachen) zu einer eindeutigen Wirkung und bei gen¨ ugend großem Blickwinkel sind alle Prozesse und Ereignisse rein deterministischer Natur. In den meisten Situationen unseres Lebens sind jedoch nicht alle m¨ oglichen Ursachen bzw. deren eindeutige Wirkung bekannt. Selbst wenn alle Zusammenh¨ ange genau determiniert w¨aren, ist es uns doch nicht m¨oglich, die Anfangsbedingungen vollst¨ andig und mit beliebig hoher Genauigkeit zu bestimmen. F¨ ur die Informationstheorie ist deshalb der Zufall in Verbindung mit der Wahrscheinlichkeit von Ereignissen eine hilfreiche Rechengr¨oße.
2.2
Kriterien zur Kompressionsbewertung
Der letzte Abschnitt dieses Kapitels befasst sich mit der Beurteilung von Kompressionsalgorithmen. Ziel der Bewertung ist der Vergleich zwischen verschiedenen Verarbeitungsstrategien.
2.2.1
Kompressionsverh¨ altnis
Das Kompressionsverh¨ altnis ergibt sich aus der Relation der Datenmenge des urspr¨ unglichen Signals zur Datenmenge des codierten Signals CR =
Datenmenge(Originalsignal) . Datenmenge(codiertes Signal)
(2.8)
Oft wird die Kompressionsleistung mit Hilfe der Bitrate angegeben. Die Bitrate entspricht der Datenmenge NB (in Bits) des codierten Signals bezogen auf die Anzahl NA der Symbole NB R= [Bits/Symbol] . (2.9) NA F¨ ur Bilddaten wird die Bitrate meist in bit pro Bildpunkt (engl.: bit per pixel [bpp]) angegeben. Bei der Kompression von Bildsequenzen ist auch die Angabe einer Datenrate in bit pro Sekunde (engl.: bit per second [bps]) u ¨blich.
2.2.2
Signalqualit¨ at
Das Bewerten der Signalqualit¨ at ist f¨ ur die Einsch¨atzung von verlustbehafteten Kompressionsverfahren von Interesse. Grunds¨ atzlich wird zwischen objektiver und subjektiver Beurteilung der Qualit¨ at unterschieden. Objektiv bedeutet, dass ein Computerprogramm das Original mit dem ver¨anderten, auf der Empf¨ angerseite rekonstruierten Bild vergleicht und die Unterschiede der Helligkeitsund Farbwerte in einer Zahl zusammenfasst. Subjektive Qualit¨atsbewertung setzt im Gegensatz dazu mehrere Testpersonen voraus, die ihr Urteil zur Qualit¨at abgeben.
2.2 Kriterien zur Kompressionsbewertung 2.2.2.1
11
Objektive Bewertung
F¨ ur die objektive Beurteilung werden Verzerrungsmaße und darauf aufbauend Qualit¨ atsmaße definiert. Erstere werten die Differenzen zwischen korrespondierenden Signalwerten aus und liefern als Ergebnis eine Zahl, die mit den Signalunterschieden steigt. Verzerrungsmaße dienen vorwiegend der adaptiven Optimierung von Kompressionsstrategien und seltener dem Vergleich der Verfahren. x[n] sei das Originalsignal mit N Abtastwerten und x [n] das rekonstruierte Signal. Ein Maß f¨ ur die Ver¨anderung oder Verzerrung (engl.: distortion) kann als Funktion dieser beiden Symbolfolgen angegeben werden D = f (x[n], x [n]) . Qualit¨ atsmaße beziehen Kenngr¨ oßen des Originalsignals in geeigneter Weise auf die Verzerrung und liefern eine Zahl, die mit kleiner werdender Verzerrung zunimmt. Zur besseren Unterscheidung zwischen der Folge x[n] = (x1 x2 . . . xi . . . xN ) und ihren Elementen werden die einzelnen Symbole im Folgenden mit xi bezeichnet. Verzerrungsmaße • Mittlerer quadratischer Fehler (engl.: mean square error) MSE =
N 1 (xi − xi )2 · N i=1
(2.10)
Große Differenzen zwischen den Signalwerten werden durch das Quadrieren st¨arker gewichtet als kleinere Differenzen. • Mittlerer absoluter Fehler (engl.: mean absolute difference) MAD =
N 1 · |xi − xi | N i=1
(2.11)
Dieses Maß verzichtet auf das Quadrieren und wird eingesetzt, wenn es auf eine schnellere Berechnung ankommt. • Summe der absoluten Fehler (engl.: sum of absolute difference/distortions) SAD =
N
|xi − xi |
(2.12)
i=1
Der SAD-Wert unterscheidet sich vom MAD lediglich durch die fehlende Division durch N . F¨ ur ausschließlich vergleichende Zwecke ist diese Normierung nicht erforderlich und die Berechnung wird dadurch beschleunigt. Qualit¨ atsmaße • Signal-Rausch-Verh¨ altnis (engl.: signal-to-noise ratio) Das Signal-Rausch-Verh¨ altnis ist ein Qualit¨atsmaß und hat im Gegensatz zu den
12
2 Grundlagen der Datenkompression 5 4 3 2 1
hervorragend (excellent) gut (good) zufrieden stellend (fair) gering (poor) schlecht (bad)
kein Unterschied zum Original erkennbar leichte, nicht st¨orende Verzerrungen leicht st¨orende Verzerrungen st¨ orende Verzerrungen unangenehme, stark st¨orende Verzerrungen
Tabelle 2.2: MOS-Skala vorangegangenen Verzerrungsmaßen einen steigenden Wert mit steigender Qualit¨at des rekonstruierten Signals. Es wird in Dezibel angegeben 2 σx SNR = 10 · log10 [dB] . (2.13) σe2 σx2 ist die Varianz des Originalsignals und berechnet sich nach σx2 =
N 1 · (xi − x)2 N i=1
mit
x=
N 1 · xi . N i=1
(2.14)
σe2 ist entsprechend die Varianz des Rekonstruktionsfehlers ei = xi − xi . Falls der Rekonstruktionsfehler mittelwertfrei ist, sind Fehlervarianz und MSE identisch σe2 =
N N 1 1 · · (ei − 0)2 = (xi − xi )2 N i=1 N i=1
mit ei = 0
(2.15)
(vgl. Gleichung 2.10). • Spitzen-Signal-Rausch-Verh¨ altnis (engl.: peak-signal-to-noise ratio) Dieses Qualit¨ atsmaß ist eine modifizierte Version des SNR und f¨ ur die Bewertung von Bildern u ¨ blich. Statt der Signalvarianz wird der Spitzenwert xpp zum Quadrat (=2552 bei 256 Amplitudenstufen) eingesetzt und f¨ ur den Rekonstruktionsfehler wird Mittelwertfreiheit angenommen x2pp [dB] . (2.16) PSNR = 10 · log10 MSE 2.2.2.2
Subjektive Bewertung
Eine subjektive Bewertung der Qualit¨ at von rekonstruierten Signalen ist mittels Testpersonen m¨ oglich, die in mehreren Testserien ihr Urteil ¨außern. Die Ergebnisse der Benotung werden gemittelt und anhand des resultierenden Wertes kann eine Einsch¨atzung erfolgen. F¨ ur die Benotung von Bildern wird in der Regel eine MOS-Skala (engl.: mean opinion score) verwendet [Jay84] (siehe Tab. 2.2). Qualit¨atstests f¨ ur Videos lassen keinen direkten Vergleich zwischen Original und Rekonstruktion zu. Eine m¨ogliche Testanordnung besteht darin, dass Testpersonen mit Hilfe eines Schiebereglers w¨ahrend des laufenden Videos ihrem subjektiven Empfinden Ausdruck verleihen.
2.2 Kriterien zur Kompressionsbewertung
13
In den meisten F¨ allen gibt es eine starke Korrelation zwischen dem subjektiven Urteil und einer Bildbewertung durch das PSNR. Verschiedene Kompressionsalgorithmen rufen allerdings auch sehr unterschiedliche Bildverzerrungen hervor (Unsch¨arfe, blockartige ¨ Strukturen, Uberschwinger an Helligkeitskanten, Verschmierungen der Farbe etc.), und ¨ das PSNR ist bei starken Anderungen der digitalen Bildinformation nicht mehr in der Lage, das subjektive Empfinden eines Beobachters in ausreichendem Maße nachzubilden. Da das menschliche Wahrnehmungssystem sehr komplex ist, hat sich bis heute noch kein objektives Verfahren durchgesetzt, das die subjektiven Tests ersetzen k¨onnte. Das erste Messverfahren f¨ ur die Bestimmung der Qualit¨at von Videos basierend auf dem menschlichen Sehsystems (HVS. . . Human Visual System) wurde von Lukas und Budrikis 1982 vorgeschlagen [Luk82]. Bisherige Qualit¨atsmetriken basieren entweder auf einem Wahrnehmungsmodell oder auf einer Extraktion von bestimmten Merkmalen (z.B. typische Verzerrungsstrukturen hervorgerufen durch das verwendete Kompressionsverfahren) [WuY01]. Eine Zusammenfassung von Modellen und Verfahren ist u.a. in [Win99] zu finden. Es gibt auch Bestrebungen, eine Methode zur Nachbildung der menschlichen Qualit¨ atsempfindung zu standardisieren (VQEG. . . Video Quality Experts Group, [VQE00, VQE03]). Prinzipiell sind die Bewertungsmethoden in zwei Gruppen zu unterteilen, je nachdem ob die Originaldaten zum Vergleich herangezogen werden oder nicht. Wenn ja, dann k¨ onnen alle durch die verlustbehaftete Kompression hervorgerufenen Verzerrungen genau quantifiziert werden. F¨ ur bestimmte Anwendungen ist es jedoch gar nicht erforderlich, die Bildinformation eins zu eins zu u ¨bermitteln. Der Betrachter auf der Empf¨angerseite kennt die originalen Bilder nicht. Entscheidend ist lediglich, dass er die ihm pr¨asentierten Bilder als realistisch empfindet. Dies ist allerdings sehr stark vom Vorwissen und angelernten Strukturen und Texturen abh¨ angig, auf die ein besonderes Augenmerk gelegt wird (z.B. Gesichter).
2.2.3
Rate-Distortion-Funktion
Die Verbindung von Kompressionsverh¨ altnis und Signalqualit¨at wird durch die so genannte Rate-Distortion-Theorie beschrieben [Jay84]. Sie besagt, dass eine untere Grenze der erforderlichen Bitrate Rx [bit/Symbol] bei einer vorgegebenen Verzerrung D des Signals x[n] existiert. In Abbildung 2.4 ist die Verzerrung auf die Signalvarianz normiert dargestellt. Kontinuierliche Signalamplituden k¨ onnen nicht verzerrungsfrei mit einer endlichen Bitrate dargestellt werden, da die Aufl¨ osung der Signalwerte unendlich ist. Im Unterschied dazu ist es m¨ oglich, f¨ ur wertdiskrete Signale eine endliche Bitrate bei einer Verzerrung von D = 0 anzugeben. Sie entspricht der Signalentropie (Rx (0) = Hx ), wenn die Symbole unabh¨ angig voneinander sind. Theoretisch kann jeder Punkt u ¨ber der Kurve durch einen entsprechenden Kompressionsalgorithmus erreicht werden. Je dichter das Kompressionsergebnis an der Kurve liegt, desto besser ist der Algorithmus. Die Rate-Distortion-Theorie legt somit eine Grenze f¨ ur die maximale Kompression fest. Praktisch ist das Ermitteln dieser Grenze mit Ausnahme von Spezialf¨ allen nicht durchf¨ uhrbar, weil die Berechnung im Allgemeinen sehr kompliziert ist und die statistischen Bindungen zwischen den zu codierenden Symbolen nicht vollst¨ andig bekannt sind. In praktischen Kompressionssystemen mit alternativen Codierungsvarianten und variablen Parametern ist es jedoch m¨oglich,
14
2 Grundlagen der Datenkompression kontinuierliche Amplitude R[bit/Symbol]
diskrete Amplitude R[bit/Symbol] Hx
0
1 D/σx2
0
1 D/σx2
Abbildung 2.4: Rate-Distortion-Funktion mit Hilfe der Lagrange-Multiplikatormethode die Kompression zu optimieren. Ziel ist das Minimieren der Bildverzerrungen D(s) bei einer vorgegebenen, konstanten Bitrate R(s) D(s) + λ · R(s) −→ Min Sowohl die Verzerrung als auch die Bitrate sind von einem Parameterset s abh¨angig. Problematisch ist die Wahl des Lagrange-Multiplikators λ. Sein Wert h¨angt selbst von den Codierungsparametern ab. F¨ ur die Videokompression, zum Beispiel, wurden praktikable Werte auf Basis umfangreicher Tests gefunden ([Sul98, Wie01, Wie03b]).
2.2.4
Merkmale eines Kompressionsalgorithmus
Bei der Entwicklung von praktikablen Kompressionsalgorithmen spielen neben der Kompressionsleistung weitere Parameter eine wichtige Rolle. Jede Verarbeitung von Signalen ben¨ otigt eine gewisse Zeit. Bei einigen Anwendungen, wie z.B. der bidirektionalen Echtzeit¨ ubertragung von Bild und Ton (Bildtelefonie, Videokonferenz) oder interaktiv beeinflussbaren Systemen (Fernsteuerung), kommt es auf sehr kurze Verz¨ogerungszeiten (engl.: delay) an. Gr¨ oßere Verz¨ ogerungen sind zum Beispiel akzeptabel bei Archivierungs¨ software und unidirektionaler Ubertragung (z.B. digitales Fernsehen). Auch bei der Videoaufzeichnung in digitalen Videokameras sind lange Verarbeitungszeiten kein Problem, vorausgesetzt, die Durchsatzrate der Bilddaten entspricht mindestens der Aufnahmerate. F¨ ur die hardware-nahe Umsetzung ist eine geringe Komplexit¨at des Kompressionsverfahrens (Anzahl der Rechenoperationen) entscheidend, um Kosten bei der Chip-Herstellung oder Speicherplatz in DSP-L¨ osungen zu sparen. Wichtig f¨ ur den Einsatz eines Kompressionsprogramms ist seine F¨ahigkeit zur Anpassung ¨ (Adaptation). Es sollte sich auf Anderungen der Signalstatistik einstellen k¨onnen und nahezu unabh¨ angig vom Signalinhalt hohe Kompressionsergebnisse erzielen. ¨ Als letzter Punkt in dieser Aufz¨ ahlung sei die Robustheit gegen¨ uber Ubertragungsfehlern genannt. Der hundertprozentige Schutz vor Fehlern kann durch die Kanalcodierung nicht in jedem Fall gew¨ ahrleistet werden, sodass ein Quellendecoder auch bei auftretenden ¨ Ubertragungsfehlern in der Lage sein sollte, alle korrekt empfangenen Daten zur Rekonstruktion des Signals auf der Empf¨ angerseite zu nutzen. Es l¨ asst sich an dieser Stelle bereits vermuten, dass es keinen Kompressionsalgorithmus gibt, der allen Anforderungen gleichzeitig gerecht werden kann. Um hohe Kompressions-
2.3 Redundanz und Irrelevanz
15
leistungen zu erreichen, ben¨ otigt man im Allgemeinen eine hohe Komplexit¨at des Codecs, eine gute Adaptation an das zu verarbeitende Signal erfordert zus¨atzliche Operationen und damit Zeit. Die Entwicklung von neuen Kompressionsstrategien setzt deshalb stets Kenntnisse u ¨ber die praktischen Anforderungen voraus.
2.3 2.3.1
Redundanz und Irrelevanz Redundanz
Redundanz (Weitschweifigkeit) ist derjenige Anteil am Datenaufkommen, der nicht f¨ ur die Repr¨ asentation der Information ben¨otigt wird. Man kann verschiedene Arten von Redundanzen unterscheiden; im Folgenden sind drei n¨aher benannt. 2.3.1.1
Redundanz einer Quelle
Die Redundanz einer Quelle ergibt sich aus dem Entscheidungsgehalt H0 der Quelle und der tats¨ achlichen Quellenentropie H(X) basierend auf der Ungleichverteilung der Symbole zu ΔR0 = H0 − H(X) bit/Symbol . Beispiel: Ein Signal bestehe aus f¨ unf verschiedenen Symbolen mit p0 = p1 = p2 = 0.2, p3 = 0.1 und p4 = 0.3. Die Entropie des Signals betr¨agt nach Gl. (2.2) somit rund H(X) ≈ 2.246. Der Entscheidungsgehalt ist H0 = log2 (5) ≈ 2.322 Bits pro Symbol. Die Redundanz der Quelle betr¨ agt demzufolge ΔR0 ≈ 2.322 − 2.246 = 0.076 bit/Symbol . 2.3.1.2
Codierungsredundanz
Im vorangegangenen Abschnitt hat es sich gezeigt, dass man bei der Wetter-Information einen unn¨ otigen Aufwand betreiben w¨ urde, wenn man 2 Bits pro Symbol einsetzt, da im Mittel 1.75 bit ausreichen. Diesen unn¨ otigen Aufwand zur Repr¨asentation einer Information bezeichnet man als Codierungsredundanz ΔR(X). Sie l¨asst sich durch Maßnahmen der Entropiecodierung (siehe Kapitel 4) verringern. Sei NA die Anzahl der Abtastwerte im Signal und NB die eingesetzte Datenmenge (Anzahl der Bits), dann l¨ asst sich der durchschnittliche Aufwand, d.h. die Bitrate R f¨ ur eine Speicherung in Bits pro Symbol berechnen R=
NB ≥ H(X) NA
[Bits/Abtastwert] .
Als Codierungsredundanz ΔR(X) wird die Differenz zwischen der durchschnittlichen Datenmenge pro Symbol und der Entropie des Signals H(X) bezeichnet ΔR(X) = R − H(X) .
16
2 Grundlagen der Datenkompression Beispiel: Ein Signal bestehe aus f¨ unf verschiedenen Symbolen mit p0 = p1 = p2 = 0.2, p3 = 0.1 und p4 = 0.3. Die Entropie des Signals ist nach Gl. (2.2) somit rund H(X) ≈ 2.246. Der Speicheraufwand betr¨ agt bei Verwenden von festen Codewortl¨angen mindestens R = log2 K = 3 Bits pro Symbol. Die Codierungsredundanz betr¨agt demzufolge ΔR(X) ≈ 3 − 2.246 = 0.754 bit/Symbol .
2.3.1.3
Intersymbolredundanz
In den bisherigen Betrachtungen wurde stets davon ausgegangen, dass die Symbole unabh¨ angig voneinander sind. In der Praxis existieren jedoch meistens statistische Bindungen zwischen den Ereignissen. Will man einen leistungsf¨ahigen Kompressionsalgorithmus entwickeln, so ist es unbedingt erforderlich, diese Korrelationen auszunutzen. Deshalb wird eine bedingte Entropie H(X|X) ≤ H(X) definiert (siehe Abschnitt 5.1), deren Wert von vorangegangenen Symbolen abh¨angt. Die Differenz zwischen der Signalentropie ohne Ber¨ ucksichtigung von Abh¨angigkeiten H(X) und der bedingten Entropie H(X|X) ist die Intersymbolredundanz ΔR(X|X) = H(X) − H(X|X) . Methoden zum Vermindern der Intersymbolredundanz sind im Kapitel 5 zu finden.
2.3.2
Irrelevanz
Die Irrelevanz umfasst alle Informationsbestandteile, die beim Empf¨anger der Nachricht nicht wahrgenommen werden k¨ onnen bzw. nicht von Interesse sind. Bei der Verarbeitung von Bildsignalen ist auch der Begriff psycho-visuelle Redundanz“ gebr¨auchlich. ” Beispiel: Ein farbiges Bild wird im Rot-Gr¨ un-Blau-Format (RGB) u ¨bertragen, d.h. jeder Bildpunkt wird durch drei Komponenten zu je 8 Bits repr¨asentiert. Der Aufwand betr¨agt 24 Bits pro Bildpunkt. Wenn das Bildsignal beim Empf¨anger auf einem Farbmonitor dargestellt wird, der lediglich 256 Farben anzeigen kann, bedeutet dies, 8 Bits pro ¨ Bildpunkt h¨ atten f¨ ur die Ubertragung gereicht. Zu beachten ist hierbei aber, dass die Definition der Irrelevanz immer von den Wahrnehmungseigenschaften des Empf¨ angers abh¨angig ist. Außerdem bedeutet das sendeseitige Entfernen von irrelevanten Bestandteilen einen Verlust an digitaler Information, die beim Empf¨ anger nicht mehr zur¨ uckgewonnen werden kann. Falls also nachtr¨aglich eine M¨ oglichkeit geschaffen wird, 2563 Farben darzustellen, n¨ utzt das wenig, wenn die Bilddaten eine Aufl¨ osung von nur 8 Bits pro Bildpunkt haben. Wenn das Beseitigen der irrelevanten Anteile geschickt durchgef¨ uhrt wird, kann sowohl f¨ ur Audio- als auch Videodaten eine deutlich st¨arkere Kompression im Vergleich zu verlustlosen Verfahren erreicht werden.
2.4 Testfragen
2.4
17
Testfragen
2.1 Was versteht man unter der Information I eines Symbols? Geben Sie die Formel an und erl¨ autern Sie kurz! 2.2 Nennen Sie 3 Merkmale, durch die ein (gutes) Kompressionssystem charakterisiert ist! 2.3 Wie leitet sich die Quellenentropie aus der Information der einzelnen Symbole ab? 2.4 Was ist der Unterschied zwischen Redundanz und Irrelevanz? 2.5 Was ist der Unterschied zwischen Codierungsredundanz und Intersymbolredundanz? 2.6 Was ist eine bin¨ are Quelle? 2.7 Es sind zwei Signalquellen gegeben. Quelle X produziert 3 verschiedene Symbole mit den Auftretenswahrscheinlichkeiten p1 = p2 = 0.2 und Quelle Y produziert 4 verschiedene Symbole mit den Auftretenswahrscheinlichkeiten p1 = p2 = 0.25, p3 = 0.3. Welche Quelle erzeugt den h¨ oheren Informationsgehalt pro Symbol? Begr¨ unden Sie kurz! 2.8 Eine Quelle produziert Zahlen von 1 bis 100 mit folgenden Gruppen-Wahrscheinlichkeiten: 1 bis 20: p(s1 ) = 1/6 21 bis 50: p(s2 ) = 1/3 51 bis 100: p(s3 ) = 1/2 Innerhalb der Gruppen sind die Zahlen gleich wahrscheinlich. a) Berechnen Sie die Entropie dieser Quelle! b) Wie groß ist der Entscheidungsgehalt dieser Quelle? 2.9 Bestimmen Sie den Informationsgehalt einer mit Text bedruckten Seite! F¨ ur die Berechnung sind anzunehmen: 84 verschiedene, unabh¨angige und gleich wahrscheinliche Zeichen, 60 Zeilen ´a 65 Zeichen. 2.10 F¨ uhren Sie folgendes Gedankenexperiment durch: Erzeugen Sie aus einem gegebenen Bild mit 8 Bits pro Bildpunkt zwei neue rekonstruierte“ Bilder. F¨ ur die eine ” Rekonstruktion addieren Sie den Wert +10 zu jedem Pixel in der oberen H¨alfte des Bildes und -10 in der unteren, das andere Bild wird erzeugt durch das zuf¨allige Addieren von entweder +10 oder -10. a) Wie groß sind die PSNR-Werte der rekonstruierten Bilder? b) Spiegeln die PSNR-Werte die subjektive Qualit¨at wider? Warum? 2.11 Was versteht man unter objektiver Bildqualit¨at? Wie wird sie bewertet (Formel)?
18
Kapitel 3
Datenreduktion Im Einf¨ uhrungskapitel wurde zwischen verlustloser und verlustbehafteter Kompression unterschieden. Kompressionsverfahren, die zur Steigerung der Codierungseffizienz irrelevante Bestandteile der Signalinformation entfernen, verringern die Datenmenge mit Methoden der Datenreduktion. Dieses Kapitel besch¨aftigt sich mit den zwei grundlegenden Reduktionsverfahren (Abb. 3.1). Zun¨achst wird die Abtastratenumsetzung beschrieben. Anschließend werden skalare Quantisierung und Vektorquantisierung behandelt. Datenreduktion
Unterabtastung
Quantisierung
- Verringerung der zeitlichen bzw. örtlichen Auflösung
Vektorquantisierung - Abbilden von ähnlichen Vektoren auf einen gemeinsamen repräsentativen Vektor
- Verringerung der Auflösung der Signalwerte
skalare Quantisierung - Abbilden von ähnlichen Werten auf einen gemeinsamen repräsentativen Wert
Abbildung 3.1: Unterteilung der Verfahren zur Datenreduktion
3.1 3.1.1
Modifikation der Abtastrate Unterabtastung
Die einfachste Form der Datenreduktion erfolgt durch Herabsetzen der Datenrate (engl.: sub-sampling oder down-sampling). Ausgehend von einem vorliegenden Signal x[n] wird nur jeder M -te Signalwert in ein neues Signal y[m] = x[m · M ]
(3.1)
kopiert. Die Information der dazwischen liegenden Werte geht verloren. In Abbildung 3.2 ist der Vorgang symbolisch und f¨ ur ein Signalbeispiel mit M = 3 dargestellt.
3.1 Modifikation der Abtastrate
19
x[n ]
y [m]
M
x[n ]
0
y [m]
3
6
9
12 n
0
1
2
3
4 m
Abbildung 3.2: Unterabtastung mit M = 3
|X(jω)|
0
fs(x) /2 M
(x)
fs /2
(x)
f
fs(x) M
f
fs
|Y (jω)|
0
(y)
fs
=
fs(x) M
2
fs(x) M
3
Abbildung 3.3: Betragsspektren vor und nach einer Unterabtastung mit M = 3
Durch die Ver¨ anderung der Abtastrate wird das Spektrum des Signals beeinflusst. Abbildung 3.3 zeigt die Betragsspektren |X(jω)| •−−−◦ x[n] vor und |Y (jω)| •−−−◦ y[m] nach der Unterabtastung mit M = 3. Da wir zeitdiskrete Signale betrachten, ist das Betrags(x) spektrum |X(jω)| periodisch mit der Abtastfrequenz fs . Durch die Unterabtastung verringert sich die Abtastfrequenz um den Faktor 1/M auf
fs(y) =
(x)
fs . M
¨ Das periodische Spektrum schiebt sich quasi zusammen. Um eine Uberlappung (Aliasing) des Spektrums zu verhindern, muss vor der Unterabtastung eine geeignete Filterung s /2 die Bandbreite des Signals auf eine obere Grenzfrequenz von fg = fM begrenzen. Die Kombination von Antialiasing-Filterung und Unterabtastung nennt man Dezimation.
20
3 Datenreduktion
y [m]
x’ [n]
L
y [m]
0
x’ [n]
1
2
4 m
3
0
3
6
9
12 n
¨ Abbildung 3.4: Uberabtastung mit L = 3 |Y (jω)|
(y)
|X (jω)| L
0
(y)
fs
0
(x)
2fs Image
fs /L
(y)
Lfs Image
(x)
f Image
(x)
2fs /L 3fs /L
f
¨ Abbildung 3.5: Betragsspektren vor und nach einer Uberabtastung mit L = 3
3.1.2
¨ Uberabtastung
Die Erh¨ ohung der Abtastrate (engl.: up-sampling) um einen Faktor L ≥ 2 wird durch das Einf¨ ugen von L − 1 Nullen zwischen den bisherigen Abtastwerten realisiert y[n/L] f¨ ur n = m · L, m ∈ Z . (3.2) x [n] = 0 sonst ¨ Abbildung 3.4 zeigt das Symbol f¨ ur die Uberabtastung und ein Signalbeispiel mit L = 3. F¨ ur eine sinnvolle Weiterverarbeitung des Signals x [n] w¨are es w¨ unschenswert, die L¨ ucken im Signal mit geeigneten Werten aufzuf¨ ullen. Betrachten wir dazu noch einmal das Signal im Frequenzbereich (Abb. 3.5). Durch Erh¨ohen der Abtastrate ver¨andert sich das Spektrum in keiner Weise, lediglich die Abtastfrequenz verschiebt sich um den Faktor L. Im Vergleich zum originalen Spektrum sind zus¨atzliche Abbilder (engl.: image) hinzugekommen. Dieser Effekt wird als Imaging bezeichnet. Die Rekonstruktion des Originalsignals ist durch ideale Tiefpassfilterung (siehe Abb. 3.5, gestrichelte Boxen) im Frequenzbereich oder durch Faltung mit einer geeigneten Impulsantwort (Antiimaging¨ Filter) im Zeitbereich m¨ oglich. Die Kombination von Uberabtastung und AntiimagingFilterung nennt man Interpolation. Dieser Begriff dr¨ uckt bereits aus, dass die fehlenden Abtastwerte durch interpolative Verfahren rekonstruiert werden k¨onnen. Damit die
3.2 Quantisierung
21
St¨ utzwerte der Zeitfunktion y[m] bei der Interpolation unver¨andert bleiben, muss das Antiimaging-Filter einen Verst¨ arkungsfaktor von L aufweisen. In dem betrachteten Beispiel in den Abbildungen 3.3 und 3.5 scheint das originale Spektrum nach idealer Tiefpassfilterung zur¨ uckgewonnen und kein Verlust an Information aufgetreten zu sein. Zur besseren Veranschaulichung wurde allerdings ein Signal mit hinreichend kleiner Bandbreite gew¨ ahlt, sodass sich die periodischen Komponenten des Spektrums X(jω) nach der Unterabtastung nicht u ¨berlappten. Die meiste Signalinformation geht bei der Bandbegrenzung durch die Antialiasing-Filterung verloren. Hochfrequente Signalanteile werden unterdr¨ uckt. Weitere Signalverzerrungen erfolgen durch das nicht vollst¨ andig auszuschließende Aliasing und die Antiimaging-Filterung, wenn kein idealer Tiefpass verwendet wird.
3.2 3.2.1
Quantisierung Skalare Quantisierung
Die skalare Quantisierung (engl.: scalar quantisation) weist einzelnen Signalwerten x einen quantisierten Wert [x]Q zu. F¨ ur die Datenkompression ist es wichtig, den Quantisierungsvorgang in zwei Schritte zu zerlegen. Sendeseitig wird der Wertebereich des Signals in Teilintervalle unterteilt und jeder Signalwert auf die entsprechende Intervallnummer q ∈ Z abgebildet Quantisierung:
x→ q.
Aus einer zumeist reellwertigen Amplitude x wird ein ganzzahliger Wert q, wodurch sich die weitere Verarbeitung der Signalinformation vereinfacht. Diese Intervallnummer q wird in den nachfolgenden Kapiteln auch als Quantisierungssymbol bezeichnet. Da allen Amplituden, die sich im selben Intervall befinden, die gleiche Nummer zugeordnet wird, verlieren sie ihre Individualit¨ at. Es tritt ein Informationsverlust auf. Auf der Seite des Decoders wird jeder empfangenen Intervallnummer ein repr¨asentativer Rekonstruktionswert yq zugewiesen Rekonstruktion: q → yq ,
mit [x]Q = yq ,
wobei yq ebenfalls ein Wert aus dem Intervall q ist. Der Quantisierungsfehler betr¨agt eq = x − [x]Q . In Abh¨ angigkeit von der Breite und Lage der Quantisierungsintervalle werden verschiedene Quantisierer-Typen definiert. 3.2.1.1
Gleichm¨ aßige Quantisierung
Das entscheidende Merkmal f¨ ur die gleichm¨aßige Quantisierung (engl.: uniform quantization) sind Intervalle mit gleicher Breite Δ. Man unterscheidet hierbei zwei Untertypen.
22
3 Datenreduktion
q
q Δ x
x
yq eq
yq eq
Δ 2
x
Δ 2
x b)
a)
Abbildung 3.6: Kennlinien der gleichm¨ aßigen Quantisierung und deren Quantisierungsfehler; a) Midtread-Quantisierer; b) Midrise-Quantisierer Geh¨ ort yq = 0 zur Menge der Rekonstruktionswerte, handelt es sich um einen midtread(Stufe in der Mitte)-Quantisierer (Abb. 3.6 a). Die Intervallnummern und Rekonstruktionswerte berechnen sich nach folgender Vorschrift |x| 1 q= + · sgn(x) [x]Q = yq = q · Δ . (3.3) Δ 2 Geh¨ ort yq = 0 nicht zur Menge der Rekonstruktionswerte, spricht man von einem midrise(Anstieg in der Mitte)-Quantisierer (Abb. 3.6 b) |x| 1 + 1 · sgn(x) [x]Q = yq = Δ · q − . (3.4) q= Δ 2 Der Midrise-Quantisierer hat allerdings kaum praktische Relevanz, da ein energieloses Eingangssignal x[n] ≡ 0 zu einer Signalausgabe von |[x[n]]Q | = 1 f¨ uhren w¨ urde. Die Quantisierungsfehler haben in beiden F¨ allen einen begrenzten Wertebereich −
Δ Δ ≤ eq ≤ . 2 2
(3.5)
Die Quantisierungsfehlerleistung Pq entspricht der Fehlervarianz, wenn eq = 0 gilt Pq =
σq2
∞ =
e2q · p(eq ) deq .
(3.6)
−∞
Ist die Intervallbreite Δ hinreichend schmal, kann man davon ausgehen, dass die Quantisierungsfehler im angegebenen Wertebereich gleichverteilt sind 1 |eq | ≤ Δ Δ 2 p(eq ) = . (3.7) 0 sonst
3.2 Quantisierung
23
h ( x)
a)
h ( x)
xq yq xq+1 x
b)
xq yq xq+1 x
Abbildung 3.7: Wahl des Rekonstruktionswertes yq in Abh¨angigkeit der H¨aufigkeitsverteilung h(x) der Signalwerte x Ist die Leistung in allen Intervallen gleich groß, erh¨alt man Δ/2 Δ/2 1 1 e3q 1 2 2 σq = eq · = deq = · Δ2 . Δ Δ 3 12
(3.8)
−Δ/2
−Δ/2
Hierbei ist weiterhin anzumerken, dass als Rekonstruktionsamplitude der mittlere Wert aus dem jeweiligen Intervall gew¨ ahlt wurde (Gleichungen (3.3) und (3.4)). Dies ist nicht selbstverst¨ andlich. Lediglich wenn man von einer Gleichverteilung der Signalwerte innerhalb eines Intervalls ausgehen kann, ist die Wahl des mittleren Wertes optimal bez¨ uglich des Quantisierungsfehlers (Abb. 3.7 a). Ansonsten muss man zur Minimierung der Quantisierungsfehlerleistung die Verteilung der Signalwerte h(x) ber¨ ucksichtigen (Abb. 3.7 b). Die Rekonstruktionswerte sind dann in Abh¨angigkeit der Grenzen xq und xq+1 des Intervalls [xq , xq+1 ) und der Verteilung der Signalamplituden p(x) ≈ h(x) zu bestimmen mit xq+1 x · p(x) dx xq yq = xq+1 . (3.9) p(x) dx xq
Der so f¨ ur jedes Intervall berechnete Rekonstruktionswert zerteilt die Fl¨ache unter der Verteilungsfunktion h(x) in zwei gleich große St¨ ucke. Typischer Weise ist dem Empf¨ anger der Quantisierungssymbole q die Verteilung h(x) der Signalwerte x nicht bekannt. Der Sender k¨onnte die Verteilung modellieren und die Modellparameter zus¨ atzlich u ¨ bertragen. Um diesen Aufwand an Seiteninformation zu vermeiden, ist es aber auch m¨ oglich, die Verteilung h(x) aus der diskreten Verteilung der Quantisierungssymbole h[q] zu sch¨ atzen [Mar00]. Dies erfordert allerdings zus¨atzlichen Rechenaufwand beim Empf¨ anger. Als Erg¨ anzung seien noch zwei Spezialformen der gleichm¨aßigen Quantisierung genannt (Abb. 3.8). F¨ ur einige Anwendungen ist es sinnvoll, das mittlere Intervall aufzuweiten, zum Beispiel wenn kleine Signalamplituden irrelevant sind. Diese Variante heißt Quantisierer mit Totzone (engl.: deadzone). Die Breite der Totzone ist im Vergleich zu den anderen Intervallen h¨ aufig doppelt so groß. Die Berechnungsvorschriften lauten dann |x| q = · sgn(x) (3.10) Δ 0 wenn q = 0 . (3.11) [x]Q = yq = (|q| + 0.5) · Δ · sgn(q) sonst
24
3 Datenreduktion
q
q
x
Begrenzung
x
Totzone
eq
eq x a)
x b)
Abbildung 3.8: Gleichm¨ aßige Quantisierung mit a) Totzone; b) Amplitudenbegrenzung Des weiteren erwarten nachfolgende Verarbeitungsstufen im Allgemeinen eine endliche Anzahl von zu unterscheidenden Quantisierungsintervallen. Wenn das Signal keinen hinreichend kleinen Dynamikbereich aufweist, muss der Quantisierer die Signalamplituden begrenzen. 3.2.1.2
Sukzessive Approximation
Die sukzessive Approximation ist eine Form der gleichm¨aßigen Quantisierung mit Tot¨ zone, die eine progressive Ubertragung der Signalinformation erm¨oglicht [Sha93]. Sie wird deshalb in modernen Kompressionsalgorithmen h¨aufig eingesetzt. Der Grundge¨ danke der progressiven Ubertragung besteht darin, dass man zuerst eine grobe Signalinformation sendet, die dann schrittweise verfeinert wird. Jedes zus¨atzlich gesendete Bit verbessert die Qualit¨ at des rekonstruierten Bildes auf der Empf¨angerseite. Nach ¨ der vollst¨ andigen Ubermittlung aller Daten entsprechen die rekonstruierten Amplituden einer normalen gleichm¨ aßigen Quantisierung. Die Quantisierung ist dabei kein eigenst¨andiger Funktionsblock mehr, sondern im Allgemeinen mit der nachfolgenden Verarbeitung verschachtelt. Abbildung 3.9 soll die Vorgehensweise verdeutlichen. Voraussetzung f¨ ur die schrittweise Approximation ist die Kenntnis u ¨ber die maximale Betragsamplitude xmax = | maxn (x[n])|. Zur Vereinfachung wird im Folgenden nur der nicht-negative Wertebereich betrachtet. Die Quantisierung erfolgt analog f¨ ur negative Werte. Auf der Basis von xmax wird eine Schwelle T1 = xmax /2 festgelegt, die den Wertebereich in 2 Quantisierungsintervalle unterteilt. Als Rekonstruktionswerte werden y0 = 0 und ucksichtigung des negaT1 < y1 < xmax (typisch: y1 = 0.75 · xmax ) gew¨ahlt. Unter Ber¨ tiven Zahlenbereiches ist das zentrale Quantisierungsintervall (−T1 , T1 ) doppelt so groß wie alle anderen. Der Algorithmus trifft im ersten Quantisierungsschritt eine bin¨are Entscheidung, ob der Signalbetragswert kleiner als die Schwelle T1 ist oder nicht. Die Werte erhalten damit die Attribute insignifikant“ bzw. signifikant“. Ein geeigneter Kompres” ” sionsalgorithmus kann diese bin¨ are Information bereits weiterverarbeiten. In den nachfolgenden Schritten werden die n¨ achsten Schwellen Tn = Tn−1 /2 berechnet. F¨ ur alle insignifikanten Werte des vorangegangenen Schrittes erfolgt ein Vergleich mit der neu-
3.2 Quantisierung
25
y0
y1 T1
0 y0
y1
y0
y1
y2
y3
y4
T3
x
xmax
x
y3
T2
0
0
y2
xmax
y5
y6
y7 xmax
x
Abbildung 3.9: Gleichm¨ aßige Quantisierung durch schrittweise Approximation von Signalwerten en Schwelle Tn . Alle anderen Signalwerte, die bereits einmal eine Schwelle u ¨ berschritten hatten, werden durch Halbierung der Intervalle verfeinert. Auch hier sind nur bin¨are Entscheidungen zu treffen. Auf der Empf¨ angerseite werden aus den bin¨aren Informationen die Intervallnummern ermittelt und die zugeh¨ origen Rekonstruktionswerte yq festgelegt und schrittweise verfeinert. Die maximale Amplitude xmax muss deshalb ebenfalls u ¨bertragen werden. 3.2.1.3
Ungleichm¨ aßige Quantisierung
Ungleichm¨ aßige Quantisierer sind durch unterschiedliche Intervallbreiten gekennzeichnet. Die Gestaltung der Quantisierungskennlinie ist abh¨angig von der Zielstellung. WDV-optimiert Ziel der Anpassung der Intervallbreiten an die Wahrscheinlichkeitsdichte-Verteilung (engl.: pdf . . . probability density function) ist eine minimale Quantisierungsfehlerleistung. F¨ ur Teilbereiche mit hoher Wahrscheinlichkeitsdichte werden schmale Intervalle gew¨ ahlt und umgekehrt. Dadurch werden h¨aufige Signalwerte feiner quantisiert als seltene. Die Rekonstruktionswerte werden f¨ ur jedes gegebene Intervall [xq , xq+1 ) mit Gleichung (3.9) optimal berechnet. yq liegt dadurch im Schwerpunkt seines Intervalls. Die Intervallgrenzen m¨ ussen wiederum genau zwischen zwei Rekonstruktionswerten liegen yq−1 + yq xq = . (3.12) 2 Alle yq und xq k¨ onnen durch die iterative L¨osen der Gleichungen (3.9) und (3.12) optimiert werden. Derart entworfene Quantisierer nennt man Max-Lloyd-Quantisierer (nach [Max60] und [Llo82]). Wahrnehmungsoptimiert Motivation f¨ ur eine wahrnehmungsoptimierte (engl.: perceptual-optimised) Quantisierung ist die Tatsache, dass die Quantisierungsfehlervarianz selten genau die wahrgenommenen Signalverzerrungen widerspiegelt. Ein Beispiel hierf¨ ur ist die Quantisierung von Musik. Laute T¨one k¨onnen im Allgemeinen st¨arker quantisiert werden als leise, weil der Quantisierungsfehler bezogen auf die Signalamplituden
26
3 Datenreduktion
x
c () x’
gleichm. Q
q
gleichm. R
[x’] Q c−1() [ x] Q
Abbildung 3.10: Ungleichm¨ aßige Quantisierung mit Hilfe einer Kompanderfunktion dann geringer ist und weniger wahrgenommen wird. Auch in der Bildkompression sind ahnliche Effekte zu beachten. Meistens werden die Quantisierungsintervalle basierend auf ¨ Erfahrungen und Tests festgelegt, da die mathematische Beschreibung der menschlichen Wahrnehmung von Bild und Ton sehr komplex ist. SNR-optimiert Sehr h¨ aufig ist das Signal-Rausch-Verh¨altnis nach der Quantisierung stark abh¨ angig von der Varianz des Originalsignals. Mit Hilfe von SNR-optimierten Quantisierern kann diese Abh¨ angigkeit vermindert und ein maximales SNR unabh¨angig von der Signalvarianz gew¨ ahrleistet werden. M¨ oglich ist dies durch logarithmische Quantisierung [Loc97]. Zur Vereinfachung wird die ungleichm¨aßige Quantisierung in eine Signaltransformation und eine gleichm¨ aßige Quantisierung zerlegt (Abb. 3.10). Zun¨achst wird das Signal mit Hilfe einer invertierbaren Funktion transformiert x = c(x) . Die Funktion c(x) wird als Kompressor-Kennlinie bezeichnet, da große Signalwerte st¨arker ged¨ ampft werden als kleine. Anschließend folgt eine gleichm¨aßige Quantisierung von x . Auf der Empf¨ angerseite werden die Signalwerte zu [x ]Q rekonstruiert und mit einer Expander-Kennlinie zur¨ uck transformiert [x]Q = c−1 ([x ]Q ) . Die Verbindung von Kompressor und Expander nennt man Kompander. ¨ Eine umfassende Ubersicht u ¨ber die Geschichte der Quantisierung und ihrer verschiedenen Varianten ist in [Gra98] zu finden.
3.2.2
Vektorquantisierung
Im Gegensatz zur skalaren Quantisierung werden bei der Vektorquantisierung nicht nur einzelne Signalwerte betrachtet, sondern zwei oder mehrere Amplituden in einem Signalvektor x vereint und gemeinsam verarbeitet [Gra84]. In Analogie zur skalaren Quantisierung wird der zwei- oder mehrdimensionale Vektorraum in Unterr¨aume (mehrdimensionale Intervalle) unterteilt. Diese Unterr¨aume nennt man auch Zellen. Jeder Signalvektor kann durch die Nummer q seines Unterraumes identifiziert werden und ihm wird ein entsprechender Rekonstruktionsvektor y q zugeordnet. Getrennt nach senderund empf¨ angerseitiger Verarbeitung gibt es die zwei Schritte Quantisierung:
x→ q
und Rekonstruktion: q → y q ,
mit [x]Q = y q .
3.2 Quantisierung
27
x2
x2
x1
x1
Abbildung 3.11: Zweidimensionale Unterr¨aume bei der Vektorquantisierung Im einfachsten Fall werden jeweils zwei Werte zu einem zweidimensionalen Vektor zusammengefasst x1 x= . x2 Beispiele f¨ ur die Aufteilung zweidimensionaler Unterr¨aume sind in Abbildung 3.11 angegeben. Jeder Zelle ist ein Referenz- oder Rekonstruktionsvektor (Position von ×) zugeordnet. Die gleichm¨ aßige Aufteilung in der Darstellung links ergibt sich aus der Konstruktion von zwei gleichm¨ aßigen, skalaren Quantisierern. Man w¨ urde mit der separaten Quantisierung die gleichen Resultate erzielen. Anders sieht es f¨ ur die Signalraumunterteilung in der rechten Abbildung aus. Die Aufteilung der Zellen ist hier an die Verteilung der Vektoren angepasst und l¨ asst sich nicht in skalare Quantisierer separieren. Zum Ermitteln der Zellennummern verwendet man so genannte Codeb¨ ucher (engl.: code books). Sie enthalten f¨ ur jede Zelle Cq einen Referenzvektor (¨ ublicherweise der Rekonstruktionsvektor y q ), mit dem der Signalvektor verglichen wird. Mit Hilfe eines Abstandsmaßes d(x, y q ) wird der dichteste Referenzvektor gesucht und die entsprechende Unterraumnummer ermittelt und u ¨bertragen. Der Empf¨anger hat ein identisches Codebuch und kann mit Hilfe von q den richtigen Rekonstruktionsvektor y q zuweisen. W¨ ahrend die Unterteilung der Quantisierungsintervalle bei der skalaren Quantisierung noch relativ u ¨bersichtlich ist, gestaltet sich die Zellenaufteilung bei einer mehrdimensionalen Quantisierung etwas schwieriger. Deshalb wird das Codebuch in einer Trainingsphase mit typischen Trainingsvektoren v n (n = 1, 2, . . . , N ) stimuliert und die Rekonstruktionsvektoren Schritt f¨ ur Schritt optimiert. Mit Hilfe eines iterativen Cluster-Algorithmus, bekannt als LGB-Algorithmus (nach [Lin80]), k¨onnen die Codebuchvektoren so berechnet werden, dass sich die Aufteilung der Teilr¨aume an die Verteilungsdichte der Trainingsvektoren anpasst. Der Ablauf ist wie folgt: 1. Das Codebuch wird mit beliebigen Rekonstruktionsvektoren y q (q = 0, 1, . . . , M−1) initialisiert und ein Startwert f¨ ur den mittleren Quantisierungsfehler D(l = 0) fest-
28
3 Datenreduktion gelegt. l ist die Nummer der Iterationsschleife. Die Berechnung von D(l) ist weiter unten angegeben. 2. Setze l := l + 1. Alle Trainingsvektoren werden nun klassifiziert. Vektor v n wird der Zelle Cq zugeordnet, wenn der Abstand zum Referenzvektor yq dieser Zelle kleiner ist als alle anderen Abst¨ ande, d.h. d(v n , y q ) ≤ d(v n , y j ) f¨ ur alle j =
q (j = 0, 1, . . . , M − 1). 3. Der Schwerpunkt aller Vektoren, die zu einer Zelle geh¨oren, wird berechnet und als neuer Rekonstruktionsvektor f¨ ur diese Zelle festgelegt yq =
1
vj . Nq v j ∈Cq
Nq ist dabei die Anzahl aller Trainingsvektoren in Cq . Damit ver¨andern sich die Zellen und ihre Grenzen. 4. F¨ ur die neue Signalraumunterteilung wird der mittlere Quantisierungsfehler berechnet 1
1
D(l) = Dq mit Dq = d(vj , y q ) . M q Nq v j ∈Cq
ur die Zelle Cq . Dq ist der mittlere Fehler f¨ 5. Es folgt ein Test, wie stark sich der Quantisierungsfehler verringert hat. Wenn das Konvergenzkriterium D(l − 1) − D(l) H(X)). Der Code ist aber auch schon so gut, dass er innerhalb der in Gleichung (4.2) angegebenen Grenzen liegt. Eine u ur Codes sind so genannte Codeb¨aume. Abbildung 4.2 ¨bliche Darstellungsform f¨ zeigt den Codebaum f¨ ur das Beispiel aus Tabelle 4.1. Die Symbole bilden die Bl¨atter des
4.2 Morse-Code
33
0
a
0
1
1
0
b
1
c
d
Abbildung 4.2: Codewortbaum mit Codew¨ortern gleicher L¨ange Zeichen Codewort
a ·−
b −···
c − · −·
d −··
e ·
f · · −·
g −−·
··· ···
Tabelle 4.2: Auszug aus dem Morse-Alphabet Baumes und die Beschriftung der Zweige von der Wurzel bis zum Blatt entspricht dem jeweiligen Codewort. Vergleicht man nun den Informationsgehalt eines jeden Zeichens mit der Anzahl der zugewiesenen Codebits, so ist leicht zu erkennen, dass sie in keiner Weise miteinander korrespondieren, da die Codew¨ orter eine feste (fixierte) Codewortl¨ange haben (FLC . . . Fixed Length Code). Daraus resultiert die relativ hohe Codierungsredundanz von ΔR(X) = li − H(X) = 0.154 bit/Symbol. In den folgenden Abschnitten werden verschiedene Verfahren vorgestellt und diskutiert, bei denen mit Hilfe von variablen Code¨ wortl¨ angen (VLC . . . Variable Length Code) versucht wird, eine bessere Ubereinstimmung von Informationsgehalt und Codewortl¨ange und damit eine Verminderung der Codierungsredundanz zu erreichen.
4.2
Morse-Code
Einer der ¨ altesten Codes, der noch heute (wenn auch nur sehr selten) Anwendung findet, ist der Morse-Code (nach Samuel Morse 1843). Basis f¨ ur diesen Code sind kurze und lange Signalzeichen1 , die bei der schriftlichen Aufzeichnung als Punkte ( dit“) und Striche ” ( dah“) notiert werden. Die Idee des Morse-Codes besteht in der Zuweisung von kur” zen Kombinationen aus Punkten und Strichen f¨ ur h¨aufige alphanumerische Zeichen und l¨ angeren Kombinationen f¨ ur seltenere Zeichen auf Grundlage der H¨aufigkeitsverteilung von Buchstaben, Zahlen und Sonderzeichen in der englischen Sprache. Tabelle 4.2 zeigt einen Auszug aus dem Morse-Code-Alphabet. Im praktischen Einsatz erweist sich der Morse-Code allerdings als nicht ganz unproblematisch. Man stelle sich vor, der Empf¨anger erh¨alt die Nachricht · · − · · ·“ und soll ” sie decodieren. Es zeigt sich, dass diese Folge unterschiedlich interpretiert werden kann, n¨ amlich als eeb“, eede“, eaeee“ oder fee“. Wenn man das gesamte Morse-Alphabet ” ” ” ” betrachten w¨ urde, erg¨ aben sich sogar noch mehr Deutungsm¨oglichkeiten. Das Problem liegt in der Trennung der zugeordneten Codew¨orter. Aufgrund der variablen Codewortl¨ angen sind die Grenzen der Codew¨orter nicht ohne weiteres erkennbar. 1 Nicht
zu verwechseln mit den Symbolen eines Alphabets!
34
4 Entropiecodierung i si pi Ii [bit]
ci li
1 a 0.4 1.32 1 1 1
4 d 0.3 1.74 1 01 2
2 b 0.2 2.32 0 1 001 3
3 c 0.1 3.32 0
1
1.0
0.4 a
0 1
0.6
0.3 d 0 000 3
0 1
0.3
0.2 b
0
0.1 c
Tabelle 4.3: Beispiel 1 f¨ ur die Konstruktion eines Shannon-Fano-Codes Ein drittes Symbol (Pause) ist zur Trennung der einzelnen Codew¨orter erforderlich. Der Morse-Code ist deshalb kein bin¨ arer, sondern ein tern¨arer Code. Es muss also nach Codes gesucht werden, bei denen sich die Codew¨orter im Decodierprozess trotz variabler L¨ angen eindeutig abgrenzen lassen. Dies ist m¨oglich, wenn kein Codewort der Anfangsbitfolge eines anderen Codewortes gleicht, d.h. kein Codewort Pr¨afix eines anderen ist. Solche Codes werden als pr¨afixfreie oder auch Pr¨afixcodes bezeichnet.
4.3
Shannon-Fano-Codierung
Die erste Methode zur Erzeugung eines Pr¨afixcodes wurde durch Fano [Fan49] vorgeschlagen. Der Code wird wie folgt konstruiert: 1. Sortiere alle Symbole des zu betrachtenden Alphabets nach absteigender Wahrscheinlichkeit. 2. Teile die Symbole in zwei Gruppen, die eine m¨oglichst gleiche Summenwahrscheinlichkeit haben. 3. Weise der linken Gruppe eine ’1’ und der rechten eine ’0’ zu. 4. Setze f¨ ur jede Teilgruppe, die mehr als ein Symbol enth¨alt, bei 2. fort. 5. Reihe die Einsen und Nullen in der Reihenfolge ihrer Zuweisung zu Codew¨ortern aneinander. Tabelle 4.3 zeigt die Konstruktion an dem Beispiel aus Tabelle 4.1. Als Erstes werden die Symbole a“ bis d“ sortiert. Im zweiten Schritt wird eine Grenze zwischen den ” ” Symbolen a“ und d“ gefunden, welche die Symbole in zwei Gruppen mit den Summen” ” wahrscheinlichkeiten 0.4 und 0.6 teilt. Die linke Gruppe enth¨alt nur noch ein Symbol, f¨ ur sie ist die Prozedur damit bereits abgeschlossen und dem Symbol a“ ist das Codewort ” 1“ zuzuordnen. Die rechte Gruppe muss weiter unterteilt werden. ”
4.4 Huffman-Codierung
35
i pi
1 0.4
ci
1 11
2 0.1 1
0 10
3 0.1
1 0111
4 0.1
1
1 0 0110
5 0.1 0
6 0.1
0 010
1 001
7 0.1 0
0 000
Tabelle 4.4: Beispiel 2 f¨ ur die Konstruktion eines Shannon-Fano-Codes Das Ergebnis der Konstruktion ist ein Code mit variablen Codewortl¨angen, die mit dem Informationsgehalt der Symbole korrespondieren. Der durchschnittliche Speicheraufwand betr¨ agt im Gegensatz zur Verwendung fester Codewortl¨angen nur noch li
=
K
pi · li = 0.4 · 1 + 0.2 · 3 + 0.1 · 3 + 0.3 · 2 = 1.9 Bits/Symbol
i=1
und die Codierungsredundanz hat sich auf 0.054 bit/Symbol reduziert. Neben Tabelle 4.3 ist der entsprechende Codebaum dargestellt. In die Verzweigungspunkte sind die Wahrscheinlichkeitssummen der untergeordneten Symbole eingetragen. Anhand eines zweiten Beispiels soll gezeigt werden, dass die Konstruktion von ShannonFano-Codes nicht immer eindeutig ist und auch zu nicht-optimalen Ergebnissen f¨ uhren kann. Tabelle 4.4 zeigt die Auftretenswahrscheinlichkeiten f¨ ur ein Alphabet mit sieben Symbolen. Die Entropie dieses Alphabets betr¨agt H(X) = −0.4 · log2 (0.4) − 6 · 0.1 · log2 (0.1) = 2.522 bit/Symbol. Die Codewortzuweisung f¨ uhrt zu einer mittleren Codewortl¨ange von li = 0.4 · 2 + 0.1 · 2 + 2 · 0.1 · 4 + 3 · 0.1 · 3 = 2.7 Bits/Symbol. W¨ ahrend der erste Zerlegungsschritt die Symbole eindeutig in zwei Gruppen unterteilt, ist es im zweiten Schritt nicht vorgeschrieben, ob die Grenze zwischen dem vierten und f¨ unften oder dem f¨ unften und sechsten Symbol zu ziehen ist. Weiterhin ist zu erkennen, dass die Codewortl¨ angen nicht immer dem Informationsgehalt entsprechen. Die Symbole zwei und drei haben zwar die gleiche Auftretenswahrscheinlichkeit von 0.1, die zugewiesenen Codew¨ orter unterscheiden sich jedoch unverh¨altnism¨aßig stark. Die resultierende mittlere Codewortl¨ ange liegt schon in den von Shannon gefundenen Grenzen H(X) ≤ li < H(X) + 1, aber der Code ist noch nicht optimal. Mit anderen Worten: Die Codierungsredundanz k¨ onnte noch st¨ arker gesenkt werden.
4.4
Huffman-Codierung
1952 stellte David Huffman eine neue Methode zur Konstruktion von Pr¨afixcodes vor, welche die Nachteile des Shannon-Fano-Verfahrens u ¨berwindet und in jedem Fall eine optimale Codewortzuweisung garantiert [Huf52]. Die nach ihm benannten Huffman-Codes werden mit Hilfe des Codebaummodells wie folgt erzeugt:
36
4 Entropiecodierung 1. Betrachte alle Symbole als Bl¨ atter eines Codebaums und trage ihre Wahrscheinlichkeiten ein. 2. Fasse die beiden geringsten Wahrscheinlichkeiten zu einem Knoten zusammen und weise ihre Summe dem Knoten zu. 3. Beschrifte die neuen Zweige mit 0 bzw. 1. 4. Wenn die Wurzel des Baumes mit der Wahrscheinlichkeit p = 1.0 erreicht ist, beende die Konstruktion. 5. Setze bei 2. fort.
Ein Beispiel ist in Abbildung 4.3 angegeben. Die beiden kleinsten Wahrscheinlichkeiten (pb und pc ) werden zu einem Knoten zusammengefasst. Die resultierende Summe und die Wahrscheinlichkeit des Symbols d“ sind nun die kleinsten Werte und bilden ” den n¨ achsten Knoten. Im letzten Schritt wird die Wurzel des Baumes erreicht. Der entstandene Codebaum ist in Abbildung 4.4 links dargestellt. Die mittlere Codewortl¨ange betr¨ agt nach Gl. (4.1) li = 0.4 · 1 Bit + 0.2 · 3 Bits + 0.1 · 3 Bits + 0.3 · 2 Bits = 1.9 Bits/Symbol. Derselbe Wert wurde auch mit der Shannon-Fano-Codierung auf Seite 35 erreicht. Allerdings sah dort der erzeugte Code etwas anders aus. Hieran ist zu erkennen, dass die Code-Effizienz nicht von den Nullen und Einsen des zugewiesenen Codewortes, sondern nur von den Codewortl¨ angen abh¨ angt, denn diese stimmen u ¨berein. Die Beschriftung der Zweige sowie die Knoten und die Bl¨ atter einer Codebaum-Ebene k¨onnen beliebig vertauscht werden (Abb. 4.4 rechts). Prinzipiell f¨ uhrt die Konstruktion eines Huffman-Codes f¨ ur dieses Beispiel zu dem gleichen Ergebnis wie die Shannon-Fano-Codierung. Betrachten wir nun das zweite Beispiel in Abbildung 4.5 a). Auch die Huffman-Codierung ist hier nicht eindeutig, da gleich sechs Symbole mit der kleinsten Wahrscheinlichkeit vorhanden sind und es keine Vorschrift gibt, welche zuerst zusammengefasst werden m¨ ussen. Eine noch gravierendere Mehrdeutigkeit ergibt sich, wenn man beim Zusammenfassen zwischen Knoten bzw. Bl¨ attern unterschiedlicher Hierarchie-Ebenen ausw¨ahlen muss. Wie der Abbildung 4.5 b) zu entnehmen ist, f¨ uhrt dies sogar zu unterschiedlichen Codewortl¨ angen. Das stellt aber die optimale Codewortzuweisung der Huffman-Codes nicht si
pi
a
0.4
b
0.2
c
0.1
d
0.3
1 1 1 0
1.0
0.3
0 0
i si pi ci li
1 a 0.4 1 1
2 b 0.2 011 3
3 c 0.1 010 3
4 d 0.3 00 2
0.6
Abbildung 4.3: Beispiel 1 f¨ ur die Konstruktion eines Huffman-Code-Baums
4.4 Huffman-Codierung
37
1.0
0 0
0.6
0.3 d
1
0.3
0 1
0.6
0.3 d
1
0.1 c
1.0
0.4 a
0.4 a
1 0
1
0.2 b
0
0.3
1
0.2 b
0
0.1 c
Abbildung 4.4: Huffman-Code-B¨ aume mit identischen Codewortl¨angen und verschiedenen Codew¨ ortern
a)
i
pi
1
0.4
2
0.1
3
0.1
4
0.1
5
0.1
6
0.1
7
0.1
1 1 0
1.0 0 1
0
0 0
0
1
0.4
2
0.1
3
0.1 0.1 0.1
6
0.1
7
0.1
0.6
0.2
1
pi
5
0.2
1
i
4
b)
1
0.4
i 1 2 3 4 5 6 7
ci 1 011 010 0011 0010 0001 0000
li 1 3 3 4 4 4 4
0.2 1 1
1 0
0
0.6
0.2
1
1.0
1 0
0.2
0
1 0 0
0.4
i 1 2 3 4 5 6 7
ci 11 101 100 011 010 001 000
li 2 3 3 3 3 3 3
0.2
Abbildung 4.5: Beispiel 2 f¨ ur die Konstruktion eines Huffman-Code-Baums: a) Variante 1, b) Variante 2 in Frage, da die mittleren Codewortl¨ angen f¨ ur beide Varianten identisch sind li,1 = li,2 =
0.4 · 1 Bit + 2 · 0.1 · 3 Bits + 4 · 0.1 · 4 Bits = 2.6 Bits/Symbol 0.4 · 2 Bit + 6 · 0.1 · 3 Bits = 2.6 Bits/Symbol.
¨ Außerdem zeigt sich nun die Uberlegenheit gegen¨ uber der Konstruktionsmethode nach Shannon-Fano, die lediglich einen Wert von li = 2.7 erreicht. Prinzipiell sind die Code-Varianten aus den Abbildungen 4.5 a) und 4.5 b) gleichwertig. Manche Autoren [Loc97] geben dem Code nach Variante 2 den Vorzug, da die Varianz
38
4 Entropiecodierung
der Codewortl¨ angen σl2i =
K 1 (li − li )2 K i=1
geringer ist (σl2i,2 ≈ 0.19 statt σl2i,1 ≈ 1.53 f¨ ur Variante 1). Die Huffman-Codierung garantiert einen optimalen Code bei direkter Codewortzuweisung. Die Codierungsredundanz wird aber nur dann vollst¨andig entfernt, wenn die Wahrscheinlichkeiten die Bedingung pi =
1 2ni
mit
n = 1, 2, 3, . . .
erf¨ ullen. Genau dann sind n¨ amlich die Werte f¨ ur den Informationsgehalt eines Symbols I(si ) und die zugewiesene Codewortl¨ ange li identisch. Ein weiterer Nachteil von Pr¨ afixcodes ist die Grenze li ≥ 1. Auch wenn die Signalentropie H(X) weniger als 1 bit pro Symbol betr¨agt, enthalten alle Codew¨orter mindestens ein Bit.
4.5
Golomb- und Rice-Codes
4.5.1
Golomb-Codes
Neben Pr¨ afixcodes, die eine optimale Entropiecodierung anstreben, sind f¨ ur manche Anwendungen vordefinierte Codes von Vorteil. Sie bieten zwar nur f¨ ur bestimmte Verteilungsmodelle eine gute Kompression, lassen sich aber wesentlich leichter handhaben, weil zum Beispiel die signaladaptive Konstruktion nicht notwendig ist. Eine Code-Variante wurde 1966 von Solomon Golomb f¨ ur die Codierung von Laufl¨angen (siehe auch Abschnitt 5.2) vorgeschlagen [Gol66]. Da Golomb einen sehr anschaulichen Einstieg in die Problematik w¨ ahlte, m¨ ochte ich ihn in einer frei u ¨bersetzten Form zitieren. Geheimagent 00111 ist zur¨ uck im Casino beim Gl¨ ucksspiel, w¨ahrend das Schicksal der Menschheit auf der Kippe steht. Jedes Spiel besteht aus einer Sequenz von g¨ unstigen Ereignissen (Wahrscheinlichkeit p1 ), die durch das erste Auftauchen eines ung¨ unstigen Ereignisses (Wahrscheinlichkeit p0 = 1 − p1 ) abgeschlossen wird. Es handelt sich um Roulette und das ung¨ unstige Ereignis ist die Zahl 0, welche eine Wahrscheinlichkeit von p0 = 1/37 hat. Niemand wird ernsthaft daran zweifeln, dass 00111 es wieder schafft, aber der Geheimdienst ist sehr beunruhigt u ubermittlung. ¨ber die Nachrichten¨ Dem Barmann, ein freiberuflicher Agent, steht ein bin¨arer Kanal zur Verf¨ ugung, aber er verlangt gepfefferte Geb¨ uhren f¨ ur jedes zu u ¨bertragende Bit. Den Geheimdienst besch¨ aftigt nun das Problem, wie man die gefallenen Roulette-Zahlen codieren soll, ohne dem Finanzminister seiner Majest¨at den letzten Nerv zu rauben. Es ist leicht zu sehen, dass es f¨ ur den Fall p0 = p1 = 0.5 das Beste w¨ are, 0 und 1 f¨ ur die Beschreibung der beiden M¨oglichkeiten zu verwenden. Allerdings w¨ urde diese direkte Codierung f¨ ur den Fall p0 p1 erschreckend ineffizient sein.
4.5 Golomb- und Rice-Codes
r 0 1 2 3 4 5 6 7 8 9 10 .. .
pr 1/2 1/4 1/8 1/16 1/32 1/64 1/128 1/256 1/512 1/1024 1/2048
m=1 Codewort 0 10 110 1110 11110 111110 1111110 11111110 111111110 1111111110 11111111110 .. .
39
pr 0.293 0.207 0.146 0.104 0.073 0.052 0.037 0.026 0.018 0.013 0.009
m=2 Codewort 00 01 100 101 1100 1101 11100 11101 111100 111101 1111100 .. .
pr 0.206 0.164 0.130 0.103 0.082 0.065 0.052 0.041 0.032 0.026 0.020
m=3 Codewort 00 010 011 100 1010 1011 1100 11010 11011 11100 111010 .. .
pr 0.159 0.134 0.113 0.095 0.080 0.067 0.056 0.047 0.040 0.033 0.028
m=4 Codewort 000 001 010 011 1000 1001 1010 1011 11000 11001 11010 .. .
Tabelle 4.5: Golomb-Codes f¨ ur verschiedene Parameter m (pr = pr1 · p0 ) Letzten Endes schl¨ agt ein junger Chiffrierassistent, der etwas u ¨ ber Informationstheorie gelesen hat, eine Laufl¨ angencodierung zwischen zwei ung¨ unstigen Ereignissen vor. Im Allgemeinen ist die Wahrscheinlichkeit einer Laufl¨ange r gleich (p1 )r · p0 f¨ ur r = 0, 1, 2, . . ., was einer geometrischen Verteilung entspricht. Wenn die Liste der m¨ oglichen Laufl¨ angen endlich w¨are, k¨onnte man auf Basis ihrer ¨ Wahrscheinlichkeitsverteilung einen Huffman-Code konstruieren und f¨ ur die Ubertragung einsetzen. Da die Anzahl aufeinander folgender Zahlen ungleich Null theoretisch jedoch nicht begrenzt ist, muss ein anderer Weg gesucht werden. Gegeben sei eine ganze positive Zahl m mit der Eigenschaft (p1 )m = 0.5 .
(4.3)
Eine Laufl¨ ange von r + m w¨ are dann nur halb so wahrscheinlich wie eine Laufl¨ange r wegen (p1 )r+m · p0 = 0.5 · (p1 )r · p0 . Es ist deshalb f¨ ur die Laufl¨ ange r + m ein um ein Bit l¨angeres Codewort zu erwarten als f¨ ur r. Dies f¨ uhrte Golomb zu dem Schluss, dass es f¨ ur jede Codewortl¨ange l ≥ l0 genau m Codew¨ orter gibt und f¨ ur l = l0 − 1 eventuell ein paar weniger. l0 sei die kleinste nat¨ urliche Zahl gr¨ oßer als Null, f¨ ur die 2l0 ≥ 2m gilt. Dann enth¨alt der Golomb-Code genau m Codew¨ orter f¨ ur jede Codewortl¨ange l ≥ l0 sowie 2l0 −1 − m Codew¨orter der L¨ ange l0 − 1 (Tab. 4.5). Beispiel: Es sei m = 3. Die Bedingung 2l0 ≥ 2m wird mit l0 = 3 erf¨ ullt (23 ≥ 2·3). Dass heißt, es gibt jeweils drei Codew¨ orter der gleichen Codewortl¨ange l ≥ l0 . Codew¨orter der L¨ ange l = l0 − 1 = 2 sind 2l0 −1 − m = 22 − 3 = 1 mal vertreten. Sortiert man die Codew¨ orter gleicher L¨ange nach ihren Codewerten, erh¨alt man die kanonischen Codes in Tabelle 4.5.
40
4 Entropiecodierung x 0 1 2 3 4 5 6 7 8 9 10 .. .
bin¨ ar 00000 00001 00010 00011 00100 00101 00110 00111 01000 01001 01010 .. .
k=0 0 10 110 1110 11110 111110 1111110 11111110 111111110 1111111110 11111111110 .. .
k 0 1 0 1 0 1 0 1 0 1 0 .. .
=1 0 0 10 10 110 110 1110 1110 11110 11110 111110
k=2 00 0 01 0 10 0 11 0 00 10 01 10 10 10 11 10 00 110 01 110 10 110 .. .
k=3 000 0 001 0 010 0 011 0 100 0 101 0 110 0 111 0 000 10 001 10 010 10 .. .
Tabelle 4.6: Rice-Codes f¨ ur verschiedene Codierungsparameter k Welchen Code soll Agent 00111 nun benutzen? Mit p0 = 1/37 folgt aus Gleichung (4.3) m = − log 2/ log p1 ≈ 25. Das Runden von m auf eine ganze Zahl stellt f¨ ur große m keinen Nachteil dar. Sehr oft ist die zugrundeliegende Wahrscheinlichkeitsverteilung gar nicht ganz genau bekannt, sondern wird anhand von Informationen aus der Vergangenheit gesch¨ atzt.
4.5.2
Rice-Codes
Alle Codes mit der Eigenschaft m = 2k , k ∈ N bilden eine Untermenge der Golomb-Codes und werden Rice-Codes genannt (nach [Ric79]). Die Auswahl an Codetabellen wird hierbei deutlich eingeschr¨ ankt, f¨ ur die Codierung ergibt sich aber eine wesentliche Vereinfachung, weil die Menge der Codew¨ orter der L¨ange l0 − 1 leer ist. Alle Codew¨orter setzen sich aus zwei Komponenten zusammen. Der Teil y1 = x mod m entspricht den letzten k Bits des zu u ¨ bertragenden Zahlenwerts x und wird als solches gesendet. Der verbleibende Rest y2 = x >> k (oder: y2 = x/m ) wird un¨ar als zweiter Teil des Codewortes verwendet (siehe auch Abb. 2.1 auf Seite 7). In Tabelle 4.6 sind die korrespondierenden Codew¨ orter beginnend mit y1 aufgelistet. Die Rice-Codes f¨ ur k = 1 und k = 2 entsprechen den Golomb-Codes mit m = 2 und m = 4 mit dem Unterschied, dass in diesem Beispiel das letzte Bit (bzw. die beiden letzten Bits) aus den Golomb-Codew¨ ortern bei den Rice-Codes am Anfang stehen (Kennzeichnung durch zus¨ atzlichen Abstand zwischen den Ziffern).2 Die optimale Wahl des Parameters k (Auswahl einer Codetabelle) ist durch eine Codierungsadaptation zu realisieren (siehe auch Abschnitt 4.9.2). Angenommen, es gilt k = 2 und x = 9 = 1001“ soll codiert werden. Die untersten k = 2 Bits von x lauten 01“ und ” ” werden ausgegeben. Die Bitshift-Operation x >> k ergibt 2, weshalb zwei 1-Bits gefolgt von einer Null an den Bitstrom geh¨ angt werden. 2 Die Reihenfolge der Codewort-Bestandteile hat selbstverst¨ andlich keinen Einfluss auf das Kompressionsverh¨ altnis. Es ist lediglich eine Frage der Software-Implementierung, welche Bits zuerst gesendet werden. ¨ Lediglich eine Ubereinstimmung von Encoder und Decoder ist erforderlich. Die gew¨ ahlte Anordnung entspricht der in der Literatur u ¨ blichen Reihenfolge der Bestandteile.
4.5 Golomb- und Rice-Codes x 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 .. .
bin¨ ar 00000 00001 00010 00011 00100 00101 00110 00111 01000 01001 01010 01011 01100 01101 01110 01111 .. .
41
k=0 0 10 0 10 1 110 00 110 01 110 10 110 11 1110 000 1110 001 1110 010 1110 011 1110 100 1110 101 1110 110 1110 111 11110 0000 .. .
k=1 00 01 10 00 10 01 10 10 10 11 110 000 110 001 110 010 110 011 110 100 110 101 110 110 110 111 1110 0000 1110 0001 .. .
k=2 0 00 0 01 0 10 0 11 10 000 10 001 10 010 10 011 10 100 10 101 10 110 10 111 110 0000 110 0001 110 0010 110 0011 .. .
k=3 0 000 0 001 0 010 0 011 0 100 0 101 0 110 0 111 10 0000 10 0001 10 0010 10 0011 10 0100 10 0101 10 0110 10 0111 .. .
k 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 .. .
=4 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
Tabelle 4.7: Exponentielle Golomb-Codes f¨ ur verschiedene Codierungsparameter k
Prinzipiell ist die Zuordnung von Nullen und Einsen bei der Codierung von y2 egal. In Applikationen mit Marken, deren erstes Byte aus 8 Einsen (0xff) besteht, sollten aber vorzugsweise Codew¨ orter benutzt werden, die keine langen Folgen von 1-Bits aufweisen. Dadurch verhindert man das unn¨ otige Einf¨ ugen von Stopfbits, welche dem Decoder signalisieren m¨ ussten, dass es sich um keine Marke handelt. Die Codierung von y2 erfolgt deshalb zum Beispiel im Standard JPEG-LS (Abschnitt 9.3) mit einer Folge von Nullen, die durch ein 1-Bit abgeschlossen wird.
4.5.3
Exponentielle Golomb-Codes
Exponentielle Golomb-Codes wurden erstmals in [Teu78] vorgeschlagen und finden ihre Anwendung im neuen Standard zur Videokompression H.264 ([ITU03, Mar03]). Wie der Name es bereits vermuten l¨ asst, handelt es sich hierbei um eine Variante der Golomb¨ Codes (Abschnitt 4.5.1). Ahnlich der Rice-Codes setzen sie sich aus zwei Teilen, einem Pr¨ afix und einem Suffix, zusammen und sind ebenfalls von einem Codierungsparameter k abh¨ angig. Der Pr¨ afix x y2 = log2 k + 1 2 verwertet die oberen Bits von x. Das Codewort beginnt mit einer Sequenz von y2 Einsen gefolgt von einer Null. Der Suffix der exponentiellen Golomb-Codes umfasst y2 + k Bits und nummeriert alle M¨ oglichkeiten bin¨ar durch (siehe Tab. 4.7). Eine Implementierungsvariante zur Codewortgenerierung zeigt Abbildung 4.6.
42
4 Entropiecodierung
while (1) {
if (x >= (1 k) & 0x01); break;
} } }
Abbildung 4.6: Erzeugung der exponentiellen Golomb-Codes in Abh¨angigkeit des Codierungsparameter k
1 0 0 0 0
b0 b0 b0 b0
1 0 0 0
b1 b1 b1 .. .
1 0 0
b2 b2
1 0
b3
1
0 1 2 3 4 5 6 7 8 9
1 001 011 00001 00011 01001 01011 0000001 0000011 0001001
Tabelle 4.8: Struktur und Codew¨ orter von universellen Codes variabler L¨ange
4.6
Universelle Pr¨ afixcodes
F¨ ur Applikationen mit speziellen Anforderungen an eine geringe Encodier- und Decodierzeit bei gleichzeitig erh¨ ohter Robustheit gegen¨ uber Bitfehlern wurden so genannte universelle VLCs (UVLC . . . Universal Variable Length Code) entwickelt und zum Beispiel f¨ ur die Symbol-Codierung im Standard H.26L vorgeschlagen [Bjo98, ITU01] (jetzt H.264 [ITU03]), sp¨ ater jedoch wieder verworfen. Ihre Struktur ist dadurch gekennzeichnet, dass alle Bits an den geraden Positionen (beginnend mit 0) der Codew¨orter gleich Null sind mit Ausnahme des letzten Bits. Die eigentliche Information steckt somit in den Bits an den ungeraden Positionen. Die Codewortl¨angen sind dadurch immer ungerade (Tab. 4.8). Dieser Code weist drei wesentliche Vorteile auf. Erstens ist in der Encodie-
4.6 Universelle Pr¨ afixcodes
43
rung keine Konstruktion des Codes oder eine Adaptation der Code-Auswahl erforderlich. Zweitens gestaltet sich die Decodierung sehr einfach. Die Bits k¨onnen immer paarweise eingelesen werden, da jedes zweite Bit gleich Null ist. Anderenfalls wird das Ende des Codewortes erkannt. Und drittens sind die Codew¨orter nicht nur von links, sondern auch r¨ uckw¨ arts decodierbar, obwohl sie nicht suffixfrei3 sind. Die r¨ uckw¨ arts gerichtete Decodierbarkeit l¨asst sich leicht u ufen. Gegeben sei zum ¨ berpr¨ Beispiel die Aneinanderreihung von folgenden Codew¨ortern 001 1 00001 011 01001
←−
Bei einer klassischen Decodierung (siehe n¨achsten Abschnitt) w¨ urde man beginnend von rechts als erstes die Eins lesen und das k¨ urzeste Codewort ( 1“) detektieren. Nun ist das ” zweite Bit von rechts allerdings gleich Null, also kein Ende eines anderen Codewortes. Eine Codewort-Grenze ist somit an dieser Position auszuschließen. Wenn man die Bits paarweise von rechts einliest, ergeben sich mit Hilfe der gegebenen Codestruktur folgende Regeln f¨ ur die effiziente Decodierung. Nur wenn das linke Bit eines Paares gleich Eins ist, k¨ onnte es das letzte Bit des n¨ achsten Codewortes sein. Dies ist jedoch nur dann der Fall, wenn das linke Bit vom n¨ achsten Paar gleich Null ist. Dieser Vorgang ist im Folgenden dargestellt. Bitpaare, die eine Grenze von Codew¨ortern anzeigen, sind kursiv gedruckt. Die Codewortgrenze verl¨ auft jeweils zwischen den Bits des rechten Paares. 001100001 01 10 001100 00 10 11 0 01 10 00 01 011 00 11 00001 011 001 1 00001 011
10 01 01001 01001 01001 01001
←−
Bei normalen Pr¨ afixcodes besteht immer das Problem, dass ab der Position eines aufgetretenen Bitfehlers kein Codewort mehr korrekt decodiert wird, also falsche Symbole erzeugt werden. Besteht nun die M¨ oglichkeit, den Bitstrom zus¨atzlich r¨ uckw¨arts (von rechts) auszulesen, sind auch Symbole hinter dem Bitfehler decodierbar. Voraussetzung ist nat¨ urlich, dass die Position des fehlerhaften Bits detektierbar ist. Wie wirken sich Bitfehler auf die Decodierung von ULVCs aus? Angenommen, der Bitfehler befindet sich genau an einer Position bi (vgl. Tab. 4.8 links). Die Struktur des Codes ist davon nicht beeinflusst. Lediglich das betroffene Symbol wird fehlerbehaftet rekonstruiert, w¨ ahrend alle nachfolgenden Symbole vom Fehler unber¨ uhrt bleiben. Anders sieht es aus, wenn die Codestruktur ver¨ andert wird. Die Umwandlung einer terminierenden 1 hat einen Zusammenschluss von drei Codew¨ortern zur Folge. Auch wenn die Codew¨orter danach wieder richtig interpretiert werden, ist die Zuordnung der Symbole um zwei Positionen verschoben. Die Decodierung von rechts erm¨oglicht in diesem Fall eine korrekte Verarbeitung bis in die N¨ ahe des Bitfehlers. Fehler im ersten bzw. im zweiten Codewort f¨ uhren zum Beispiel zu: 3 siehe
auch pr¨ afixfrei“ am Ende von Abschnitt 4.2 ”
44
4 Entropiecodierung
−→
000 1 00001 011 01001 000100001 011 01001 ?0001 00001 011 01001
←−
−→
001 0 00001 011 01001 001 000001011 01001 001000001 011 01001
←−
Die R¨ uckw¨ artsdecodierung liefert ab einer bestimmten Stelle andere Symbole als die Vorw¨ artsdecodierung. Der Bitfehler ist somit eingegrenzt. Eine Umwandlung eines 0Bits in eine (terminierende) Eins erzeugt dagegen aus dem fehlerhaften Codewort und seinem Nachfolger zwei neue Codew¨ orter.
−→
101 1 00001 011 01001 1 011 00001 011 01001 1 011 00001 011 01001
←−
−→
001 1 00101 011 01001 001 1 001 01011 01001 001 1 001 01011 01001
←−
Die fehlerhafte Decodierung beschr¨ ankt sich somit auf zwei Symbole. Die Detektion des Fehlers mittels der R¨ uckw¨ artsdecodierung ist hier nicht m¨oglich. Der große Nachteil dieses Codes ist die fehlende Flexibilit¨at. Er ist nur f¨ ur eine festgelegte Verteilung der Symbole optimal. In einem Kompressionssystem, bei dem Symbolfolgen mit unterschiedlichen Statistiken anfallen, ist es deshalb erforderlich, mit einer geschickten Pr¨ acodierung (siehe Kapitel 5) die originalen Symbole auf solche Symbole abzubilden, die in etwa eine H¨ aufigkeitsverteilung aufweisen, die dem UVLC entspricht. Der UVLC wurde in der weiteren Entwicklung von H.26L deshalb durch exponentielle Golomb-Codes ersetzt, die flexibler an unterschiedliche Symbolverteilungen angepasst werden k¨onnen (siehe auch Abschnitte 4.5.3 und 11.6.4). Auf die M¨oglichkeit zur R¨ uckw¨artsdecodierung wurde daf¨ ur verzichtet.
4.7
Decodierung von Pr¨ afixcodes
Aufgrund der sehr einfachen Struktur von Rice-Codes, bereitet ihre Decodierung keine Probleme. Lediglich der Codierungsparameter k (siehe Abschnitt 4.5.2) muss dem Decoder bekannt sein. Er liest k Bits (die unteren Bits des zu bestimmenden Wertes x) aus dem Bitstrom und weist den Zahlenwert einer tempor¨aren Variablen x zu. Anschließend werden solange 1-Bits decodiert, bis ein 0-Bit auftaucht. Die Anzahl der Einsen n wird um k Bitstellen nach links verschoben und zur tempor¨aren Zahl addiert. Der decodierte Wert betr¨ agt somit x = x + n · 2k = x + (n (4.10) Hk [K] Hk [K] erf¨ ullt sein. Sei Hk [i] = χ, dann ist Hk [i + 1] mindestens gleich χ + 1 und man erh¨alt range · (χ + 1) range · χ > , (4.11) Hk [K] Hk [K] range · χ range range · χ + > . (4.12) Hk [K] Hk [K] Hk [K] Man erkennt, dass Hk [K] h¨ ochstens gleich range sein darf. Wie weiter unten gezeigt wird, ist range aufgrund von Intervallskalierungen nie kleiner als Q1. Also muss garantiert werden, dass die Bedingung Hk [K] ≤ Q1 stets erf¨ ullt ist. Nach dem Bestimmen der Intervallgrenzen wird u uft, ob eindeutige Codebits vor¨berpr¨ handen sind und ausgegeben werden k¨ onnen. Dazu sind drei Bedingungen in einer Programmschleife zu testen. Abbildung 4.8 zeigt die Operationen in einem Pseudocode. Befindet sich das aktuelle Intervall vollst¨andig in der unteren H¨alfte des Gesamtintervalls (high < Q2), so kann eine 0“ ausgegeben werden, gefolgt von n Einsen (siehe auch dritte ” Bedingung). Liegt das Intervall dagegen in der oberen H¨alfte (low ≥ Q2), sind die obersten Bits von low und high beide gleich 1“. Diese Eins wird, gefolgt von n Nullen, an den ” Bitstrom geh¨ angt. Das aktuelle Intervall wird danach um Q2 nach unten verschoben, um ¨ ein Ubertreten der oberen Grenze des Gesamtintervalls durch die nachfolgende Reskalierung des aktuellen Intervalls zu verhindern. Die dritte Bedingung ergibt sich, wenn das aktuelle Intervall in der Mitte des Gesamtintervalls liegt (low ≥ Q1 und high < Q3). In diesem Fall ist klar, dass ein Bit ausgegeben werden kann, und n wird inkrementiert. Ob es sich um eine Null oder eine Eins handelt, wird erst entschieden, wenn eine der ersten beiden Bedingungen erf¨ ullt ist. Außerdem wird das Intervall um minus Q1 verschoben.
4.8 Arithmetische Codierung
Schleife { if (high < Q2)
}
51
→
senden von ’0’ und n Einsen, n := 0
else if (low ≥ Q2)
→
senden von ’1’ und n Nullen, n := 0, low− = Q2, high− = Q2
else if (low ≥ Q1) AND (high < Q3)
→
ein Bit sammeln (n := n + 1), low− = Q1, high− = Q1
%
verlasse die Schleife
%
Skalierung der Intervallgrenzen
else break low := 2 · low high := 2 · high + 1
Abbildung 4.8: Programmschleife zur Ausgabe von eindeutigen Bits Wenn eine der drei Bedingungen erf¨ ullt ist, wird das Intervall durch Verdopplung von low und high skaliert. high muss zus¨ atzlich um Eins erh¨oht werden, damit eine Identit¨at von oberer und unterer Grenze verhindert wird. Tabelle 4.14 zeigt beispielhaft den Ablauf f¨ ur die Codierung der Zeichensequenz adbc“. ” F¨ ur die Codierungsaufl¨ osung wurde ein Wert von B = 6 gew¨ahlt. Daraus ergeben sich M = 63, Q1 = 16, Q2 = 32 und Q3 = 48. Der Intervallbereich range berechnet sich aus Gleichung (4.7) zu 32. Die Auswahl von a“ (i = 0) f¨ uhrt zu einer Intervallverengung mit ” high = 24 und low = 0 entsprechend den Gleichungen (4.8) und (4.9). Nun erfolgt ein Sprung in die Schleife (Abb. 4.8) und es stellt sich heraus, dass das Intervall vollst¨andig in der unteren H¨ alfte liegt. Eine Null wird ausgegeben und das Intervall reskaliert. Die neuen Intervallgrenzen high = 49 und low = 0 erf¨ ullen keine der Bedingungen und es kann mit der Codierung des n¨ achsten Zeichens fortgesetzt werden. F¨ ur das Zeichen d“ ergibt sich die Bedingung 2 und damit verbunden die Ausgabe eines 1-Bits. Das ” Intervall muss um minus Q2 verschoben werden. Die nachfolgende Skalierung schließt die Codierung dieses Symbols ab. Nach der Verarbeitung aller vier Symbole liegt die BitSequenz 010101“ vor. Die Encodierung muss nun mit einer speziellen Routine beendet ” werden (siehe Abb. 4.9), damit der Decoder die vollst¨andige Information u ¨ber den Status der Intervallposition erh¨ alt (z.B. die Anzahl n der gesammelten Bits). Diese Bedingung f¨ uhrt im gew¨ ahlten Beispiel zur Ausgabe von vier weiteren Bits. Das endg¨ ultige Codewort lautet 0101010111“. Es unterscheidet sich von dem Resultat ” des Gleitkomma-Algorithmus (vgl. Tabelle 4.13). Ursache daf¨ ur ist die Approximation der Intervallgrenzen mit ganzen Zahlen und die relativ begrenzte Aufl¨osung von B = 6. Da der Decoder mit der gleichen Verarbeitungsbreite operiert, stellt dies jedoch kein Problem dar. Zum Bestimmen der erreichbaren mittleren Codewortl¨ange wird eine Testfolge mit zehn Zeichen codiert, in der alle vier Symbole entsprechend ihrer vorgegebenen H¨aufigkeit
52
4 Entropiecodierung Symbol a
range 64
d
50
b
30
c
48
high 24 49 49 17 35 23 47 15 31 63 48 16 33 17 35 19 39
low 0 0 35 3 6 18 36 4 8 16 44 12 24 8 16 0 0
n 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 2 2
Bedingung high < Q2
Bit 0
Modifizierung ∗=2
low ≥ Q2
1
– Q2 ∗=2
high < Q2 low ≥ Q2
0 1
high < Q2
0
∗=2 – Q2 ∗=2 ∗=2
low ≥ Q2
1
(low ≥ Q1) && (high < Q3) (low ≥ Q1) && (high < Q3) low < Q1
– Q2 ∗=2 – Q1, n++ ∗=2 – Q1, n++ ∗=2
0 111
Tabelle 4.14: Bestimmen des arithmetischen Codewortes mit Festkomma-Implementierung
beende encodierung() { n := n + 1 if (low < Q1) → else → }
senden von ’0’ und n Einsen senden von ’1’ und n Nullen
Abbildung 4.9: Abschlussroutine f¨ ur die arithmetische Encodierung auftreten. Der Ergebnisbitstrom umfasst insgesamt 20 Bits. Die mittlere Codewortl¨ange betr¨ agt also 20/10 = 2.0 Bits pro Symbol. Erh¨oht man die Zahl der zu codierenden Zeichen, dann wird eine Ann¨ aherung an die Signalentropie erkennbar. Die Ergebnisse sind exemplarisch in Tabelle 4.15 aufgelistet. Es ist zu sehen, dass sich die mittlere Codewortl¨ ange (li = 1.847) an die Entropie des Signals (H(X) = 1.846) besser ann¨ahert, als es N Bits li
10 20 2.0
20 38 1.9
40 75 1.875
80 148 1.85
100 185 1.85
150 277 1.847
Tabelle 4.15: Mittlere Codewortl¨ angen bei arithmetischer Codierung von Symbolen aus s[i] = [a; b; c; d] mit p[i] = [0.4; 0.2; 0.1; 0.3] in Abh¨angigkeit der Anzahl N der codierten Symbole
4.8 Arithmetische Codierung
53
mit der Huffman-Codierung m¨ oglich war (li = 1.9). Weitere Vorteile der arithmetischen Codierung gegen¨ uber Pr¨ afixcodes ergeben sich bei einer signaladaptiven Verarbeitung (siehe Abschnitt 4.9). Nachteilig ist dagegen der vergleichsweise hohe Rechenaufwand. W¨ ahrend in der Huffman-Codierung nach einer einmaligen Erzeugung des Codebaums lediglich die richtigen Codew¨ orter ausgew¨ahlt werden m¨ ussen, erfordert das Bestimmen der Intervallgrenzen aufwendige Berechnungen insbesondere durch die Division in den Gleichungen (4.8) und (4.9). Eine M¨ oglichkeit zur Beschleunigung der arithmetischen Codierung wird in Abschnitt 4.8.2 diskutiert. 4.8.1.2
Decodierung
Der Decoder muss die Operationen des Encoders nachahmen. Als erstes werden s¨amtliche Variablen (K, B, M, Q1, Q2, Q3, high, low, n) mit den gleichen Werten initialisiert und die Vektoren Hk [i] = [0; 4; 6; 7; 10] und s[i] = [a; b; c; d] vorbereitet. Anhand der Daten aus dem Bitstrom muss der Decoder die Startposition im Intervall bestimmen. Deshalb werden zu Beginn einmalig B Bits gelesen und der Variablen pos als bin¨are Zahl zugewiesen. Lautet die Anfangsbitfolge z.B. 001101“, erh¨alt pos den Wert 13. Analog zur ” Encodierung wird nun der Intervallbereich bestimmt range := high − low + 1 . Die Berechnung der oberen und der unteren Grenze ist abh¨angig von dem codierten Symbol, das mit Hilfe der kumulativen H¨aufigkeiten Hk [i] ermittelt wird. Zun¨achst bildet man die Intervallposition pos auf den Wertebereich von Hk [i] ab cu := [(pos − low + 1) · Hk [K] − 1] / range .
(4.13)
Mit dem Wert cu kann nun das H¨ aufigkeitsintervall des gesuchten Symbols in Hk [i] mit folgenden Operationen gefunden werden i := K − 1 % beginne Suche beim letzten Symbol s[K − 1] while (cu < Hk [i]) {i := i − 1} % suche, solange Bedingung erf¨ ullt ist .
Das Symbol s[i] ist damit bekannt. Die Berechnungsvorschriften high low
Hk [i + 1] −1 Hk [K] Hk [i] := low + range · Hk [K] := low + range ·
und
aktualisieren die Intervallgrenzen und eine Programmschleife (Abb. 4.10) u uft die ¨berpr¨ drei Bedingungen zur Lage des aktuellen Intervalls. Neben den Intervallgrenzen muss auch der Zeiger pos skaliert werden. Durch das Einlesen des n¨achsten Bit verfeinert sich sein Wert immer wieder. Verwenden wir nun die im Encoderbeispiel gefundene Bitsequenz 0101010111“ als In” put f¨ ur den Decoder (vgl. Tab. 4.14). Der Zeigers pos wird mit den ersten B = 6 Bits
54
4 Entropiecodierung
Schleife { if (high < Q2)
}
→
tue nichts
else if (low ≥ Q2)
→
low− = Q2, high− = Q2, pos− = Q2
else if (low ≥ Q1) AND (high < Q3)
→
low− = Q1, high− = Q1, pos− = Q1
%
verlasse die Schleife
% %
skaliere Intervallgrenzen skaliere Position und lese neues Bit
else break low := 2 · low high := 2 · high + 1 pos := 2 · pos + next bit()
Abbildung 4.10: Programmschleife zur Aktualisierung der Intervallgrenzen und zum Einlesen von neuen Daten aus dem Bitstrom
Nr. 1 2 3 4 5 6 7
Bit 0 1 0 1 0 1
pos 0 1 2 5 10 21
0
42
8
1
21
9
1
43
10 11
1 0
23 46
11
1
range
cu
si
high
low
n
Bedingung
Modifizierung
64
3
a d
low ≥ Q2
−Q2 ∗=2
30
5
b
0 0 0 0 0 0 0 0 0 0 0 0
∗=2
8
0 0 35 3 6 18 36 4 8 16 44 12
high < Q2
50
24 49 49 17 35 23 47 15 31 63 48 16
high < Q2 low ≥ Q2 high < Q2
∗=2 −Q2 ∗=2 ∗=2
low ≥ Q2
−Q2
63 48 16
16 44 12
0 0 0
low ≥ Q2
−Q2
48
6
c
48
6
c
47
Tabelle 4.16: Arithmetische Decodierung mit Festkomma-Implementierung
4.8 Arithmetische Codierung
55
initialisiert (Tab. 4.16). Diese Intervallposition wird mit Gleichung (4.13) auf eine kumulative H¨ aufigkeit cu umgerechnet und liefert das Symbol a“. Anschließend erfolgen die ” Intervallgrenzenoperationen analog zur Verarbeitung im Encoder. Der Vergleich der Tabellen 4.14 und 4.16 zeigt, dass Encoder und Decoder identische Operationen ausf¨ uhren. Hinzu kommt die Berechnung des Zeigers pos auf Basis der neu eingelesen Bits. Allerdings zeigt sich hier ein Problem der arithmetischen Decodierung. Die zehn empfangenen Bits reichen nicht aus, das letzte Symbol zu identifizieren. Es ist ein weiteres Bit in diesem Beispiel erforderlich, bis der Decoder das vierte Symbol (c) erkennt. Im oberen Tabellenabschnitt wurde zus¨ atzlich eine Null eingegeben (Bit-Nr. 11), um den Zeiger am unteren Rand (pos = 46) des Intervalls zu halten. Im unteren Tabellenteil sind die letzten Operationen angegeben, wenn das zus¨atzliche Bit gleich Eins ist. Man sieht, dass der Zeiger (pos = 47) sich mehr in Richtung des oberen Randes des Intervalls bewegt. Trotzdem wird als n¨ achstes Zeichen wieder das c“ erkannt. Der Wert des letzten Bits ” ist also bedeutungslos. Das Problem ist nun, dass der Decoder nicht weiß, wie viele Bits er gelesen hat, die nicht zum eigentlichen Codewort geh¨oren. Ein Zur¨ uckschreiben der zu viel gelesenen Bits ist nicht m¨ oglich. Diese Implementierung wird im Folgenden als Variante 1 bezeichnet. Die Quelltexte dieses funktionst¨ uchtigen arithmetischen Coders sind im Anhang D.1 abgedruckt.
4.8.2
Beschleunigte Implementierung
Die im vorangegangenen Abschnitt vorgestellte Implementierung bildet den Algorithmus der arithmetischen Codierung Eins zu Eins ab und ist dadurch relativ u ¨ bersichtlich. An dieser Stelle soll eine zweite, etwas schnellere Variante vorgestellt werden, die auf einer Ver¨ offentlichung von Moffat basiert [Mof95]. Der grundlegende Unterschied zum Algorithmus von Witten, Neal und Cleary besteht im Weglassen der Berechnung der oberen Intervallgrenze high. Stattdessen erh¨ alt der Bereich range eine gr¨oßere Bedeutung. Außerdem garantiert der neue Codierungsablauf, dass der Decoder nur so viele Bits ausliest, wie der Encoder in den Bitstrom eingef¨ ugt hat. Die Erl¨auterung dieses Algorithmus bezieht sich auf die entsprechenden Quelltexte im Anhang D.1.3 (Variante 2). 4.8.2.1
Encodierung
Die Initialisierung ist im Wesentlichen die gleiche wie bei der ersten Variante. Ein Vektor Hk [i] enth¨ alt die kumulativen H¨ aufigkeiten H(si ) der Symbole s[i] (i = 0, . . . , K−1). Als Voraussetzung f¨ ur den Algorithmus gilt H(si ) ≥ 1 f¨ ur alle i. F¨ ur das Codierungsintervall wird eine Aufl¨osungsbreite von B Bits festgelegt. Ein Viertel und die H¨ alfte des Zahlenbereiches lassen sich mit Q1 = 2(B−2) und Q2 = 2(B−1) bestimmen. B muss mindestens so groß sein, dass Hk [K] ≤ Q1 garantiert ist. Die Grenzen des Codierungsintervalls werden mit low = 0 und range = Q2 und ein Bitz¨ahler mit n = 0 initialisiert. Jeder Codierschritt bildet den Codierungsbereich durch Normierung mit der Summe aller H¨ aufigkeiten Hk [K] auf die Intervalle der kumulativen H¨aufigkeiten ab (Routine ac2 encode(), Abb. 4.11) Hrange := range/Hk [K] .
(4.14)
56
4 Entropiecodierung
0
low
low+range
0 H_low=Hk[ i ]
2B
H_high=Hk [i+ 1] Hk [K ]
H_range
Abbildung 4.11: Korrespondenz von Codierungsintervall und kumulativen H¨aufigkeiten
Hk [K] darf den Wert von range nicht u ¨ bersteigen, damit der Quotient nicht kleiner als 1 ist. Verwendet man eine voll-adaptive Anpassung der H¨aufigkeitsverteilung (siehe Abschnitt 4.9.5), m¨ ussen bei Erreichen des Maximalwertes Hk [K] ≥ Q1 alle H¨aufigkeiten halbiert und die kumulativen Werte angepasst werden. Zu beachten ist wiederum, dass pro Symbol eine Mindesth¨ aufigkeit von H(si ) ≥ 1 eingehalten wird. In Abh¨ angigkeit vom Index i des zu codierenden Symbols erfolgt die Berechnung der neuen Intervallparameter mit low := low + Hrange · Hk [i]
(=low ˆ + range · Hk [i]/Hk [K])
(4.15)
und range := Hrange · (Hk [i + 1] − Hk [i]) .
(4.16)
Im Unterschied zur Implementierung in Variante 1 (Gl.(4.9)) wird die Division durch Hk [K] vor der Multiplikation mit Hk [i] durchgef¨ uhrt (Gl.(4.14) und (4.15)). Dadurch ist es m¨ oglich, gr¨ oßere H¨ aufigkeitswerte zu verarbeiten (Bmax = 30), jedoch wird die Genauigkeit der Intervallgrenzen-Approximation schlechter. Eine Programmschleife u uft nun, ob Bits ausgegeben werden k¨onnen, und das Co¨berpr¨ dierungsintervall wird entsprechend skaliert (Abb. 4.12). Unter gewissen Umst¨anden kann es zu einer Anh¨ aufung von gesammelten Bits in der Variable n kommen. Ein ¨ Uberlauf ist zwar ¨ außerst unwahrscheinlich, weil das codierte Signal mindestens 231 Bits lang sein m¨ usste (entweder alles Einsen oder alles Nullen), aber der Vollst¨andigkeit halber wurde eine entsprechende Abfrage in die Routine eingebaut (ac2 encode(), Zeilen 106 –111). Die abschließende Routine finish encode() schreibt alle B Bits von low in den Datenstrom. Mit der Option BACK BITS aus ac2.h wird die Zahl der Bits reduziert. Dazu werden alle Bits der Variable low getestet. Wenn trotz des Abschneidens von Bits sich die Intervallgrenzen nicht ¨ andern, sind diese Bits irrelevant und brauchen nicht ausgegeben zu werden.
4.8 Arithmetische Codierung
57
while(range ≤ Q1) { if (low ≥ Q2)
}
→
senden von ’1’ und n Nullen, n := 0, low− = Q2
else if ((low + range) ≤ Q2)
→
senden von ’0’ und n Einsen, n := 0
else
→
ein Bit sammeln (n := n + 1), low− = Q1
low := 2 · low range := 2 · range
%
Skalierung des Codierungsintervalls
Abbildung 4.12: Programmschleife zur Ausgabe von eindeutigen Bits (Variante 2) 4.8.2.2
Decodierung
¨ Die neue Decoder-Implementierung enth¨alt eine weitere Anderung im Vergleich zu Variante 1. Statt der unteren Grenze low wird die Differenz diff zwischen der Position pos im Intervall und low verfolgt. S¨ amtliche Variablen (B, Q1, Q2, range) und die kumulativen H¨aufigkeiten Hk [i] werden mit den gleichen Werten initialisiert wie beim Encoder. Anhand der Daten aus dem Bitstrom bestimmt der Decoder die Startposition im Intervall. Dazu liest er zu Beginn einmalig B Bits ein und weist sie der Variablen diff als bin¨are Zahl zu. Bei aktivierter Option BACK BITS (Datei ac2.h) wird gleichzeitig ein Wert pos = diff initialisiert, der f¨ ur das R¨ uckschreiben von zu viel gelesenen Bits erforderlich ist. Der Decodiervorgang gliedert sich in zwei Schritte. Als erstes erfolgt eine Abbildung (Funktion ac2 get cu()) des aktuellen Codierungsbereiches range auf die kumulativen H¨ aufigkeiten Hrange := range/Hk [K] cu := diff /Hrange . cu zeigt im Bereich der kumulativen H¨aufigkeiten genau auf die Position, die durch das aktuelle Symbol festgelegt ist. Mit Hilfe der folgenden Schleife wird dieses Symbol ermittelt i := K − 1 % beginne Suche beim letzten Symbol s[K − 1] while (cu < Hk [i]) {i := i − 1} % suche, solange Bedingung erf¨ ullt ist . Das Symbol s[i] ist damit bekannt und kann ausgegeben werden. Die neuen Intervallparameter lassen sich mit diff
:=
range :=
diff − Hrange · Hk [i]
und Hrange · (Hk [i + 1] − Hk [i])
berechnen. Die Reskalierung des Codierungsintervalls ist nur noch an eine Bedingung gekn¨ upft (Abb. 4.13). Falls die Option BACK BITS gesetzt ist, wird auch die momentane
58
4 Entropiecodierung
while(range ≤ Q1) { range := 2 · range % diff := 2 · low + next bit() % }
Skalierung des Codierungsintervalls skaliere Differenz und lese neues Bit
Abbildung 4.13: Programmschleife zur Aktualisierung der Intervallparameter und zum Einlesen von neuen Daten aus dem Bitstrom (Variante 2)
Position im Intervall pos aktualisiert (Funktion ac2 decode). Auch der Abschluss der Decodierung ist von dieser Option abh¨ angig. Es wird gegebenenfalls anhand von pos die Zahl von Bits bestimmt, die der Encoder am Ende ausgegeben hat. Alle irrelevanten Bits m¨ ussen dann in den Bitstrom zur¨ uck geschrieben werden und stehen somit f¨ ur nachfolgende Bit-Leseoperationen zur Verf¨ ugung. Das im Anhang abgedruckte Programm nutzt eine voll-adaptive Codierung (siehe Abschnitt 4.9.5). Die Codierungsergebnisse sind deshalb nicht durch die in Gleichung (2.2) definierte Signalentropie unabh¨ angiger Symbole begrenzt. Das Kompressionsverh¨altnis h¨ angt nicht nur von der Statistik der Symbole, sondern auch von ihrer Reihenfolge ab. Untersuchungen haben ergeben, dass bei der Kompression von fotografischen Bildern mit einer typischen Entropie von H(X) > 7 bit die codierten Bitstr¨ome der arithmetischen Codierung nach Variante 2 um etwa 6 Prozent gr¨oßer sind als bei Variante 1. Die Kompressionszeiten reduzieren sich daf¨ ur um ca. 24% bei der Encodierung und ca. 34% bei der Decodierung. Die Angaben beziehen sich dabei ausschließlich auf die Routinen der Codierung. Die Modelladaptation, das Einlesen und das Ausgeben von Bits wurden nicht ber¨ ucksichtigt. Verzichtet man auf die Option BACK BITS, so kann die Decodierungzeit sogar auf etwa 43% der Zeit von Variante 1 gesenkt werden. Der Bitstrom wird dadurch um B −3 bis B −1 Bits l¨ anger, was bei gr¨oßeren Datenmengen nicht ins Gewicht f¨allt. Die Kompressionsverh¨ altnisse und die Zeiten wurden empirisch ermittelt und k¨onnen im Einzelfall von den angegebenen Werten abweichen. Das Modul zur Modelladaptation und die Input/Output-Routinen (bit in.c, bit out.c) sind nicht f¨ ur eine schnelle Verarbeitung optimiert. Das Inkrementieren der H¨aufigkeiten in update model() nimmt aufgrund der großen Zahl von verschiedenen Symbolen sehr viel Zeit in Anspruch. Wenn man die Symbole nach ihrer Auftretenswahrscheinlichkeit sortiert (beginnend mit den seltenen), kann die Modellanpassung beschleunigt werden, da der Schleifendurchlauf in Zeile 49 dann im statistischen Mittel k¨ urzer wird. Die Ein- und Ausgabe der Bits wurde so gestaltet, dass bis zu 25 Bits gleichzeitig in den Strom geschrieben bzw. ausgelesen werden k¨ onnen. Da die arithmetische Codierung jedoch nur einzelne Bits produziert, ist eine Beschleunigung dieser Operationen durch die Beschr¨ankung auf einzelne Bits m¨ oglich. Lediglich die Routinen start decode() und finish decode() nutzen Multibit-Operationen.
4.8 Arithmetische Codierung
59 A
A
A:=A-p(LPS)
MPS
MPS
MPS
MPS
A=0.75
A:=p(LPS)
0
LPS
0
LPS
0
LPS
0
LPS
p(LPS)
Abbildung 4.14: Bin¨ are arithmetische Codierung ohne H¨aufigkeitsadaptation
4.8.3
Bin¨ are arithmetische Codierung
Die bin¨ are arithmetische Codierung ist eine spezielle Codierungsform, die lediglich zwei Symbole unterscheidet. Das Wahrscheinlichkeitsintervall besteht nur aus zwei Teilintervallen (Abb. 4.14). Dem unteren Teilintervall wird das Symbol mit geringerer Wahrscheinlichkeit zugewiesen (engl.: less probable symbol . . . LPS) und dem oberen das wahrscheinlichere (engl.: more probable symbol . . . MPS). Eine feste Zuordnung der Symbole s1 = 0 und s2 = 1 gibt es nicht. Im Laufe der Codierung k¨onnen sie abh¨angig von der aktuellen H¨ aufigkeitsverteilung ihre Intervallzugeh¨origkeit tauschen. Der Vorteil der bin¨aren Codierung liegt neben dem ausschließlichen Verwenden von Festkomma-Operationen im Vermeiden von Divisionen. Die Intervallsegmentierung wird durch vordefinierte Werte approximiert. Dadurch verringert sich zwar die Genauigkeit der Intervallaufteilung, die Adaptation ist dadurch jedoch wesentlich schneller als bei einer normalen arithmetischen Codierung. Der erste, auf eine effiziente Implementierung in Soft- und Hardware gerichtete Algorithmus wurde in [Pen88] als so genannter Q-Coder vorgestellt. Eine Modifikation davon (QM-Coder) ist z.B. im Kompressionsstandard JPEG [ISO92] als Alternative zur Huffman-Codierung definiert. Allerdings wird die arithmetische Codierung aufgrund von patentrechtlichen Lizenzbestimmungen nur selten verwendet. Die folgende Beschreibung bezieht sich auf eine neuere Variation (MQ-Coder), die z.B. im neuen Standard JPEG 2000 [ISO04b] zum Einsatz kommt. Die obere Grenze des Codierungsintervalls ist mit 0.75 ≤ A < 1.5 festgelegt. A wird mit hexadezimal 0x8000 (=0.75) ˆ initialisiert und w¨ahrend der Codierung verdoppelt, sobald der Wert unter 0x8000 f¨ allt. Sei p(LPS) die Wahrscheinlichkeit des LPS-Symbols, dann ergeben sich die Breiten der beiden Teilintervalle zu A − (p(LPS) · A) Teilintervall f¨ ur MPS . p(LPS) · A Teilintervall f¨ ur LPS
(4.17)
60
4 Entropiecodierung
Da A ungef¨ ahr gleich Eins ist, kann man die Intervallgrenzen mit A − p(LPS) p(LPS)
Teilintervall f¨ ur MPS Teilintervall f¨ ur LPS
(4.18)
approximieren. Ein Coderegister C nimmt die Information der bin¨aren Entscheidungen auf. Bei Codierung eines MPS wird der Wert von p(LPS) zum Register addiert und das Intervall mit A := A−p(LPS) verkleinert. Die Codierung eines LPS l¨asst das Coderegister unver¨ andert, setzt das Codierungsintervall aber auf A := p(LPS). Falls ein Renormalisieren des Intervalls notwendig ist (A < 0.75), werden sowohl das Intervall als auch das ¨ Coderegister verdoppelt. Zur Vermeidung eines Uberlaufs wird aus dem Coderegister regelm¨ aßig ein Byte in den Bitstrom geschrieben. Die Adaptation der Symbolverteilung erfordert im Gegensatz zur normalen arithmetischen Codierung kein Z¨ ahlen der Symbole (siehe auch Abschnitt 4.9.5). Abh¨angig vom aktuellen Wert p(LPS) und dem soeben codierten Symbol wird eine neue Wahrscheinlichkeit p(LPS) festgelegt. Dies ist in Abbildung 4.14 nicht dargestellt. Die adaptive Intervallaufteilung kann dazu f¨ uhren, dass das LPS-Intervall gr¨oßer wird als das MPS-Intervall. Wenn zum Beispiel p(LPS) = 0.5 und A = 0.75 sind, dann f¨ uhren die Gleichungen (4.18) auf Werte von 0.25 f¨ ur MPS (ein Drittel des Intervalls) und 0.5 f¨ ur LPS (zwei Drittel). In diesem Fall muss die Symbolzuordnung MPS/LPS vertauscht werden. Eine ausf¨ uhrliche Beschreibung des MQ-Coders ist zum Beispiel in [Tau02] zu finden.
4.9
Codierungsadaptation
Die Beispiele zur Pr¨ afix- und arithmetischen Codierung in den vorangegangenen Abschnitten gingen stets davon aus, dass die Verteilung der Symbole a priori bekannt ist. Dies stellt nat¨ urlich einen idealisierten Fall dar. Sowohl dem Encoder als auch dem Decoder standen fixierte, identische H¨ aufigkeitsmodelle zur Verf¨ ugung, man spricht von einer nicht-adaptiven Codierung. In der Praxis sind die Symbolwahrscheinlichkeiten oft ungewiss und ¨ andern sich sogar innerhalb des Signals. Um eine hohe Kompressionsleistung zu erreichen, m¨ ussen adaptive Verfahren eingesetzt werden.
4.9.1
Semi-adaptive Anpassung von Pr¨ afixcodes
Eine einfache Anpassung der Codes an die Symbolstatistik erreicht man durch eine semiadaptive Codierung. Dazu sind zwei Durchl¨aufe notwendig. Im ersten Schritt werden alle Symbole gez¨ ahlt und eine Verteilungsstatistik aufgestellt. Darauf aufbauend wird ein Code konstruiert und zum Decoder u ¨ bertragen. Dies vergr¨oßert die zu sendende Datenmenge und lohnt sich deshalb nur, wenn die erh¨ohte Effizienz den Aufwand mindestens ausgleicht. Im zweiten Schritt verf¨ ugen Encoder und Decoder u ¨ ber identische Codetabellen und die eigentliche Codierung der Symbole kann erfolgen. Bei der semi-adaptiven Codierung geht man von einer station¨aren Quelle aus, d.h. es wird angenommen, dass sich die Symbolwahrscheinlichkeiten innerhalb des Signals nicht
4.9 Codierungsadaptation Wetter Sonne Wolken Regen Schnee
61 ganzes Jahr 0.5 0.25 0.125 0.125
Sommer 0.5 0.25 0.25 0.0
Winter 0.5 0.25 0.0 0.25
Tabelle 4.17: Unterteilung der Symbolwahrscheinlichkeiten mit Hilfe von a-priori-Information andern. Wenn die Signaleigenschaften variieren, sollte das Signal abschnittsweise verar¨ beitet werden. In regelm¨ aßigen oder durch den Encoder signalisierten Abst¨anden werden die H¨ aufigkeiten neu ermittelt, ein neuer Codebaum erzeugt und an den Decoder gesendet.
4.9.2
Kontextbasierte Codierung
4.9.2.1
Tabellenumschaltung
¨ Wenn die zus¨ atzliche Ubermittlung der Codestruktur zu aufwendig erscheint, ist auch eine Mischung zwischen nicht-adaptiver und semi-adaptiver Codierung m¨oglich. Dabei werden fest vorgegebene (statische) Codetabellen verwendet, von denen jeweils eine f¨ ur die Codierung des n¨ achsten Signalabschnitts ausgew¨ahlt wird. Basis f¨ ur die Auswahl ist das Z¨ ahlen der H¨ aufigkeiten der Symbole und die Berechnung der daraus resultierenden mittleren Codewortl¨ angen. Es wird jene Tabelle verwendet, welche die h¨ochste Kompression erwarten l¨ asst. Als Seiteninformation muss dann nur die Nummer der ausgew¨ ahlten Tabelle gesendet werden. Voraussetzung f¨ ur eine erfolgreiche Kompression nach diesem Verfahren sind a-priori-Kenntnisse u ¨ ber typische H¨aufigkeitsverteilungen, auf deren Grundlage die Codes vorbereitet werden. Der Meteorologe aus Kapitel 2 hatte eine Tabelle mit einer durchschnittlichen Jahresverteilung der vier Wetterzust¨ ande benutzt. Er k¨onnte aber auch stattdessen zwei Tabellen verwenden, welche unterschiedliche Wahrscheinlichkeiten f¨ ur die Jahreszeiten Sommer und Winter enthalten (Tab. 4.17). In Abh¨angigkeit vom Kontext Jahreszeit“ schaltet ” er zwischen zwei Modellen mit unterschiedlichen H¨aufigkeitsverteilungen um. Unter der Voraussetzung, dass sowohl der Meteorologe als auch seine Zentrale wissen, wann die Wechsel der Jahreszeiten stattfinden, ist nicht einmal die zus¨atzliche Information u ¨ber die verwendete Tabelle erforderlich. W¨ ahrend die Signalentropie nach Gleichung (2.2) f¨ ur das gesamte Jahr H(Jahr) = 1.75 bit/Symbol betr¨agt, reduziert sie sich f¨ ur die angegebenen Beispielverteilungen auf H(Sommer) = H(Winter) = 1.5 bit/Symbol. Die mittlere Jahresentropie hat also nur noch einen Wert von 1.5 bit/Symbol. Dieses Prinzip nennt man kontextadaptiv und man spricht auch von einer Kontextmodellierung. Der Kontext beschreibt die aktuelle Situation (z.B. die Jahreszeit), auf deren Basis Codes ausgew¨ahlt und Verteilungsstatistiken adaptiv nachgef¨ uhrt werden. Je mehr Kontexte man verwendet, desto genauer kann die Beschreibung erfolgen. Bei zu vielen Kontexten stellt sich jedoch das Problem ein, dass die Adaptation an die tats¨achliche Symbolverteilung viel zu langsam ist, weil es einfach zu wenige Ereignisse pro Kontext gibt. M¨ochte der Meteorologe jede Woche (oder sogar jeden Tag) eine andere (und m¨oglichst sehr gut angepasste)
62
4 Entropiecodierung
Verteilung ausw¨ ahlen, muss er schon auf den hundertj¨ahrigen Kalender zur¨ uckgreifen um statistisch gesicherte Aussagen machen zu k¨onnen. Das Prinzip der Tabellenumschaltung wird implizit auch f¨ ur die Golomb- und Rice-Codes verwendet. Die Parameter m bzw. k (siehe Abschnitte 4.5.1 und 4.5.2) m¨ ussen lediglich auf Basis der Verteilung von bereits codierten Signalwerten ausgew¨ahlt werden. Bei der Rice-Codierung ist dies besonders einfach, da k + 1 mit der Anzahl von Bits korrespondiert, die f¨ ur eine Codierung des Signalwertes ausreicht, ohne dass eine Folge von 1-Bits angeh¨ angt werden muss. Ist die Gr¨ oßenordnung des n¨achsten Wertes x ungef¨ahr bekannt, k¨ onnte man k = log2 x w¨ ahlen. Besonderheit bei Rice-Codes Aufgrund von schwankenden Signaleigenschaften kann es vorkommen, dass der Codierungsparameter k sehr klein gew¨ahlt wird (z.B. k = 2), der tats¨achlich zu codierende Wert aber sehr groß ist (z.B. x = 131). Das Rice-Codewort w¨ urde sich aus den untersten k = 2 Bits und einer Folge von (131 >> 2) + 1 = 32 + 1 Bits zusammensetzen. Dieses Codewort w¨are unverh¨altnism¨aßig lang. F¨ ur solche F¨alle k¨ onnte ein Ausnahmebehandlung aktiviert werden, welche die Codewortl¨ange auf einen maximalen Wert begrenzt. Angenommen, f¨ ur den zweiten Teil der Codierung d¨ urfen h¨ ochstens 8 Bits verwendet werden, d.h. eine Folge von maximal sieben 1-Bits plus einem abschließenden 0-Bit. Reicht dies wie im Beispiel nicht aus, werden acht Einsen ausgegeben, die sozusagen als ESCAPE-Symbol dienen und dem Decoder eine Ausnahmebehandlung signalisieren. Anschließend kommt der tats¨achliche, uncodierte Wert. Die Anzahl der hierf¨ ur einzusetzenden Bits h¨angt vom Wertebereich von x ab, der sowohl dem Encoder als auch dem Decoder bekannt sein muss. 4.9.2.2
Kontextquantisierung
Die kontextbasierte Verzweigung der Verarbeitung ist sehr effektiv, bringt aber auch Probleme mit sich. In der Bildkompression ist es zum Beispiel u ¨blich, benachbarte Grauwerte (oder Differenzen davon) als Kontext zu w¨ahlen. Abh¨angig von der Anzahl n der Nachbarn, die man verwenden m¨ ochte, ergeben sich bei 8 Bits pro Bildpunkt 256n verschiedene Kontexte. Schon drei Nachbarn w¨ urden einen Kontextraum aufspannen, der bei durchschnittlich großen Bildern nicht mehr sinnvoll mit Leben (mit statistisch gesicherten Daten) erf¨ ullt werden kann. Um trotzdem mehrere Nachbarbildpunkte einsetzen zu k¨ onnen, ist eine Kontextquantisierung n¨otig, welche ¨ahnliche Kontexte zusammenfasst. Genau genommen handelt es sich hierbei um ein Problem der Vektorquantisierung (siehe Abschnitt 3.2.2), wobei jeder Wert eines Nachbarn einem Element des Vektors entspricht. In schnellen Applikationen reduziert man die Vektorquantisierung auf eine Kombination von n skalaren Quantisierern. Dieser Weg wird zum Beispiel im Kompressionsstandard JPEG-LS beschritten [ISO00c] (siehe Abschnitt 9.3.2.3). Drei ausgew¨ahlte Grauwertdifferenzen d1 , d2 , d3 werden unabh¨angig voneinander auf jeweils ein von neun Intervallen q1 , q2 , q3 eines ungleichm¨ aßigen skalaren Quantisierers abgebildet. Die Nummer des repr¨ asentativen Rekonstruktionsvektors (bzw. des Kontexts) ergibt sich z.B. aus der Kombination q = 9 · (9 · q1 + q2 ) + q3 .
4.9 Codierungsadaptation
4.9.3
63
Anpassung durch Sortieren
Wenn man kein Wissen dar¨ uber hat, welches Symbol h¨aufiger als ein anderes vorkommt, ist es schwer, im Voraus Codetabellen zu definieren. Eine L¨osung dieses Problems besteht im Z¨ ahlen der Symbole w¨ ahrend der Codierung. Begonnen wird mit einer Gleichverteilung der Symbole (H(si ) = 0, ∀ i). Man tr¨ agt die Symbole si entsprechend ihres Index in eine Tabelle ein und ordnet jeder Tabellenposition ein Codewort zu. Die Codew¨orter k¨ onnen auf angenommenen Verteilungen basieren. F¨ ur die Codierung des Symbols sk wird das entsprechende Codewort ck verwendet. Die Codew¨orter sind dabei so angeordnet, dass das k¨ urzeste immer oben und das l¨angste immer unten in der Tabelle steht (z.B. kanonische Codes). Sobald ein Symbol gesendet wurde, erh¨oht sich seine H¨aufigkeit um Eins. Hat es dadurch eine gr¨ oßere H¨ aufigkeit als sein Vorg¨anger, vertauschen sie ihre Positionen in der Symboltabelle usw. In einigen Anwendungen ist es auch vorteilhaft, das zuletzt codierte Symbol sofort an die Spitze zu stellen (engl.: MTF . . . Move To Front), wenn man davon ausgehen kann, dass dieses Symbol in K¨ urze wieder auftaucht. Beispiel Eine Signalquelle mit einem Symbolalphabet {a, b, c, d} produziere zum Beispiel eine Zeichenfolge baaacb“ und die Symbolliste sei in der Reihenfolge abcd initialisiert. ” Der MTF-Encoder ersetzt jedes Zeichen durch dessen jeweils aktuellen Index und setzt das Zeichen an die Spitze. Die Ausgabe lautet also 110021“ und die Symbole ” stehen abschließend mit der Reihenfolge bcad in der Liste. Diese Operationen werden von En- und Decoder synchron ausgef¨ uhrt. Dadurch ist gew¨ahrleistet, dass die h¨ aufigsten Zeichen immer an der Spitze der Tabelle stehen und mit den k¨ urzesten Codew¨ ortern korrespondieren. Bei diesem Verfahren ist das Z¨ahlen im Voraus nicht erforderlich und die Codierung kann sofort beginnen. Nachteilig ist die verz¨ogerte Anpassung, da die Symbole zu Beginn der Codierung noch nicht sortiert sind und unter Umst¨ anden mit ung¨ unstigen Codew¨ ortern u ¨bertragen werden. Auch eine Kombination von Symbolsortierung und Modellumschaltung ist denkbar. Pr¨agt sich im Laufe der Codierung eine Symbolverteilung heraus, f¨ ur die der momentane Code keine effiziente Kompression realisieren kann, schalten Encoder und Decoder gleichzeitig auf eine andere, besser geeignete Codetabelle.
4.9.4
Voll-adaptive Anpassung von Pr¨ afixcodes
Von einer voll-adaptiven Codierung spricht man bei einer Neuberechnung des Codebaums ¨ nach Ubertragung eines jeden Symbols. Dieses Verfahren wird auch als dynamische Codierung bezeichnet [Vit85, Vit89]. Sie wird hier aber nicht weiter diskutiert, da eine st¨ andige Neuberechnung des Codebaums trotz ausgefeilter Implementierungen relativ langsam ist. F¨ ur die voll-adaptive Arbeitsweise ist statt dessen eine arithmetische Codierung zu empfehlen.
4.9.5
Adaptation der arithmetischen Codierung
Die arithmetische Codierung ist f¨ ur eine voll-adaptive Anpassung an die Signalstatistik regelrecht pr¨ adestiniert. Eine Betrachtung von semi-adaptiven Methoden er¨ ubrigt sich deshalb.
64
4 Entropiecodierung
In den Beispiel-Quelltexten im Anhang D.1 wird bereits eine voll-adaptive Codierung eingesetzt. Jeder Codierschritt ist neben dem aktuellen Zeichen nur von den kumulativen H¨ aufigkeiten abh¨ angig, die in Hk [i] gespeichert sind (siehe Abschnitt 4.8.1). W¨ahrend der Codierung ist es m¨ oglich, die H¨ aufigkeiten nach jedem Symbol zu aktualisieren. Eine Konstruktion von Codes ist hier nat¨ urlich nicht erforderlich, sodass sofort und ohne weiteren Aufwand mit der neuen Symbolverteilung gearbeitet werden kann. In der Routine start model() (Anhang D.1.1) werden die kumulativen H¨aufigkeiten initialisiert. Der implementierte Algorithmus der arithmetischen Codierung erfordert eine Mindesth¨ aufigkeit von H(si ) = 1, ∀i. Nach Codierung jedes Zeichens inkrementiert die Funktion update model() die H¨ aufigkeit des aktuellen Symbols und modifiziert alle betroffenen kumulativen H¨ aufigkeiten. Bei Erreichen des maximal zul¨assigen Wertes f¨ ur Hk [K] werden alle Symbolh¨ aufigkeiten halbiert und die kumulativen Werte neu berechnet. Besonders leistungsf¨ ahig ist die voll-adaptive arithmetische Codierung in Kombination mit einer Modellumschaltung, die im vorangegangenen Abschnitt bereits am Beispiel der Jahreszeiten erl¨ autert wurde. En- und Decoder treffen in Abh¨angigkeit von vorangegangenen Ereignissen und anderer Bedingungen (=Kontext) synchron eine Entscheidung, welches Verteilungsmodell (welche kumulativen H¨aufigkeiten) als n¨achstes benutzt wird. Wenn zum Beispiel aufgrund des aktuellen Kontexts die Wahrscheinlichkeit des Symbols a“ sehr groß ist, wird dessen absolute H¨aufigkeit in dem zugeh¨origen Verteilungsmo” dell schneller wachsen als die der anderen Symbole. Infolge der Ungleichverteilung sinkt die Entropie und das erzielbare Kompressionsverh¨altnis wird gr¨oßer. Liegt ein anderer Kontext vor, ist eventuell ein anderes Symbol das h¨aufigste. Die H¨aufigkeitsverteilungen passen sich durch die adaptive Codierung den jeweiligen Kontexten an. Im Anhang D.1.4 sind die Hauptroutinen f¨ ur die En- und Decodierung nach Variante 2 mit einer sehr einfachen, kontextabh¨ angigen Modellumschaltung aufgelistet. Die Wahl eines Verteilungsmodells h¨ angt dabei lediglich davon ab, ob das vorangegangene Zeichen gr¨ oßer als 127 war oder nicht. Falls benachbarte Symbole im statistischen Mittel u ahnliche Werte haben, erzielt diese simple Methode eine Steigerung des ¨berwiegend ¨ Kompressionsverh¨ altnis gegen¨ uber einer einfachen arithmetischen Codierung.
4.10
Codierung von sehr großen Symbolalphabeten
Die Codierung eines sehr umfangreichen Symbolalphabets kann in verschiedener Hinsicht problematisch sein. Es sei zum Beispiel angenommen, dass eine Verarbeitungsstufe Signalwerte mit einer Aufl¨ osung von 16 Bits liefert, die entropiecodiert werden sollen. Das w¨ urde f¨ ur eine Huffman-Codierung eine Codetabelle mit 216 Eintr¨agen bedeuten. Die Codierung mit einer solch riesigen Tabelle ist sehr zeitaufwendig und unhandlich. Eine arithmetische Codierung w¨ are erst gar nicht m¨oglich, wenn die Verarbeitungsbreite auf B = 16 Bits beschr¨ ankt ist. F¨ ur jedes Symbol muss eine H¨aufigkeit von mindestens 1 garantiert sein, was zu einer maximalen kumulativen H¨aufigkeit Hk [K] ≥ 216 f¨ uhrt. Die Bedingung Hk [K] ≤ Q1 w¨ are somit nie erf¨ ullbar (vgl. Seite 50). Das zweite Problem ergibt sich aus der Tatsache, dass sich nur dann eine ausgepr¨agte Verteilung der Symbole einstellt, wenn die Anzahl der zu codierenden Zeichen deutlich
4.10 Codierung von sehr großen Symbolalphabeten
65
N = 3100, K = 31
N = 310, K = 31
0.12
0.12
0.1
0.1
0.08
0.08
0.06
0.06
0.04
0.04
0.02
0.02
0 −4
−2
a)
0 σ
2
0 −4
4
−2
b)
N = 31, K = 31 0.2
0.15
0.15
0.1
0.1
0.05
0.05
c)
−2
0 σ
2
4
2
4
N = 10, K = 31
0.2
0 −4
0 σ
2
0 −4
4
d)
−2
0 σ
Abbildung 4.15: Auspr¨ agung der korrekten Verteilung von K = 31 Symbolen in Abh¨ angigkeit von der Gesamtanzahl N der Werte gr¨ oßer ist als die Symbolmenge des aktuellen Alphabets. Ansonsten werden die meisten Symbole nur ganz selten oder u ¨ berhaupt nicht auftreten. Eine effiziente Entropiecodierung ware Abbildung 4.15 veranschaulicht diesen Effekt anhand der ¨ nicht moglich. ¨ noch relativ kleinen Anzahl von K = 31 verschiedenen Symbole, welche einer GaußVerteilung folgen. Es wurden zufallig N = 10, 31, 310 oder 3100 Werte gezogen und ¨ deren H¨ aufigkeitsverteilung im Balkendiagramm dargestellt Nur wenn die Gesamtzahl N der Symbole sehr groß gegen¨ uber der Anzahl K verschiedener Symbole ist (in diesem Fall N = 100 · K), bildet sich eine typische Verteilung heraus. Dieses Problem ist l¨ osbar, wenn man die Symbole eines großen Alphabets in Gruppen aufteilt. Die Nummern dieser Gruppen bilden ein neues Alphabet. Die Codierung gliedert sich nun in zwei Stufen. Erst wird die Gruppennummer verarbeitet und anschließend muss ein Index gesendet werden, der das zu u ¨ bertragende Symbol in der Gruppe identifiziert. Da die Anzahl der Symbole innerhalb einer Gruppe immer noch sehr groß sein kann, wird der Index direkt, mit einer festen Anzahl von Bits, gesendet. Die Gruppenaufteilung sollte deshalb so erfolgen, dass die Symbole innerhalb einer Gruppe ungef¨ahr die gleiche Auftretenswahrscheinlichkeit haben. Abbildung 4.16 zeigt zwei M¨ oglichkeiten zur Aufteilung der Symbole in Abh¨angigkeit ihrer H¨ aufigkeitsverteilung H(si ). In Variante a) wurde eine gleichm¨aßige Unterteilung
66
4 Entropiecodierung
H(si )
H(si)
a)
0
1
2
3
si
0 1 2
b)
3
4
si
Abbildung 4.16: Beispiele f¨ ur die Aufteilung von großen Symbolalphabeten in Symbolgruppen Kategorie 0 1 2 3
Bereich 0, . . . , N − 1 N, . . . , 2N − 1 2N, . . . , 3N − 1 3N, . . . , 4N − 1
Code 001 1 01 000
Anzahl Folgebits log2 N
Tabelle 4.18: Beispiel f¨ ur die Codierung von großen Symbolalphabeten mit gleichm¨aßiger Gruppenaufteilung gew¨ ahlt, w¨ ahrend in Variante b) die Gruppenbildung an die logarithmische Symbolverteilung angepasst ist. Wie nun die Codierung erfolgt, soll am Beispiel einer Huffman-Codierung erl¨autert wer¨ den. Tabelle 4.18 enth¨ alt eine Ubersicht f¨ ur die Variante a). Jeder der vier Gruppen wird ein Codewort entsprechend der Gruppenh¨aufigkeiten (= Summe der Symbolh¨ aufigkeiten innerhalb jeder Gruppe) zugewiesen. Wenn in jeder Gruppe N Symbole ¨ sind, k¨ onnen durch die Ubertragung des Gruppencodes die Teilbereiche [0; N − 1] bis [3N ; 4N − 1] unterschieden werden. Zur Identifizierung des tats¨achlichen Symbols sind weitere log2 (N ) Bits n¨ otig. Tabelle 4.19 zeigt die Verh¨ altnisse f¨ ur eine logarithmische Verteilung der Symbole. Damit die Verteilung der Symbole in jeder Gruppe in etwa konstant ist, werden die Gruppenbreiten ebenfalls in logarithmischer Abstufung festgelegt. Abh¨angig von der Anzahl der Symbole pro Gruppe variiert die Anzahl der f¨ ur den Index n¨otigen Folgebits. Kategorie 0 1 2 3 4
Bereich 0 1 2, 3 4, . . . , 7 8, . . . , 15
Code 11 10 01 001 000
Anzahl Folgebits 0 0 1 2 3
Gesamtl¨ange li 2 2 3 5 6
Tabelle 4.19: Beispiel f¨ ur die Codierung von großen Symbolalphabeten mit logarithmischer Gruppenaufteilung
4.10 Codierung von sehr großen Symbolalphabeten
67
Die Gruppen 0 und 1 enthalten jeweils nur ein Symbol, also sind keine weiteren Bits zu senden. F¨ ur die anderen Gruppen steigert sich die Zahl der Folgebits. Die Gesamtl¨ange ist ebenfalls in der Tabelle enthalten und ergibt sich aus dem Huffman-Codewort der Gruppe plus der Folgebits. Nun erhebt sich die Frage, ob der Codeentwurf aufgrund der Folgebits modifiziert werden muss. Ziel ist die Minimierung der mittleren Codewortl¨ange l= pg · (lg + log2 (Ng )) =⇒ Min , g
die sich aus den Auftretenswahrscheinlichkeiten pg aller Gruppen g, der zugeh¨origen Gruppencodewortl¨ ange lg und der Zahl der Folgebits log2 (Ng ) ergibt. Mit Ng ist die Anzahl der Symbole in einer Gruppe bezeichnet. Die Gleichung kann umgeformt werden in l= pg · lg + pg · log2 (Ng ) =⇒ Min . g
g
Der zweite Summand hat unabh¨ angig vom Gruppencode einen konstanten Wert. Die Optimierung des Codes h¨ angt also ausschließlich von den Gruppenwahrscheinlichkeiten ab, die Folgebits m¨ ussen nicht ber¨ ucksichtigt werden. Wenn es nicht gelingt, Gruppen mit einer ungef¨ahren Gleichverteilung von Symbolen zu bilden, kann eine dritte Variante in Betracht gezogen werden. Man unterteilt das Alphabet in zwei Gruppen. Die erste, kleinere Gruppe enth¨alt die h¨aufigsten Symbole, die restlichen ordnet man der zweiten Gruppe zu. Lediglich die Symbole der ersten Gruppe werden mit Codew¨ ortern variabler L¨ange u ¨ bertragen. Wenn ein Symbol der zweiten Gruppe auftaucht, muss dies durch ein ESCAPE-Symbol signalisiert werden. Dies ist ein zus¨ atzliches Symbol, das ebenfalls der ersten Gruppe angeh¨ort. Empf¨angt der Decoder dieses ESCAPE-Symbol, weiß er, dass ein Zeichen der zweiten Gruppe folgt, welches man mit einer festen Codewortl¨ ange u ¨bermittelt. Es ist aber auch eine erneute Gruppenbildung in den beiden oben beschriebenen Varianten denkbar. Gegeben seien zum Beispiel 512 Zeichen, wobei die ersten sechzehn (0. . . 15) hohe Auftretenswahrscheinlichkeiten haben. Inklusive des ESCAPE-Symbols muss ein Code mit 17 Codew¨ ortern bereitgestellt werden. Die Symbole 0 bis 15 werden im Codierungsprozess durch ihre Huffman-Codes ersetzt. F¨ ur die anderen wird zuerst das ESCAPE-Codewort gesendet, dann folgen beispielsweise 9 Bits zur Identifizierung des tats¨achlichen Zeichens. Unproblematisch in der Verarbeitung von sehr großen Symbolalphabeten sind Codes, die keinen abgeschlossenen Umfang haben, wie zum Beispiel die Golomb- und Rice-Codes sowie der UVLC (Abschnitt 4.5). Jeder beliebigen Zahl (Symbol) kann ein Codewort zugewiesen werden. Die Effizienz h¨ angt hierbei allerdings von der geschickten Wahl des Codierungsparameters (Auswahl der Codetabelle) bzw. von der sinnvollen Zuordnung von Symbol und Codewort (beim UVLC) ab.
68
4 Entropiecodierung
4.11
Testfragen
4.1 Eine Quelle produziert die Symbole a, b, c, d, e und f. Die entsprechenden Auftretenswahrscheinlichkeiten sind 0.05, 0.15, 0.05, 0.4, 0.2 und 0.15. a) Wie groß ist die Redundanz ΔR0 der Quelle? b) Welche Codierungsredundanz ΔR(X) verbleibt nach einer Huffman-Codierung? c) Wie hoch ist das Kompressionsverh¨altnis nach b) in Bezug auf eine FLC-Codierung? 4.2 Stellen Sie fest, ob die folgenden Codes eindeutig decodierbar sind: a) {0, 01, 11, 111} d) {0, 10, 110, 111}
b) {0, 11, 110, 111} e) {1, 10, 110, 111}
c) {11, 10, 000, 011, 010} f) {00, 10, 11, 011, 010}
4.3 a) Wie lautet das Rice-Codewort f¨ ur die Zahl 65, wenn der Codierungsparameter auf k = 4 gesch¨ atzt wurde? b) Ist k = 4 die beste Sch¨ atzung f¨ ur ´65’ ? 4.4 Gegeben ist eine Sequenz von vier Symbolen ‘abcd’. Die Auftretenswahrscheinlichkeiten sind pa = 0.4, pb = 0.2, pc = 0.1, pd = 0.3. a) F¨ uhren Sie eine arithmetische Encodierung der Sequenz durch mit einer internen Aufl¨ osug von B = 7. b) Decodieren Sie das Resultat von a). 4.5 Gegeben ist eine Bitfolge 0000 0010 1011 111“ eines arithmetischen Codes (mit ” pa = 0.1, pb = 0.1, pc = 0.2, pd = 0.6, B = 6) a) Decodieren Sie den Bitstrom vollst¨andig. b) Encodieren Sie die ersten vier Symbole von a). 4.6 Eine Signalquelle produziert f¨ unf verschiedene Symbole mit folgenden Eigenschaften: a und c haben die gleiche Auftretenswahrscheinlichkeit, die Wahrscheinlichkeit von d ist doppelt so hoch wie die von b, im statistischen Mittel ist jedes zweite Symbol ein e und in einer repr¨ asentativen Stichprobe von 10000 Symbolen tauchte a 625 mal auf. Abh¨ angigkeiten zwischen den Symbolen sind nicht bekannt. a) Stellen Sie einen Code mit Codew¨ortern fester L¨ange auf. Wie groß ist die Codierungsredundanz? b) Konstruieren Sie einen Code mit variablen L¨angen f¨ ur diese Symbolmenge. c) Wie groß ist das Kompressionsverh¨altnis bei einer Codierung mit diesem Code? d) Gibt es eine M¨ oglichkeit zur Entropiecodierung, die f¨ ur dieses Alphabet eine h¨ ohere Kompression erzielen kann? Warum? 4.7 Nennen Sie 2 Vorteile und einen Nachteil der arithmetischen Codierung gegen¨ uber der Codewort-basierten Codierung (Huffman, Rice etc.). 4.8 Beschreiben Sie einen Algorithmus zur Decodierung von Huffman-Codes!
69
Kapitel 5
Pr¨ acodierung Die im vorangegangenen Kapitel beschriebenen Verfahren zur Entropiecodierung vermindern die Codierungsredundanz. Dazu wurden lediglich die Wahrscheinlichkeiten oder H¨aufigkeiten einzelner, voneinander unabh¨angiger Symbole ausgenutzt. In der Praxis bestehen zwischen den Symbolen jedoch meist vielf¨altige Beziehungen und Abh¨angigkeiten. Benachbarte Zeichen eines Bildsignals haben zum Beispiel oft einen ¨ahnlichen Wert, das heißt, sie sind miteinander korreliert. Verfahren der Pr¨acodierung (engl.: precoding) haben das Ziel, diese Intersymbolredundanz zu vermindern (Abb. 5.1).
Abbildung 5.1: Unterteilung der Algorithmen zur Pr¨acodierung
5.1
Informationstheoretische Grundlagen
Die Shannon’sche Codierungstheorie besagt, dass die mittlere Codewortl¨ange li immer gr¨ oßer oder mindestens gleich der Signalentropie H(X) ist (Gl. 4.2). Die Berechnung der Entropie (Gl. 2.2) bezieht sich dabei auf Symbole ohne gegenseitige Abh¨angigkeiten. Das Betrachten unabh¨ angiger Ereignisse ist jedoch ein Spezialfall. So besitzt zwar zum Beispiel jeder Buchstabe in der deutschen Sprache seine eigene Auftretenswahrscheinlichkeit, die Zeichen sind aber keineswegs unabh¨angig von den vorausgegangenen Buchstaben. War das letzte Zeichen ein q“, so ist die Wahrscheinlichkeit f¨ ur ein u“ außerordentlich ” ” ¨ hoch, w¨ ahrend das Auftreten von z.B. k“ sehr unwahrscheinlich w¨are. Ahnlich ist es bei ” Zeitsignalen, welche die Information von Schwingungszust¨anden (z.B. einfache Audiosignale) enthalten. Je nach maximaler Signalfrequenz, maximaler Signalamplitude und Abtastperiode, k¨ onnen sich die Amplituden zweier benachbarter Abtastwerte nur um
70
5 Pr¨acodierung
einen bestimmten Betrag unterscheiden. Der Wert zum Abtastzeitpunkt n · T h¨angt vom Wert an der Position (n − 1) · T ab. Anders ist es zum Beispiel bei Bildsignalen. Zwischen zwei benachbarten Bildpunkten gibt es keinen direkten Zusammenhang, weil sie zum gleichen Zeitpunkt aufgenommen sein k¨onnen.1 Eine Aufeinanderfolge von Schwingungszust¨ anden, die eine systembedingte Korrelation aufweisen, ist hierbei nicht gegeben. Benachbarte Punkte sind jedoch indirekt durch das aufgenommene Objekt miteinander verbunden und weisen dann im Allgemeinen eine sehr starke Korrelation auf. Geh¨oren sie nicht zum selben Objekt, sind ihre Helligkeits- oder Farbwerte im Prinzip unabh¨angig voneinander. F¨ ur das genauere Verst¨ andnis sind einige theoretische Betrachtungen erforderlich.
5.1.1
Markow-Modell
Das Markow-Modell ist ein mathematisches Modell zur Beschreibung von aufeinander folgenden Zust¨ anden. Angewendet auf auf eine Informationsquelle, entspricht jedes ausgegebene Symbol einem Zustand. Die Informationsquelle kann in einem Zustand verharren, d.h. immer das gleiche Symbol ausgeben, oder durch Ausgabe eines anderen ¨ Symbols in einen anderen Zustand u ange erfolgen mit bestimm¨ bergehen. Diese Uberg¨ ten Wahrscheinlichkeiten. Die Informationsquelle ist also nicht nur durch die Auftretenswahrscheinlichkeiten p(si ) (= Zustandswahrscheinlichkeiten) gekennzeichnet, son¨ ¨ dern zus¨ atzlich durch Ubergangswahrscheinlichkeiten. Die Ubergangswahrscheinlichkeit p(si |sj ) beschreibt die Auftretenswahrscheinlichkeit des Symbols si unter der Bedingung, dass sj das letzte Symbol war. Sie wird deshalb auch als bedingte Wahrscheinlichkeit be¨ zeichnet. Die Ubergangswahrscheinlichkeiten werden in einer Matrix ⎞ ⎛ p(s1 |s1 ) p(s1 |s2 ) · · · p(s1 |sK ) ⎟ ⎜ ⎜ p(s2 |s1 ) p(s2 |s2 ) · · · p(s2 |sK ) ⎟ (5.1) PT = p(si |sj ) = ⎜ ⎟ .. .. . . .. .. ⎝ ⎠ . . p(sK |s1 ) p(sK |s2 ) · · · p(sK |sK ) zusammengefasst. K bezeichnet die Anzahl verschiedener Symbole. In (5.1) wird die Abh¨ angigkeit des Symbols si von nur einem Vorg¨angersymbol betrachtet. Man spricht von einem Markow-Modell erster Ordnung. F¨ ur eine Informationsquelle mit drei verschie¨ denen Symbolen A, B und C, zum Beispiel, lautet die Matrix der Ubergangswahrscheinlichkeiten ⎞ ⎛ p(A|A) p(A|B) p(A|C) PT = ⎝ p(B|A) p(B|B) p(B|C) ⎠ . (5.2) p(C|A) p(C|B) p(C|C) ¨ Ublich ist die Darstellung in einem Zustandsdiagramm (Abb. 5.2). Befindet sich das System z.B. im Zustand A, dann kann es mit einer bestimmten Wahrscheinlichkeit nach B oder C wechseln oder im Zustand A verbleiben. Die Summe dieser Wahrscheinlichkeiten muss Eins ergeben. Es gilt also p(A|A) + p(B|A) + p(C|A) = 1 1 Dies
h¨ angt nat¨ urlich vom Aufzeichnungsverfahren ab.
(5.3)
5.1 Informationstheoretische Grundlagen
71
p(B|A) p(A|A)
A
B
p(B|B)
p(A|B) p(B|C) p(A|C) p(C|A)
p(C|B)
C p(C|C)
Abbildung 5.2: Markow-Modell 1. Ordnung einer tern¨aren Quelle oder allgemein ausgedr¨ uckt: Die Summen aller Spalten von PT sind gleich Eins K
i=1
p(si |sj ) = 1
∀j = 1, 2, . . . , K .
(5.4)
Markow-Modelle h¨ oherer Ordnung ber¨ ucksichtigen nicht nur einen voran gegangenen Zustand, sondern mehrere. Die Ausgabe eines Symbols s(m+1) h¨angt in einem Modell m-ter Ordnung von der bedingten Wahrscheinlichkeit p(s(m+1) |s(m) . . . s(2) s(1) ) ab. In der deutschen Sprache hat der Buchstabe ‘h’ zum Beispiel eine hohe Wahrscheinlichkeit, wenn das letzte Symbol ‘c’ war. Die Wahrscheinlichkeit erh¨oht sich aber noch, wenn die beiden letzten Symbole ‘sc’ lauten (Modell 2. Ordnung).
5.1.2
Verbundwahrscheinlichkeit
Das gemeinsame, ungeordnete Auftreten von zwei Ereignissen si und sj heißt Verbundereignis und besitzt eine Verbundwahrscheinlichkeit p(si , sj ) = p(sj , si ). Das Gleichheitszeichen gilt jedoch nur, wenn 1. si und sj aus zwei verschiedenen Quellen stammen, zwischen denen es eine Abh¨angigkeit gibt und 2. innerhalb jeder dieser beiden Quellen die Symbole unabh¨angig voneinander sind. Da in unseren Betrachtungen aber immer alle Symbole aus derselben Quelle stammen, spielt die Reihenfolge ihres Auftretens eine wichtige Rolle. Die Kombination ‘qu’ hat eine andere Wahrscheinlichkeit als die Kombination ‘uq’. Zur Kennzeichnung dieses Umstandes wird in den folgenden Betrachtungen bei der Angabe einer Verbundwahrscheinlichkeit das Komma zwischen den Symbolen weggelassen und es gilt im Allgemeinen2 p(sj si ) = p(si |sj ) · p(sj )
=
p(si sj ) = p(sj |si ) · p(si ) .
(5.5)
2 F¨ ur bin¨ are Quellen gilt auch p(AB) = p(BA), weil der Zustand genauso oft von A nach B wechselt wie von B nach A.
72
5 Pr¨acodierung
Die Wahrscheinlichkeit des Verbundes ‘si folgt auf sj ’ ist genauso groß wie die Wahrscheinlichkeit von si unter der Bedingung, dass sj das letzte Symbol war, multipliziert mit der Wahrscheinlichkeit eben dieser Bedingung. ¨ Es ist anzumerken, dass ein System eindeutig durch die Matrix der Ubergangswahrscheinlichkeiten PT bestimmt ist, also auch die Auftretenswahrscheinlichkeiten p(si ), i = 1, 2, . . . , K, der einzelnen Zust¨ ande h¨angen von PT ab. Gesetzt den Fall, dass die Zustandswahrscheinlichkeiten p(si ) nicht bekannt sind, sondern nur die Matrix der ¨ Ubergangswahrscheinlichkeiten PT (5.1): Wie kann man erstere ermitteln? Jedes Symbol si kann in Kombination mit einem Vorg¨angersymbol sj auftreten. Jede dieser Kombinationen besitzt eine bestimmte Verbundwahrscheinlichkeit p(sj si ). Die Summe dieser Verbundwahrscheinlichkeiten ist somit gleich der Einzelwahrscheinlichkeit p(si ) p(si ) =
K
p(sj si )
∀i = 1, 2, . . . , K
(5.6)
∀i = 1, 2, . . . , K .
(5.7)
j=1
und mit (5.5) p(si ) =
K
p(si |sj ) · p(sj )
j=1
Da si und sj aus derselben Informationsquelle kommen, ist die Berechnung nach (5.7) re T kursiv. Unter Verwendung des Spaltenvektors p(si ) = p(s1 ) p(s2 ) · · · p(sK ) lautet die Iteration in Matrixschreibweise3 p(si ) = PT · p(si ) = PT · p(si ) = P2T · p(si ) p(si ) = PT · p(si ) = P3T · p(si ) p(si ) .. . T . (5.8) p(si ) = P∞ T · 10 ···0 ¨ Die unendlich oft mit sich selbst multiplizierte Matrix der Ubergangswahrscheinlichkeiten P∞ ist eine Matrix, deren Spalten alle identisch sind. Jede dieser Spalten entspricht T dem Vektor der Zustandswahrscheinlichkeiten p(si ) . Praktikabler ist allerdings die analytische Berechnung. Dazu wird die rekursive Gleichung von links mit einer Einheitsmatrix I multipliziert und entsprechend umgestellt p(si ) = PT · p(si ) I · p(si ) = PT · p(si ) 0 = (PT − I) · p(si ) . (5.9) 3 Hier wurde impliziert vorausgesetzt, dass es sich um eine ergodische Informationsquelle handelt, d.h. die Zustandswahrscheinlichkeiten h¨ angen nicht vom Startzustand ab. Im Allgemeinen ist diese Eigenschaft gegeben.
5.1 Informationstheoretische Grundlagen
73
Das resultierende Gleichungssystem enth¨alt keine Rekursion mehr, ist aber aufgrund einer linearen Abh¨ angigkeit unterbestimmt. Als zus¨atzliche Bedingung ist deshalb K
p(si ) = 1
i=1
erforderlich. Beispiel: Ein System schwingt zwischen zwei diskreten Zust¨anden S1 und S2 . Die Wahrscheinlichkeiten eines Zustandswechsels sind p(S1 |S2 ) = 0.1 und p(S2 |S1 ) = 0.5. Wie groß ist die Wahrscheinlichkeit, dass sich das System bei einer Stichprobe im Zustand S1 befindet? L¨ osung: 0 = (PT − I) · p(si )
p(S1 ) 0.5 − 1 0.1 · 0 = p(S2 ) 0.5 0.9 − 1 0 = 0.6 · p(S1 ) = p(S1 ) =
−0.5 · p(S1 ) + 0.1 · p(S2 ) = −0.5 · p(S1 ) + 0.1 · (1 − p(S1 )) 0.1 1/6
Die Wahrscheinlichkeit, dass sich das System im Zustand S1 befindet, betr¨agt ein Sechstel. F¨ ur Markow-Quellen h¨ oherer Ordnung ergeben sich nat¨ urlich auch Verbundwahrscheinlichkeiten f¨ ur Kombinationen von mehr als zwei Symbolen. So gilt zum Beispiel: p(ABC) = p(C|AB) · p(AB) = p(C|AB) · p(B|A) · p(A) .
5.1.3
Verbundentropie und bedingte Entropie (X)
Bestehen zwischen den Symbolen des Quellalphabets X= {si |1 ≤ i ≤ K (X) } statistische Bindungen, so ist es m¨ oglich, diese Quellsymbole zusammenzufassen und derart auf neue (Z) Symbole abzubilden, dass die Entropie des neuen Alphabets Z= {si |1 ≤ i ≤ K (Z) } geringer ist als die des Quellalphabets. Die Anzahl der verschiedenen Symbole nimmt dabei zu (K (Z) > K (X) ). Anhand eines Beispiels sollen nun die Verh¨altnisse bei voneinander abh¨angigen Ereignissen abgeleitet werden. Der einfachste Fall ergibt sich, wenn nur N = 2 benachbarte Zeichen aus X durch ein neues Verbundsymbol substituiert werden. X sei eine bin¨are Informationsquelle, dann werden die Symbole aus dem Alphabet X wie folgt auf das Alphabet Z abgebildet (X)
X = {si
|1 ≤ i ≤ 2} = {s1 ; s2 }
→
(Z)
Z = {si |1 ≤ i ≤ 4} = {s1 s1 ; s1 s2 ; s2 s1 ; s2 s2 } .
74
5 Pr¨acodierung (Z)
Die Wahrscheinlichkeit eines spezifischen Verbundes sei pi . Sie ist unabh¨angig vom Zeitpunkt des Auftretens, wenn man eine station¨are Quelle annimmt. Daraus l¨asst sich allgemein eine Verbundentropie mit H(XX)N = −
(Z) K
i=1
(Z)
pi
(Z)
log2 pi
N K (Z) = K (X)
mit
(5.10)
definieren, wobei mit Gleichung (5.5) f¨ ur das Beispiel gilt (Z)
pi
= p(X) (sk sj ) = p(X) (sj |sk ) · p(X) (sk )
(5.11)
In welcher Relation steht nun die Verbundentropie H(XX)N zur Quellenentropie H(X)? Um diese Frage zu beantworten, sind einige Ableitungen erforderlich. Durch Einsetzen von (5.11) in (5.10) und N = 2 folgt H(XX)2 = −
(X) (X) K K
p(X) (sj |sk ) · p(X) (sk ) · log2 p(X) (sj |sk ) · p(X) (sk ) .
j=1 k=1
Mit log(a · b) = log a + log b und Verzicht auf die Alphabetkennzeichnung ((X) ) wird die Gleichung umgeformt zu H(XX)2 = −
K K
p(sj |sk ) · p(sk ) · log2 [p(sj |sk )] −
j=1 k=1
K K
p(sj |sk ) · p(sk ) · log2 [p(sk )] .
j=1 k=1
Separiert man die Indizes k und j, erh¨ alt man ⎫ ⎧ K ⎨ K ⎬ H(XX)2 = − p(sj |sk ) · log2 [p(sj |sk )] p(sk ) ⎭ ⎩ j=1 k=1 ⎫ ⎧ K ⎨ K ⎬ p(sj |sk ) . − p(sk ) log2 [p(sk )] · ⎭ ⎩ k=1
Wegen
K
j=1
j=1
p(sj |sk ) = 1 f¨ ur jedes konstante k (vgl. Gl. 5.4) folgt
H(XX)2
=
⎫ ⎧ K ⎨ K K ⎬ − p(sj |sk ) · log2 [p(sj |sk )] − p(sk ) log2 [p(sk )] p(sk ) ⎭ ⎩ k=1
H(XX)2
=
K
j=1
k=1
p(sk ) · H(X|X = sk ) + H(X)
k=1
H(XX)2 = H(X|X) + H(X)
(5.12)
5.1 Informationstheoretische Grundlagen
75
Die Verbundentropie setzt sich aus zwei Termen zusammen. Der erste Summand von Gl.(5.12) kann als bedingte Entropie identifiziert werden. Der zweite Term entspricht der Signalentropie des Quellalphabets. Die Entropie scheint sich durch das Verbinden von Symbolen sogar zu vergr¨oßern, da zur urspr¨ unglichen Signalentropie noch etwas hinzu addiert wird. Dies ist jedoch nicht der Fall, da der mittlere Informationsgehalt der Verbundentropie H(XX)2 f¨ ur N = 2 Zeichen angegeben wird, d.h. die Einheit lautet [1 bit/Doppelsymbol]. Das Ergebnis muss also noch durch zwei dividiert werden, um Verbundentropie und Signalentropie vergleichen zu k¨ onnen. Betrachten wir zun¨ achst die bedingte Entropie. Gem¨aß den obigen Ableitungen berechnet ¨ sich die bedingte Entropie aus der gewichteten Uberlagerung von Einzelentropien H(X|X = sk ), welche sich f¨ ur eine konkrete Bedingung sk ergeben H(X|X) =
K
p(sk ) · H(X|X = sk )
(5.13)
k=1
ur jedes sk berechnen Die Wahrscheinlichkeit dieser Bedingung sk fungiert als Gewicht. F¨ sich die Einzelentropien H(X|X = sk ) aus H(X|X = sk ) = H(X|sk ) =
K
p(sj |sk ) · log2 [p(sj |sk )]
(5.14)
j=1
H(X|sk ) l¨asst sich im Prinzip auch als die Quellenentropie einer Teilquelle von X interpretieren. Diese Teilquelle wird aktiviert, sobald sich die Gesamtquelle im Zustand X = sk befindet. Zur Interpretation des Ergebnisses von (5.12) werden nun die Grenzf¨alle der bedingten Entropie H(X|X) untersucht. 1. Die benachbarten Zeichen sj und sk sind unabh¨angig. Dann gilt p(sj |sk ) = p(sj ) und die bedingte Entropie betr¨ agt H(X|X) = −
K
p(sk ) ·
−
K
p(sk ) ·
= −
K
p(sj ) · log2 [p(sj )]
j=1
k=1
p(sj |sk ) · log2 [p(sj |sk )]
j=1
k=1
=
K
K
p(sk )
k=1
·
K
p(sj ) · log2 [p(sj )]
j=1
Die Summation u ¨ ber p(sk ) ergibt 1 und es verbleibt H(X|X) = −
K j=1
p(sj ) · log2 [p(sj )] = H(X)
76
5 Pr¨acodierung Sind die Zeichen voneinander unabh¨angig, dann ist die bedingte Entropie gleich der Quellenentropie. 2. Die benachbarten Zeichen sj und sk sind vollst¨andig voneinander abh¨angig, d.h., wenn sk das letzte Ereignis war, folgt automatisch sj . Es gilt p(sj |sk ) = 1 und die bedingte Entropie ist gleich Null. H(X|X) = −
K
1·0=0
j=1
Wie wirkt sich nun dieser Zusammenhang auf die Verbundentropie H(XX)N aus? Bleiben wir bei dem Beispiel N = 2. H(XX)2 gibt Auskunft u ¨ber den mittleren Informationsgehalt von Doppelsymbolen, dann sei H(XX)2 der mittlere Informationsgehalt von einzelnen Symbolen H(XX)2 [bit/Symbol] =
H(XX)2 [bit/Doppelsymbol] . 2
Aus (5.12) folgt H(X|X) + H(X) 2 und man kann die Grenzen der Verbundentropie mit H(XX)2 =
H(X) ≤ H(XX)2 ≤ H(X) 2 angeben. Analog dazu ließe sich f¨ ur beliebige N H(X) ≤ H(XX)N ≤ H(X) N
(5.15)
ableiten. Dies bedeutet, je mehr statistisch voneinander abh¨angige Symbole in geeigneter Weise zusammengefasst werden, desto st¨arker kann man die Entropie senken.
5.1.4
Praktische Implikationen
Sobald es statistische Abh¨ angigkeiten zwischen den Symbolen einer Informationsquelle gibt, sind die bedingte Entropie und damit auch die Verbundentropie geringer als die Entropie der Quelle. Die untere Grenze der erreichbaren mittleren Codewortl¨ange (vgl. Gl. 4.2) verschiebt sich damit und niedere Bitraten sind erreichbar. Das Verwenden bedingter Wahrscheinlichkeiten eignet sich gut f¨ ur die kontextabh¨angige Entropiecodierung (siehe auch Abschnitt 4.9.2). Dies l¨asst sich anhand des Wetterbeispiels aus Kapitel 2 zeigen. Der Meteorologe stellt z.B. eine neue Tabelle auf, welche die Wahrscheinlichkeiten des heutigen Wetters enth¨alt, wenn es gestern wolkig war (Tab. 5.1). Unter der Bedingung ‘Wolken’ betr¨agt die Entropie mit Gl. (2.2) lediglich H(X|Wolken) ≈
0.75 · 0.415 bit + 0.0625 · 4.0 bit+ 0.0625 · 3.0 bit + 0.125 · 4.0 bit = 1.186 bit/Symbol .
5.1 Informationstheoretische Grundlagen Wetter Wolken − > Wolken Wolken − > Sonne Wolken − > Regen Wolken − > Schnee
77 p 0.75 0.0625 0.125 0.0625
I[bit] 0.415 4.0 3.0 4.0
Tabelle 5.1: Bedingte Wetterwahrscheinlichkeiten Theoretisch l¨ asst sich jede Informationsquelle als Markow-Modell m-ter Ordnung beschreiben. Der Informationsgehalt eines jeden Symbols reduziert auf 1 . I s(m+1) = log2 (m+1) (m) p s |s . . . s(2) s(1) Praktisch sind diesem Ansatz jedoch Grenzen gesetzt. Erstens steigt der Speicherbedarf f¨ ur alle m¨ oglichen Signalkombinationen exponentiell mit steigender Modellordnung und zweitens besteht wieder das Problem, dass sich nur dann eine ausgepr¨agte Verteilung der Symbole einstellt, wenn die Anzahl der zu codierenden Zeichen deutlich gr¨oßer ist als die Symbolmenge des aktuellen Alphabets (siehe Abschnitt 4.10). Eine erfolgreiche Implementierung f¨ ur die Kompression von alphanumerischen Daten mit Hilfe von MarkowModellen h¨ oherer Ordnung wurde in [Mof90] unter dem Begriff PPM . . . prediction by partial matching vorgestellt. Diese Arbeit basiert auf einem in [Cle84] vorgeschlagenen Algorithmus. Das Verfahren is allerdings vergleichsweise rechentechnisch sehr aufw¨andig. Die meisten praktisch erfolgreichen Kompressionsalgorithmen st¨ utzen sich deshalb eher auf das Zusammenfassen von Symbolen zu Verbundsymbolen als auf die Modellierung bedingter Wahrscheinlichkeiten (siehe Abschnitte 5.2 und 5.3). Die Codierung auf Basis von bedingten Wahrscheinlichkeiten ist ein Spezialfall der kontextbasierten Entropiecodierung. W¨ ahrend bei letzterem der Kontext aus prinzipiell beliebigen Informationen abgeleitet werden kann, ist der Kontext in Markov-Modellen immer an die chronologische Abfolge von Zust¨anden gebunden. Ein weiteres Beispiel soll zeigen, dass man durch Zusammenfassen von Symbolen auch Codierungsvorteile erlangen kann, wenn die Symbole unabh¨angig voneinander sind. Gegeben sei eine bin¨ are Quelle mit den Symbolen s1 und s2 mit p1 = 0.3 und p2 = 0.7. Die Entropie betr¨ agt H(X) ≈ 0.881. Bei Verwendung von Pr¨afixcodes kann eine mittlere Codel¨ ange von li = 1 Bit pro Symbol nicht unterschritten werden. Verbindet man jeweils zwei Symbole, ergeben sich die Verbundwahrscheinlichkeiten nach Gleichung (5.5) mit der Bedingung, dass s1 und s2 unabh¨ angig sind, zu p(sk sj ) = p(sj |sk ) · pk = pj · pk
.
In Tabelle 5.2 sind alle Verbundsymbole, ihre Wahrscheinlichkeiten und der daraus erzeugte Huffman-Code aufgelistet. Die mittlere Codewortl¨ange betr¨agt f¨ ur einen Verbund li = 0.09 · 3 + 0.21 · 3 + 0.21 · 2 + 0.49 · 1 = 1.81 Bits/Doppelsymbol und f¨ ur ein einzelnes Symbol demnach nur 0.905 Bits/Symbol. Anzumerken ist hierbei, dass diese Verringerung auf die begrenzte Aufl¨osung von Pr¨afixcodes mit der unteren
78
5 Pr¨acodierung i 1 2 3 4
si s1 s1 s1 s2 s2 s1 s2 s2
pi 0.3 · 0.3 = 0.09 0.3 · 0.7 = 0.21 0.7 · 0.3 = 0.21 0.7 · 0.7 = 0.49
ci 000 001 01 1
Tabelle 5.2: Beispiel f¨ ur Verbundwahrscheinlichkeiten und Huffman-Codes Schranke l ≥ 1 Bit/Symbol zur¨ uckzuf¨ uhren ist. Der Einsatz einer arithmetischen Codierung h¨ atte mit unabh¨ angigen Symbolen auch bei einzelner Codierung der Zeichen ein optimales Ergebnis erzielt. Die folgenden Abschnitte stellen Verfahren vor, die auf unterschiedlichste Art und Weise versuchen, statistische Bindungen zwischen Symbolen zur Steigerung der Kompression auszunutzen. Die Verfahren haben jedoch alle eine Eigenschaft gemeinsam: Sie beruhen auf bestimmten Annahmen dar¨ uber, welche Symbolverteilungen zu erwarten und welcher Art die Abh¨ angigkeiten im Signal sind. Jede Pr¨acodierung basiert auf einer Modellvorstellung. Entspricht das zu verarbeitende Signal nicht diesem Modell, so ist keine effiziente Kompression m¨ oglich und im schlimmsten Fall wird die Datenmenge sogar noch vergr¨ oßert. So kann zum Beispiel mit Verbundsymbolen nur dann die Entropie gesenkt werden, wenn die Annahme zutrifft, dass benachbarte Symbole korreliert sind. Der Entwickler von neuen Kompressionsalgorithmen muss sich also immer zuerst Klarheit u ¨ber die Struktur und statistischen Eigenschaften der Signale verschaffen, die er verarbeiten will.
5.2 5.2.1
Laufl¨ angencodierung Allgemeine Codierung mehrwertiger Signale
Signale, bei denen Symbole h¨ aufig mehrfach hintereinander auftreten, k¨onnen effizient mit einer Laufl¨ angencodierung komprimiert werden (engl.: RLC. . . run length coding oder RLE. . . run length encoding). Die Abfolge von r gleichen Symbolen wird dabei als Laufl¨ ange r bezeichnet und in der Codierung durch ein 3-Elemente-Symbol (Token) ersetzt. Dieses Token enth¨ alt ein ESCAPE-Symbol, die Laufl¨ange r und das Symbol si (ESC;r;si ). Das ESCAPE-Symbol signalisiert dem Decoder, dass ein Token kommt. Ein Kompressionseffekt tritt nur dann ein, wenn mindestens vier gleiche Symbole aufeinander folgen. In Abbildung 5.3 sind Programmablaufpl¨ane f¨ ur die En- und Decodierung von Laufl¨ angen dargestellt. Der Decoder testet lediglich, ob das gelesene Zeichen ein ESCAPESymbol ist und damit eine Laufl¨ ange ank¨ undigt, oder ob es ein einzeln codiertes Zeichen ist. Der Encoder hat etwas mehr zu tun. Er u ¨ berwacht die Anzahl der gleichen Symbole und darf nur dann ein Token senden, wenn mindestens vier gleiche Zeichen gefunden wurden. Außerdem muss er die Laufl¨ange auf einen maximalen Wert begrenzen (nicht dargestellt in der Abbildung), weil r nur mit einer begrenzten Anzahl von Bits u ¨bertragen wird.4 Dieser Algorithmus bildet zum Beispiel die Zeichensequenz baaaa” 4 Die Begrenzung der Laufl¨ ange ist zum Beispiel dann nicht notwendig, wenn sie mit einem Golomboder Rice-Code entropiecodiert wird.
5.2 Laufl¨ angencodierung
79
Start
Start
lese erstes Symbol sact
lese n¨ achstes Symbol si
sact == EOF
j
Stop
si == EOF ?
?
j
n Symbolz¨ ahler r := 1
n
lese n¨ achstes Symbol si
si == ESC ? n
si == sact ?
j
gebe si aus
j
r := r + 1
lese r sact := si
n
r := 1 r forward, 1 -> inverse)"); fprintf( stderr, "\n f ... Filter (0 -> N=4, 1 -> N=5/3)"); fprintf( stderr, "\n l ... Signallaenge\n"); exit( 1); } mode = atoi( argv[1]); filter = atoi( argv[2]); vector_len = atoi( argv[3]); if (vector_len % 2) { odd = 1; vector_len++;} vector = (float*)calloc( vector_len, sizeof(float)); as = (float*)calloc( vector_len / 2, sizeof(float)); ds = (float*)calloc( vector_len / 2, sizeof(float)); if ((vector == NULL) || (as == NULL) || (ds == NULL)) { fprintf(stderr,"\n Fehler beim Anlegen des Speichers!"); exit( 3); } if (mode) { /* Ruecktransformation */ for ( i = 0; i < vector_len / 2; i++) scanf(" %f", &as[i]); for ( i = 0; i < vector_len / 2; i++) scanf(" %f", &ds[i]); if (filter) inverse_dwt53( vector, as, ds, vector_len, odd); else inverse_dwt4( vector, as, ds, vector_len); for ( i = 0; i < vector_len; i++) printf(" %.4f",vector[i]); } else { /* Hintransformation */ for ( i = 0; i < vector_len; i++) scanf("%f",&vector[i]); if (filter) forward_dwt53(vector, as, ds, vector_len,odd); else forward_dwt4( vector, as, ds, vector_len); for (i = 0; i < vector_len/2; i++) printf(" %.6f",as[i]); printf( "\t"); for (i = 0; i < vector_len/2; i++) printf(" %.6f",ds[i]); } printf( "\n"); exit(0); }
D.2.1 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66:
Orthogonale Signalzerlegung
/***************************************************************** * * Datei...: dwt_o.c * Funktion: orthogonale Wavelet-Transformation * Autor...: Tilo Strutz * Datum...: 25.02.2000 * *****************************************************************/ #include <stdlib.h> const float daub4_atp[4]={ 0.34150635, 0.59150635, 0.15849365,-0.09150635}; const float daub4_ahp[4]={ 0.09150635, 0.15849365, -0.59150635, 0.34150635}; const float daub4_stp[4]={-0.09150635*2, 0.15849365*2, 0.59150635*2, 0.34150635*2 }; const float daub4_shp[4]={ 0.34150635*2,-0.59150635*2, 0.15849365*2, 0.09150635*2 }; /*--------------------------------------------------------------* forward_dwt4() *--------------------------------------------------------------*/ void forward_dwt4( float vector[], float as[], float ds[], int vec_len) { int i, n, k; for ( i = 0, n = 0; i < vec_len; i += 2, n++) { k = i - 1 + vec_len; as[n] = daub4_atp[0] * vector[ k % vec_len] + daub4_atp[1] * vector[(k+1) % vec_len] + daub4_atp[2] * vector[(k+2) % vec_len] + daub4_atp[3] * vector[(k+3) % vec_len]; ds[n] = daub4_ahp[0] * vector[ k % vec_len] + daub4_ahp[1] * vector[(k+1) % vec_len] + daub4_ahp[2] * vector[(k+2) % vec_len] + daub4_ahp[3] * vector[(k+3) % vec_len]; } } /*--------------------------------------------------------------* inverse_dwt4() *--------------------------------------------------------------*/ void inverse_dwt4( float vector[], float as[], float ds[], int vec_len) { int n, i, k, vhl; vhl = vec_len / 2; for( n = 0, i = 0; n < vhl; n++, i +=2) { k = n - 1 + vhl; vector[i] = daub4_stp[0] * as[ k daub4_shp[0] * ds[ k % vhl] + daub4_stp[2] * as[(k+1) % vhl] + daub4_shp[2] * ds[(k+1) % vhl] ; k++; vector[i+1] = daub4_stp[1] * as[ k daub4_shp[1] * ds[ k % vhl] + daub4_stp[3] * as[(k+1) % vhl] + daub4_shp[3] * ds[(k+1) % vhl] ; } }
% vhl] +
% vhl] +
D.2 Diskrete Wavelet-Transformation
D.2.2 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87:
Biorthogonale Signalzerlegung
/***************************************************************** * * Datei...: dwt_b.c * Funktion: biorthogonale Wavelet-Transformation * Autor...: Tilo Strutz * Datum...: 10.05.2000 * *****************************************************************/ #include <stdlib.h> const float p53_atp[5] = { -0.125, 0.25, 0.75, 0.25, -0.125}; const float p53_ahp[3] = { -0.25, 0.50, -0.25}; const float p53_stp[3] = { 0.5, 1.0, 0.5}; const float p53_shp[5] = { -0.25, -0.5, 1.5, -0.5, -0.25}; /*--------------------------------------------------------------* forward_dwt53() *--------------------------------------------------------------*/ void forward_dwt53( float vector[], float as[], float ds[], int vec_len, int odd) { int i, n, vhl; vhl = vec_len / 2; as[0] = p53_atp[0] * vector[2] + /* Spiegelung */ p53_atp[1] * vector[1] + /* Spiegelung */ p53_atp[2] * vector[0] + p53_atp[3] * vector[1] + p53_atp[4] * vector[2]; ds[0] = p53_ahp[0] * vector[0] + p53_ahp[1] * vector[1] + p53_ahp[2] * vector[2]; for ( i = 0, n = 1; n < vhl-1; i += 2, n++) { as[n] = p53_atp[0] * vector[i ] + p53_atp[1] * vector[i+1] + p53_atp[2] * vector[i+2] + p53_atp[3] * vector[i+3] + p53_atp[4] * vector[i+4]; ds[n] = p53_ahp[0] * vector[i+2] + p53_ahp[1] * vector[i+3] + p53_ahp[2] * vector[i+4]; } if (odd) { as[n] = p53_atp[0] * vector[i] + p53_atp[1] * vector[i+1] + p53_atp[2] * vector[i+2] + p53_atp[3] * vector[i+1] + /* Spiegelung */ p53_atp[4] * vector[i]; /* Spiegelung */ } else { as[n] = p53_atp[0] * vector[i ] + p53_atp[1] * vector[i+1] + p53_atp[2] * vector[i+2] + p53_atp[3] * vector[i+3] + p53_atp[4] * vector[i+2]; /* Spiegelung */ ds[n] = p53_ahp[0] * vector[i+2] + p53_ahp[1] * vector[i+3] + p53_ahp[2] * vector[i+2]; /* Spiegelung */ } } /*--------------------------------------------------------------* inverse_dwt53() *--------------------------------------------------------------*/ void inverse_dwt53( float vector[], float as[], float ds[], int vec_len, int odd) { int n, i, vhl; vhl = vec_len / 2; vector[0] = p53_stp[1] * as[0] + p53_shp[1] * ds[0] + p53_shp[3] * ds[0]; vector[1] = p53_stp[0] * as[0] + p53_stp[2] * as[1] + p53_shp[0] * ds[0] + p53_shp[2] * ds[0] + p53_shp[4] * ds[1];
349
88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: }
if (!odd) { for( i = 2, n = 1; i < vec_len-3; i += 2, n++) { vector[i] = p53_stp[1] * as[n ] + p53_shp[1] * ds[n-1] + p53_shp[3] * ds[n]; vector[i+1] = p53_stp[0] * as[n] + p53_stp[2] * as[n+1] + p53_shp[0] * ds[n-1] + p53_shp[2] * ds[n ] + p53_shp[4] * ds[n+1]; } vector[i] = p53_stp[1] * as[n p53_shp[1] * ds[n-1] + p53_shp[3] * ds[n]; vector[i+1] = p53_stp[2] * p53_shp[0] * p53_shp[2] * p53_shp[4] *
] +
p53_stp[0] * as[n] + as[n] + ds[n-1] + ds[n ] + ds[n-1]; /* Spiegelung */
} else { for( i = 2, n = 1; i < vec_len-5; i += 2, n++) { vector[i] = p53_stp[1] * as[n ] + p53_shp[1] * ds[n-1] + p53_shp[3] * ds[n]; vector[i+1] = p53_stp[0] * as[n] + p53_stp[2] * as[n+1] + p53_shp[0] * ds[n-1] + p53_shp[2] * ds[n ] + p53_shp[4] * ds[n+1]; } vector[i] = p53_stp[1] * as[n p53_shp[1] * ds[n-1] + p53_shp[3] * ds[n];
] +
vector[i+1] = p53_stp[0] * as[n] + p53_stp[2] * as[n+1] + p53_shp[0] * ds[n-1] + p53_shp[2] * ds[n ] + p53_shp[4] * ds[n]; /* Spiegelung */ vector[vec_len-2] = p53_stp[1] * as[vhl-1] + p53_shp[1] * ds[vhl-2] + p53_shp[3] * ds[vhl-2]; /* Spiegelung */ }
350
D.3 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36:
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47:
D Quelltexte
Waveletbasierte Bildkompression
/***************************************************************** * * Datei...: codec.h * Funktion: Definitionen fuer Codierung * Autor...: Tilo Strutz * Datum...: 01.07.2000, 12.02.2009 * *****************************************************************/ #ifndef CODEC_H #define CODEC_H #define MAX_QUALITY 2000 /* max. Qualitaet */ #define MAX_DEPTH 4 /* max. Tiefe fuer Quadtrees */ #define MAX_QUANT_VAL 16 /* max. Quantiesierungswert fuer direkte Codierung */ #define NUM_OF_QSYM (MAX_QUANT_VAL + 1)/* inkl. Null */ #define NUM_OF_SYM (MAX_QUANT_VAL + 2)/* inkl. Escape-Symbol*/ #define NUM_QUANT_CATEG 9 /* max.Zahl der Kategorien fuer * Codierung von Werten > * MAX_QUANT_VAL */ #define MAX_AA_CONTEXT 3 /* Zahl der Kontexte fuer AA-Band*/ #define NUM_DIFF_CATEG 14 /* max.Zahl der Kategorien fuer * Codierung von Werten aus AA */ typedef struct { int std_flag; /* aktiviert eine Ausgabe nach stdout */ int quality; } OPTION; typedef struct { unsigned int width, /* Bildbreite */ height; /* Bildhoehe */ unsigned long size; /* Anzahl der Bildpunkte } IMAGE;
*/
#endif
/***************************************************************** * * Datei...: dwt.h * Funktion: Definitionen fuer Wavelet-Transformation * Autor...: Tilo Strutz * Datum...: 01.03.2000, 25.02.2009 * *****************************************************************/ #ifndef DWT_PROTO_H #define DWT_PROTO_H #include "codec.h" #define #define #define #define #define
MAX_NUM_SB DAUB4 0 BIO5_3 1 BIO9_7 2 BIO_53L 3
7
typedef struct { int filter, /* Wavelet-Filter */ num_sb; /* Anzahl der Teilbaender */ int p_lx[MAX_NUM_SB+1]; int p_ly[MAX_NUM_SB+1]; /* Zeiger auf Array mit * Koordinaten der * Teilbaender */ int lx, ly; /* Breite und Hoehe des LL-Bandes */ double gainH0; /* Verst¨ arkung des Analyse TP-Filters */ double gainH1; /* Verst¨ arkung des Analyse HP-Filters */ } DWT_PARAM; typedef struct delta_struct { float aa; /* Intervallbreiten f¨ ur Quantisierung */ float da[MAX_NUM_SB]; float ad[MAX_NUM_SB]; float dd[MAX_NUM_SB]; } delta_struct; int forward_dwt_control( IMAGE *im, float fptr[], DWT_PARAM *dwt); int inverse_dwt_control( IMAGE *im, float fptr[], DWT_PARAM *dwt); void forward_dwt53_2D( float fptr[], float vector[], float as[], float ds[], IMAGE *im, unsigned int width, unsigned int height); void forward_dwt53( float vector[], float as[], float ds[], unsigned int vec_len, int odd); void inverse_dwt53( float vector[], float as[], float ds[], unsigned int vec_len, int odd); void forward_dwt4( float vector[], float as[], float ds[],
48: 49: 50: 51: 52: 53: 54: 55: 56: 57:
unsigned int vec_len); void inverse_dwt4( float vector[], float as[], float ds[], unsigned int vec_len); int f_97L_control( IMAGE *im, DWT_PARAM *dwt, float lptr[]); int i_97L_control( IMAGE *im, DWT_PARAM *dwt, float lptr[]); void get_dwt_params( IMAGE *im, DWT_PARAM *dwt);
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
/**************************************************************** * * Datei...: get_option.h * Funktion: prototyping etc. for get_option.c * Autor...: Tilo Strutz * Datum...: 14.07.2005, 25.04.2007 * ****************************************************************/
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43:
double coeff[4]; /* Filterkoefficients f¨ ur 9/7-Lifting */ #endif
#ifndef GETOPT_H #define GETOPT_H
/* defined in get_option.c */ extern char *OptArg; extern char CheckStr[256]; /* will be initialised with NEEDEDOPTIONS all used optionen are deleted; if at least one option remains, an error message is output */ extern char *optstr; extern int opt_num; /* defined in usage.c */ extern char *title; extern char *OPTIONSTRING; extern char *NEEDEDOPTIONS; /* Prototyping */ void usage( const char *name); int check_opt( const char *name); char *get_option( int argc, const char **argv); #endif
/**************************************************************** * * Datei...: get_option.c * Funktion: Lesen und analysieren der Komandozeilen-Optionen * Autor...: Tilo Strutz * Datum...: 31.05.2000, 25.04.2007 * ****************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "get_option.h" /* contains argument of option, if OptArg != NULL */ char *OptArg = NULL; char CheckStr[256]; /* will be initialised with NEEDEDOPTIONS all used optionen are deleted; if at least one option remains, an error message is output */ char *optstr; int opt_num = 1; /*--------------------------------------------------------------* check_opt() *---------------------------------------------------------------*/ int check_opt( const char *name) { char *ptr; int i, len, err = 0; len = strlen( CheckStr); for (i = 0; i < len; i++) { if (( CheckStr[i] != ’:’) && (CheckStr[i] != ’ ’)) { ptr = &CheckStr[i]; ptr = (char*)strpbrk( ptr, ";:"); ptr[0] = ’\0’; err = 1; break; } } if (err)
D.3 Waveletbasierte Bildkompression
44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135:
{ fprintf( stderr, "\n Missing Option for (-%s)!", &CheckStr[i]); usage( name); } return err; } /*--------------------------------------------------------------* get_option() * * opt_num is number of option to be read * result: option string * required: global string containing all options * at first call opt_num must be equal to 1 ! * *---------------------------------------------------------------*/ char * get_option( int argc, const char *argv[]) { char optstring[256], *ptr, c, d, string[256]; char *gerrstr="#"; int len, i, num; if (opt_num == 1) { strcpy( CheckStr, NEEDEDOPTIONS); } if (opt_num > (argc - 1)) { /* stop scanning of command line */ return (NULL); } else if (argv[opt_num][0] == ’+’) { /* + signals end of parameter list */ opt_num++; return (NULL); } else if (argv[opt_num][0] != ’-’) { fprintf( stderr, "\n Option-Error !! *********** "); fprintf( stderr, "\n every Option must start with ’-’ (%s)!", argv[opt_num]); /* usage( argv[0]); */ return gerrstr; } /***** copy without ’-’ *****/ num = opt_num; strcpy( optstring, argv[num]); strcpy( string, &optstring[1]); len = strlen( string); if (len == 0) { /* single ’-’ */ fprintf( stderr, "\n Option-Error !! *********** "); fprintf( stderr, "\n lonely dash !"); /* usage( argv[0]); */ return gerrstr; } ptr = OPTIONSTRING; do { /* search option string in OPTIONSTRING */ ptr = (char*)strstr( ptr, string); if (ptr == NULL) { fprintf( stderr, "\n Option-Error !! *********** "); fprintf( stderr, "\n Unknown Option (%s)!", optstring); /* usage( argv[0]); */ return gerrstr; } c = ptr[len]; /* remember subsequent character */ d = ptr[-1]; /* remember predecessor */ /* skip this entry by searching for next ’:’ or ’;’ */ ptr = (char*)strpbrk( ptr, ";:"); } while (( (c != ’:’) && (c != ’;’)) || (( d != ’:’) && (d != ’;’))); if (c == ’;’) /* info, whether argument follows */ { OptArg = NULL; opt_num++; } else { opt_num++; if (opt_num > (argc - 1)) { fprintf( stderr, "\n Option-Error !! *********** ");
351
136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: }
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64:
fprintf( stderr, "\n Missing Argument for (%s)!", optstring); /* usage( argv[0]); */ return gerrstr; } else if (argv[opt_num][0] == ’-’) { fprintf( stderr, "\n Option-Error !! *********** "); fprintf( stderr, "\n Missing Argument for (%s)!", optstring); /* usage( argv[0]); */ return gerrstr; } OptArg = (char*)argv[opt_num]; opt_num++; } strcpy( string, ":"); strcat( string, &optstring[1]); strcat( string, ":"); ptr = (char*)strstr( CheckStr, string); if (ptr != NULL) for (i = 0; i < len; i++) ptr[i + 1] = ’ ’; return (( char*)argv[num]);
/***************************************************************** * * Datei...: get_dwt_params.c * Funktion: Definieren der Transformationsparameter * Autor...: Tilo Strutz * Datum...: 24.02.2000, 25.02.2009 * *****************************************************************/ #include <stdlib.h> #include <stdio.h> #include "dwt.h" #define SQRT2 1.414213562 /* sqrt(2) */ /*--------------------------------------------------------------* get_dwt_params() *--------------------------------------------------------------*/ void get_dwt_params( IMAGE *im, DWT_PARAM *dwt) { char *rtn="get_dwt_params"; int i; unsigned int min_size; min_size = im->width; if (min_size > im->height) min_size = im->height; /* default-Werte */ dwt->gainH0 = SQRT2; dwt->gainH1 = SQRT2; /* Anzahl der Zerlegungen */ i = 0; switch (dwt->filter) { case DAUB4: /* Signallaenge muss fuer jede Stufe durch 2 teilbar sein */ while (min_size >= 18 && !(min_size % 2)) { i++; min_size = (min_size + 1) >> 1; }; break; case BIO5_3: case BIO_53L: case BIO9_7: while (min_size >= 18) { i++; min_size = (min_size + 1) >> 1; }; break; } if (dwt->num_sb == -1) dwt->num_sb = i; else if (dwt->num_sb > i) { fprintf( stderr, "\n %s: choosen value for ’-n %d’ too high!", rtn, dwt->num_sb); fprintf( stderr, "\n %s: substitution with ’-n %d’!\n", rtn, i); dwt->num_sb = i; } /* Berechnung der Teilbanddimensionen */ dwt->p_lx[0] = im->width;
352
65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: }
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40:
D Quelltexte
dwt->p_ly[0] = im->height; for (i = 1; i < dwt->num_sb + 1; i++) { dwt->p_lx[i] = (dwt->p_lx[i-1] + 1) >> 1; dwt->p_ly[i] = (dwt->p_ly[i-1] + 1) >> 1; }
D.3.1
0: 1: 2: 3: 4: 5: /* Groesze des verbleibenden Approximationssignals */ 6: dwt->lx = dwt->p_lx[dwt->num_sb]; 7: dwt->ly = dwt->p_ly[dwt->num_sb]; 8: 9: /* spezielle Variblen f¨ ur das 9/7-Lifting */ 10: if (dwt->filter == BIO9_7) 11: { 12: coeff[0] = -1.586134342; /* alpha */ 13: coeff[1] = -0.052980119; /* beta */ 14: coeff[2] = 0.882911076; /* gamma */ 15: coeff[3] = 0.443506852; /* delta */ 16: 17: dwt->gainH0 = 1.23017411; 18: dwt->gainH1 = 1.62578612; 19: } 20: else if (dwt->filter == BIO_53L) 21: { 22: coeff[0] = -0.5; /* alpha */ 23: coeff[1] = 0.25; /* beta */ 24: coeff[2] = 0.0; /* gamma */ 25: coeff[3] = 0.0; /* delta */ 26: 27: dwt->gainH0 = 1.0; 28: dwt->gainH1 = 2.0; 29: } 30: 31: 32: 33: 34: /****************************************************************** 35: * 36: * Datei...: get_quant_param.c 37: * Funktion: Kopieren von Parametern 38: * Autor...: Tilo Strutz 39: * Datum...: 02.05.2000, 11.02.2009 40: * 41: ******************************************************************/ 42: #include <stdlib.h> 43: #include <stdio.h> 44: #include <math.h> 45: #include 46: #include "dwt.h" 47: 48: /*--------------------------------------------------------------49: * get_quant_param() 50: *---------------------------------------------------------------*/ 51: void get_quant_param( delta_struct *delta, DWT_PARAM *dwt, OPTION *op) 52: { 53: register int r; 54: double AA; 55: 56: assert( fabs(dwt->gainH1 * dwt->gainH0 - 2.) < 1e-6); 57: 58: /* correct determination of quantization intervalls 59: * for each subband; standard gain is sqrt(2) for 1D 60: */ 61: /* get relations between subbands */ 62: if (op->quality < 1) AA = 200; 63: else AA = 1500. / op->quality; 64: for ( r = dwt->num_sb; r >=0; r--) 65: { 66: delta->dd[r] = (float)(AA * dwt->gainH1 * dwt->gainH1 / 2); 67: delta->da[r] = (float)(AA * dwt->gainH1 * dwt->gainH0 / 2); 68: delta->ad[r] = delta->da[r]; 69: AA = AA * dwt->gainH0 * dwt->gainH0 / 2; 70: /* aa = (float)AA; 73: } 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90:
Encoder
/***************************************************************** * * Datei...: e_main.c * Funktion: Main-Routine fuer Encodierung * Autor...: Tilo Strutz * Datum...: 02.07.2000, 25.02.2009 * *****************************************************************/ #include #include #include #include #include #include
<stdio.h> <stdlib.h> <string.h> "get_option.h" "codec.h" "dwt.h"
int encoder( IMAGE *im, DWT_PARAM *dwt, OPTION *op, FILE *in, FILE *bitstream); /*--------------------------------------------------------------* main() *---------------------------------------------------------------*/ int main(int argc, char *argv[]) { char *rtn="WaveQAe"; int i, err=0; char ch1, ch2, dummy[2]; char in_name[256], out_name[256]; IMAGE ima, *im; DWT_PARAM dwt_par, *dwt; OPTION option, *op; FILE *in=stdin,*out=stdout; fprintf( stderr,"\n%s\t encoding...\n", title); im = &ima; op = &option; dwt = &dwt_par; dwt->filter = 1; dwt->num_sb = -1; op->std_flag = 0; op->quality = 100; im->width = im->height = 0; strcpy( in_name, ""); strcpy( out_name, ""); while (( optstr = ( char*)get_option( argc, (const char**)argv)) != NULL) { switch (optstr[1]) { case ’d’: op->std_flag = 1; break; case ’f’: dwt->filter = atoi( OptArg); if ( (dwt->filterfilter>BIO_53L) ) { dwt->filter = BIO5_3; fprintf( stderr,"\n -f: wrong value !"); fprintf( stderr,"\n now using BIO5_3 !\n"); } break; case ’i’: strcpy( in_name, OptArg); break; case ’n’: dwt->num_sb = atoi( OptArg); if (dwt->num_sb > 7) { dwt->num_sb = -1; fprintf( stderr,"\n -n: too high !"); fprintf( stderr,"\n now adaptive !\n"); } break; case ’o’: strcpy( out_name, OptArg); break; case ’q’: op->quality = atoi( OptArg); if (op->quality > MAX_QUALITY) { op->quality = MAX_QUALITY; fprintf( stderr,"\n -q: too high !"); fprintf( stderr,"\n now using %d !\n", MAX_QUALITY); } if (op->quality < 1) { op->quality = 1; fprintf( stderr,"\n -q: too low !"); fprintf( stderr,"\n now using %d !\n", 1); } break; default: usage( argv[0]); err = 3;
D.3 Waveletbasierte Bildkompression
91: goto end; 92: } 93: } 94: err = check_opt(argv[0]); /* Test, ob alle erforderlichen Parameter 95: eingelesen wurden */ 96: if (err) goto end; 97: 98: /* Input-File oeffnen */ 99: if ( strlen( in_name) != 0 ) 100: { 101: in = fopen( in_name, "rb"); 102: if (in == NULL) 103: { 104: fprintf(stderr,"\n %s: cannot open %s for reading\n", 105: rtn, in_name); 106: perror(" "); 107: err = 4; 108: goto end; 109: } 110: } 111: else in = stdin; 112: 113: /* Output-File oeffnen */ 114: if ( strlen( out_name) != 0 ) 115: { 116: out = fopen( out_name, "wb"); 117: if (out == NULL) 118: { 119: fprintf(stderr,"\n %s: cannot open %s for writing\n", 120: rtn, out_name); 121: perror(" "); 122: err = 5; 123: goto end; 124: } 125: } 126: else out = stdout; 127: 128: /* lese PGM-Parameter */ 129: ch1 = getc( in); 130: ch2 = getc( in); 131: if (ch1 != ’P’ || ch2 != ’5’) 132: { 133: fprintf( stderr, "\n Es werden nur PGM-Graustufenbilder"); 134: fprintf( stderr, "\n im Bin¨ arformat (’P5’) unterst¨ utzt!"); 135: err = 6; 136: goto end; 137: } 138: fscanf( in, "%*1[\n]"); /* lese Newline */ 139: /* u ¨berspringe alle Kommentarzeilen */ 140: while (fscanf( in, "%1[#]", dummy) == 1) 141: { 142: fscanf( in, "%*[^\n]"); /* lese bis zum Zeilenende */ 143: fscanf( in, "%*1[\n]"); /* lese Newline */ 144: } 145: fscanf( in, "%d %d", &( im->width), &( im->height)); 146: fscanf( in, "%*1[\n]"); /* lese Newline */ 147: 148: im->size = im->width * im->height; 149: fscanf( in, "%d", &i); /* lese Maximalwert */ 150: fscanf( in, "%*[^\n]"); /* lese bis zum Zeilenende */ 151: fscanf( in, "%*1[\n]"); 152: 153: err = encoder( im, dwt, op, in, out); 154: 155: end: 156: if (out != NULL && out != stdout) fclose( out); 157: if (in != NULL && in != stdin ) fclose( in); 158: 159: if (err) 160: { 161: fprintf( stderr, "\nfailed with error %d.\n", err); 162: exit( 1); 163: } 164: else 165: { 166: fprintf( stderr, "\nready.\n"); 167: exit( 0); 168: } 169: }
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
/***************************************************************** * * Datei...: e_usage.c * Funktion: Parameter fuer Encodierung * Autor...: Tilo Strutz * Datum...: 01.03.2000, 11.02.2009 * *****************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h>
353
11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60:
/* erlaubte Optionen, muss mit : beginnen! */ char *OPTIONSTRING = {":d;f:h:i:n:o:q:w:"}; char *NEEDEDOPTIONS = {"::"}; /* erforderliche Optionen */ char *title={"plain image encoder ’WaveQA’ v02/2009"}; /*--------------------------------------------------------------* usage() *---------------------------------------------------------------*/ void usage(char *name) { fprintf( stderr,"\n %s\n", title); fprintf(stderr, "\n\ Usage: %s [options]\n\n\ Legal Options: \n\ -d ... enables printing of bitrate to stdout \n\ -f %%d ... wavelet filter \n\ 0 => Daub 4 \n\ 1 => Bio 5/3 (default)\n\ 2 => Bio 9/7 (default)\n\ -h %%d ... image height \n\ -i %%s ... name of input image (default: stdin)\n\ -n %%d ... number of decompositions (0...7) \n\ -o %%s ... name of compressed image (default: stdout)\n\ -q %%d ... quality of reconstructed image (1...1000), \n\ default: 100\n\ -w %%d ... image width \n\ \n\ ", name); }
/***************************************************************** * * Datei...: encoder.c * Funktion: Transformationscodec * Autor...: Tilo Strutz * Datum...: 01.03.2000, 25.02.2009 * *****************************************************************/ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> #include "codec.h" #include "dwt.h" #include "ac2_proto.h" void encode_tb( IMAGE *im, DWT_PARAM *dwt,long lptr[],FILE *out); void encode_aa( IMAGE *im, DWT_PARAM *dwt,long lptr[],FILE *out); void out_bits_CAT( unsigned long val, int len, FILE *stream); void out_bits_INIT( void); unsigned long out_bits_FLUSH( FILE *stream); /*--------------------------------------------------------------* encoder() *--------------------------------------------------------------*/ int encoder( IMAGE *im, DWT_PARAM *dwt, OPTION *op, FILE *in, FILE *out) { char *rtn="encoder"; int err; long *lptr=NULL, l; float *fptr=NULL; unsigned char *bptr=NULL; unsigned long out_bytes; delta_struct delt, *delta; delta = &delt; /* Speicher anlegen */ bptr = (unsigned char*)calloc( im->size, sizeof(unsigned char)); if (bptr==NULL) { fprintf(stderr, "\n %s: cannot allocate bptr !\n", rtn); err = 10; goto end;; } fptr = (float*)calloc( im->size, sizeof(float)); if (fptr==NULL) { fprintf(stderr, "\n %s: cannot allocate fptr !\n", rtn); err = 11; goto end;; } /* Bild einlesen */ fread( bptr, 1, im->size, in); /* Bild konvertieren */ for (l = im->size-1; l >= 0; l--) {
354
61: fptr[l] = (float)bptr[l]; 62: } 63: free( bptr); bptr = NULL; 64: 65: /* Transformationsparameter bestimmen */ 66: get_dwt_params( im, dwt); 67: 68: /* Bild transformieren */ 69: if (dwt->num_sb > 0) 70: { 71: if (dwt->filter == BIO9_7 || dwt->filter == BIO_53L) 72: { 73: err = f_97L_control( im, dwt, fptr); 74: } 75: else 76: { 77: err = forward_dwt_control( im, fptr, dwt); 78: } 79: if (err) goto end; 80: } 81: 82: /* Transformationskoeffizienten quantisieren */ 83: lptr = (long*)calloc( im->size, sizeof(long)); 84: if (lptr == NULL) 85: { 86: fprintf(stderr, "\n %s: cannot allocate lptr !\n", rtn); 87: err = 12; 88: goto end; 89: } 90: 91: get_quant_param( delta, dwt, op); 92: quantise( im, dwt, fptr, lptr, delta); 93: 94: free( fptr); fptr = NULL; 95: 96: out_bits_INIT(); 97: 98: /* Header codieren */ 99: out_bits_CAT( (unsigned long)im->width, 12, out); 100: out_bits_CAT( (unsigned long)im->height, 12, out); 101: out_bits_CAT( (unsigned long)dwt->filter, 2, out); 102: out_bits_CAT( (unsigned long)dwt->num_sb, 3, out); 103: out_bits_CAT( (unsigned long)op->quality,11, out); 104: 105: /* Approximationssignal codieren */ 106: encode_aa( im, dwt, lptr, out); 107: 108: /* Teilbandsignale codieren */ 109: if (dwt->num_sb > 0) encode_tb( im, dwt, lptr, out); 110: 111: free( lptr); lptr = NULL; 112: out_bytes = out_bits_FLUSH( out); 113: 114: fprintf( stderr,"\n\t%ld Bytes gelesen", im->size); 115: fprintf( stderr,", %ld Bytes geschrieben", out_bytes); 116: fprintf( stderr,"\n\tKompressionsverhaeltnis; %6.3f \n", 117: (float)im->size / (float)out_bytes); 118: if (op->std_flag) 119: { 120: printf( "%3.3f", 8.0 * (float)out_bytes / (float)im->size); 121: } 122: 123: end: 124: if (bptr != NULL) free( bptr); 125: if (fptr != NULL) free( fptr); 126: if (lptr != NULL) free( lptr); 127: return err; 128: }
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
/***************************************************************** * * Datei...: encode_tb.c * Funktion: Encodierung der Teilbandsignale * Autor...: Tilo Strutz * Datum...: 02.05.2000, 21.02.2009 * *****************************************************************/ #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include "codec.h" #include "dwt.h" #include "ac2.h" #include "ac2_proto.h" int set[MAX_DEPTH][(1= 0; i--) set_pos[i] = 0; 255: quad_code( depth, out); 256: } 257: } 258: } 259: else 260: { 261: start_model( Hsign, 2, Q1); 262: for( y = yoff; y < yend; y += step) 263: { 264: for( x = xoff; x < xend; x += step) 265: { 266: q = lptr[ x + y*im->width]; 267: encode_quant( q, Hq, Hsign, out); 268: } 269: } 270: } 271: 272: /* 273: * AD - Teilband 274: */ 275: xoff = 0; 276: yoff = dwt->p_ly[sbnr1]; 277: xend = dwt->p_lx[sbnr1]; 278: yend = dwt->p_ly[sbnr]; 279: 280: start_model( Hq, NUM_OF_SYM, Q1); 281: start_model( Hesc, NUM_QUANT_CATEG, Q1); 282: 283: if (depth) 284: { 285: for ( i = depth-1; i >= 0; i--) 286: start_model( Hset[i], 16, Q1); 287: 288: /* quad_tree-Codierung */ 289: for( y = yoff; y < yend; y += step) 290: { 291: start_model( Hsign, 2, Q1); 292: for( x = xoff; x < xend; x += step) 293: { 294: list_pos = 0; 295: len = sizeof(int); 296: for ( i = depth-1; i >= 0; i--) 297: {
356
298: set_pos[i] = 0; 299: memset( &set[i], 0, (unsigned)len); 300: len *= 4; 301: } 302: s = quad_tree( im, lptr, x, y, depth); 303: 304: list_pos = 0; 305: for ( i = depth-1; i >= 0; i--) set_pos[i] = 0; 306: quad_code( depth, out); 307: } 308: } 309: } 310: else 311: { 312: start_model( Hsign, 2, Q1); 313: for( y = yoff; y < yend; y += step) 314: { 315: for( x = xoff; x < xend; x += step) 316: { 317: q = lptr[ x + y*im->width]; 318: encode_quant( q, Hq, Hsign, out); 319: } 320: } 321: } 322: 323: /* 324: * DD - Teilband 325: */ 326: xoff = dwt->p_lx[sbnr1]; 327: yoff = dwt->p_ly[sbnr1]; 328: xend = dwt->p_lx[sbnr]; 329: yend = dwt->p_ly[sbnr]; 330: 331: start_model( Hq, NUM_OF_SYM, Q1); 332: start_model( Hesc, NUM_QUANT_CATEG, Q1); 333: 334: if (depth) 335: { 336: for ( i = depth-1; i >= 0; i--) 337: start_model( Hset[i], 16, Q1); 338: 339: /* quad_tree-Codierung */ 340: for( y = yoff; y < yend; y += step) 341: { 342: start_model( Hsign, 2, Q1); 343: for( x = xoff; x < xend; x += step) 344: { 345: list_pos = 0; 346: 347: len = sizeof(int); 348: for ( i = depth-1; i >= 0; i--) 349: { 350: set_pos[i] = 0; 351: memset( &set[i], 0, (unsigned)len); 352: len *= 4; 353: } 354: s = quad_tree( im, lptr, x, y, depth); 355: 356: list_pos = 0; 357: for ( i = depth-1; i >= 0; i--) set_pos[i] = 0; 358: quad_code( depth, out); 359: } 360: } 361: } 362: else 363: { 364: start_model( Hsign, 2, Q1); 365: for( y = yoff; y < yend; y += step) 366: { 367: for( x = xoff; x < xend; x += step) 368: { 369: q = lptr[ x + y*im->width]; 370: encode_quant( q, Hq, Hsign, out); 371: } 372: } 373: } 374: } 375: finish_encode2( out); 376: }
D Quelltexte
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64:
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24:
/**************************************************************** * * Datei...: encode_aa.c * Funktion: Encodierung des Approximationssignals * Autor...: Tilo Strutz * Datum...: 03.03.2000 * ****************************************************************/ #include <stdlib.h> #include <stdio.h> #include <math.h> #include "codec.h" #include "dwt.h" void out_bits_CAT( unsigned long val, int len, FILE *stream); /*--------------------------------------------------------------* encode_aa() *---------------------------------------------------------------*/ void encode_aa( IMAGE *im, DWT_PARAM *dwt, long lptr[], FILE *out) { int x, y, len; long xmax=0, xmin=(long)1 ly, py = 0; y > 0; y--, py += im->width) { for( x = dwt->lx, pos = py; x > 0; x--, pos++) { if (xmax < lptr[pos]) xmax = lptr[pos]; if (xmin > lptr[pos]) xmin = lptr[pos]; } } /* Uebertragen des kleinsten Wertes (Betrag und Vorzeichen) */ out_bits_CAT( (unsigned long) abs(xmin), 12, out); if (xmin < 0) out_bits_CAT( (unsigned long) 1, 1, out); else out_bits_CAT( (unsigned long) 0, 1, out); domain = xmax - xmin; len = 31; mask = (long)1 >= 1; len--; } /* Uebertragen der erforderlichen Anzahl von Bits * pro Signalwert */ out_bits_CAT( (unsigned long) len, 5, out); /* Uebertragen der Signalwerte minus Offset */ for( y = dwt->ly, py = 0; y > 0; y--, py += im->width) { for( x = dwt->lx, pos = py; x > 0; x--, pos++) { out_bits_CAT( (unsigned long)(lptr[pos]-xmin), len, out); } } }
/**************************************************************** * * Datei...: dwt_2D.c * Funktion: 2D- Wavelet-Transformation * Autor...: Tilo Strutz * Datum...: 01.05.2000 * ****************************************************************/ #include <stdlib.h> #include <stdio.h> #include <string.h> #include "dwt.h" /*--------------------------------------------------------------* forward_dwt53_2D() *---------------------------------------------------------------*/ void forward_dwt53_2D( float fptr[], float vector[], float as[], float ds[], IMAGE *im, unsigned int width, unsigned int height) { int x, y, xvlh, yvlh, width_float, xodd=0, yodd=0; float *p, *p1, *px, *pv, *ap, *dp; if (width % 2) xodd = 1; if (height % 2) yodd = 1;
D.3 Waveletbasierte Bildkompression
25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116:
xvlh = (width + 1) >> 1; yvlh = (height + 1) >> 1; /* alle Zeilen */ p = fptr; width_float = sizeof(float) * width; for( y = height; y > 0; y--, p += im->width) { (void*)memcpy( vector, p, (unsigned)width_float); forward_dwt53( vector, p, &p[xvlh], width+xodd, xodd); } /* alle Spalten */ px = fptr; for( x = width; x > 0; x--, px++) { /* eine Spalte in einen Zeilenvektor kopieren */ p = px; p1 = vector; for ( y = height; y > 0; y--, p += im->width, p1++) *p1 = *p; forward_dwt53( vector, as, ds, height+yodd, yodd); /* das Ergebnis verdoppeln und * zurueck in eine Spalte kopieren */ p = px; pv = &px[ yvlh * im->width ]; ap = as; dp = ds; for ( y = yvlh-1; y > 0; y--, p += im->width, pv += im->width, ap++, dp++) { *p = 2.0 * *ap; /* Approx.signal */ *pv = 2.0 * *dp; /* Detail signal */ } if (yodd) *p = 2.0 * *ap; else { *p = 2.0 * *ap; *pv = 2.0 * *dp;} } } /*--------------------------------------------------------------* forward_dwtd4_2D() *---------------------------------------------------------------*/ void forward_dwtd4_2D( float fptr[], float vector[], float as[], float ds[], IMAGE *im, unsigned int width, unsigned int height) { int x, y, xvlh, yvlh, width_float; float *p, *p1, *px, *pv, *ap, *dp; xvlh = width >> 1; yvlh = height >> 1; /* alle Zeilen */ p = fptr; width_float = sizeof(float) * width; for( y = height; y > 0; y--, p += im->width) { (void*)memcpy( vector, p, (unsigned)width_float); forward_dwt4( vector, p, &p[xvlh], width); } /* alle Spalten */ px = fptr; for( x = width; x > 0; x--, px++) { /* eine Spalte in einen Zeilenvektor kopieren */ p = px; p1 = vector; for ( y = height; y > 0; y--, p += im->width, p1++) *p1 = *p; forward_dwt4( vector, as, ds, height); /* das Ergebnis verdoppeln und * zurueck in eine Spalte kopieren */ p = px; pv = &px[ yvlh * im->width ]; ap = as; dp = ds; for ( y = yvlh; y > 0; y--, p += im->width, pv += im->width, ap++, dp++) { *p = 2.0 * *ap; /* Approx.signal */ *pv = 2.0 * *dp; /* Detail signal */ } } }
357
117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177:
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
/*--------------------------------------------------------------* forward_dwt_control() *---------------------------------------------------------------*/ int forward_dwt_control( IMAGE *im, float fptr[], DWT_PARAM *dwt) { char *rtn="forward_dwt53_2D"; int i; float *vector, *as, *ds; unsigned int max_dim; max_dim = im->width; if (max_dimheight) max_dim = im->height; vector = (float*)malloc( sizeof(float) * max_dim); if ( vector==NULL) { fprintf( stderr,"\n %s: Unable to allocate vector!\n", rtn); return (2); } as = (float*)malloc( sizeof(float) * max_dim / 2); if ( as==NULL) { fprintf( stderr,"\n %s: Unable to allocate as!\n", rtn); return (2); } ds = (float*)malloc( sizeof(float) * max_dim / 2); if ( ds==NULL) { fprintf( stderr,"\n %s: Unable to allocate ds!\n", rtn); return (2); } /** forward 2D-transformation **/ switch (dwt->filter) { case BIO5_3: for (i = 0; i < dwt->num_sb; i++) { forward_dwt53_2D( fptr, vector, as, ds, im, (unsigned)dwt->p_lx[i], (unsigned)dwt->p_ly[i]); } break; case DAUB4: for (i = 0; i < dwt->num_sb; i++) { forward_dwtd4_2D( fptr, vector, as, ds, im, (unsigned)dwt->p_lx[i], (unsigned)dwt->p_ly[i]); } break; default: fprintf( stderr, "\n %s: wavelet filter #%d not supported!\n", rtn, dwt->filter); return (2); } free( vector); free( as); free( ds); return 0; }
/***************************************************************** * * Datei...: f_97L_control.c * Funktion: 9/7- und 5/3-Wavelet-Transformation * 2D mit Lifting-Schema * Autor...: Tilo Strutz * Datum...: 25.02.2009 * *****************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include "codec.h" #include "dwt.h" /*--------------------------------------------------------------* * f_97L_1d() *--------------------------------------------------------------*/ void f_97L_1d( float vector[], float as[], float ds[], int v_len, int a_len, int d_len) { register int i; register float *lp, *ap, *dp; /* inplace calculations */ /* first prediction step */ /* symmetric extension at right border
358
29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120:
D Quelltexte
121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: /* first update step */ 132: lp = &vector[1]; /* first true signal value */ 133: ap = &vector[1]; /* low- pass coefficients */ 134: dp = &vector[0]; /* high-pass coefficients */ 135: /* dummy detail value */ 136: dp[0] = dp[2]; 137: /* dummy detail value at left border for odd-length signals*/ 138: dp[v_len+1] = dp[v_len-1]; 139: for ( i = a_len; i > 0; i--, lp+=2, dp+=2, ap+=2 ) 140: { 141: *ap = *lp + (float)( (dp[0] + dp[2]) * coeff[1]); 142: } 143: 144: /* second prediction step */ /* symmetric extension at right border for even-length signals */ 145: 146: ap = &vector[1]; 147: ap[v_len] = ap[v_len-2]; 148: lp = &vector[2]; /* high-pass coefficients */ 149: dp = &ds[1]; 150: for ( i = d_len; i > 0; i--, ap+=2, dp++, lp+=2 ) 151: { 152: *dp = *lp + (float)( (ap[0] + ap[2]) * coeff[2]); 153: } 154: 155: /* second update step */ 156: lp = &vector[1]; /* low- pass coefficients */ 157: /* dummy detail value */ 158: ds[0] = ds[1]; 159: /* dummy detail value at left border for odd-length signals*/ 160: ds[d_len+1] = ds[d_len]; 161: ap = as; 162: dp = ds; /* high-pass coefficients */ 163: for ( i = a_len; i > 0; i--, dp++, ap++, lp+=2 ) { 164: *ap = *lp + (float)( (dp[0] + dp[1]) * coeff[3]); 165: } 166: } 167: 168: /*--------------------------------------------------------------* 169: * f_97L_2d() DWT eines 2D-Signals 170: *--------------------------------------------------------------*/ 171: void 172: f_97L_2d( float lptr[], float vector[], float as[], float ds[], 173: IMAGE *im, unsigned int ll_width, unsigned int ll_height) 174: { 175: register int x, y; 176: register float *lp, *lp1; 177: 178: int a_len, d_len; 179: int a_size, d_size; 180: float *lpx, *lpx2; 181: unsigned int width, ll_width_long; 182: 183: width = im->width; 184: 185: /* 186: * alle Zeilen 187: */ 188: if (ll_width > 2) 189: { 190: lp = lptr; 191: ll_width_long = sizeof(long) * ll_width; 192: a_len= (ll_width + 1) >> 1; 193: d_len = ll_width >> 1; 194: a_size = sizeof(long) * a_len; 195: d_size = sizeof(long) * d_len; 196: for( y = ll_height; y > 0; y--, lp += width) 197: { 198: /* let one element as border */ 199: (void*)memcpy( &vector[1], lp, ll_width_long); 200: f_97L_1d( vector, as, ds, ll_width, a_len, d_len); 201: (void*)memcpy( lp, as, a_size); /* copy back */ 202: (void*)memcpy( &lp[a_len], &ds[1], d_size); 203: } 204: } 205: else 206: { 207: fprintf( stderr,"\n too less columns in this LL-band (%d)", 208: ll_width); 209: } 210: 211: /* 212:
* alle Spalten */ if (ll_height > 2) { a_len= (ll_height + 1) >> 1; d_len = ll_height >> 1; a_size = sizeof(float) * a_len; d_size = sizeof(float) * d_len; lpx = lptr; lpx2 = lpx + a_len * width; for( x = ll_width; x > 0; x--, lpx++, lpx2++) { lp = lpx; /* let one element as border */ lp1 = &vector[1]; /* copy original data into vector */ for( y = ll_height; y > 0; y--, lp += width, lp1++) *lp1 = *lp;
* ’+1* because of 0th dummy element on left border */ vector[v_len+1] = vector[v_len-1]; lp = &vector[1]; /* first true signal value */ dp = &vector[2]; /* high-pass coefficients */ for ( i = d_len; i > 0; i--, lp+=2, dp+=2 ) { *dp = lp[1] + (float)( (lp[0] + lp[2]) * coeff[0]); }
f_97L_1d( vector, as, ds, ll_height, a_len, d_len); /* copy transformed data back into array */ lp = lpx; lp1 = as; /* approximation signal */ for( y = 0; y < a_len; y++, lp += width, lp1++) *lp = *lp1; lp = &lpx[a_len * width]; lp1 = &ds[1]; /* detail signal */ for( y = 0; y < (signed)d_len; y++, lp += width, lp1++) *lp = *lp1; } } else { fprintf( stderr,"\n too less rows in this LL-band (%d)", ll_height); } } /*--------------------------------------------------------------* * f_97L_control() loop trough subbands *--------------------------------------------------------------*/ int f_97L_control( IMAGE *im, DWT_PARAM *dwt, float lptr[]) { char *rtn="f_9_7L_control"; register i; float *vector, *as, *ds; unsigned int max_dim; max_dim = im->width; if (max_dim < im->height) max_dim = im->height; /** create arrays for 1D-Transformation **/ vector = (float*)malloc( sizeof(float) * (max_dim+2)); if ( vector == NULL) { fprintf(stderr,"\n %s: Unable to allocate vector!\n", rtn); return (2); } as = (float*)malloc( sizeof(float) * ((max_dim+1) / 2 + 2)); if ( as == NULL) { fprintf(stderr,"\n %s: Unable to allocate as!\n", rtn); return (2); } ds = (float*)malloc( sizeof(float) * ( max_dim / 2 +2)); if ( ds == NULL) { fprintf(stderr,"\n %s: Unable to allocate ds!\n", rtn); return (2); } /** forward 2D-transformation **/ switch (dwt->filter) { case BIO9_7: case BIO_53L: for (i = 0; i < dwt->num_sb; i++) { f_97L_2d( lptr, vector, as, ds, im, (unsigned)dwt->p_lx[i], (unsigned)dwt->p_ly[i]); } break; default: fprintf( stderr, "\n %s: wavelet filter #%d not supported!\n", rtn, dwt->filter); return (2); } free( vector); free( as); free( ds);
D.3 Waveletbasierte Bildkompression
213: return 0; 214: }
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87:
/***************************************************************** * * Datei...: quantise.c * Funktion: Quantisierung von transformierten Bildern * Autor...: Tilo Strutz * Datum...: 03.05.2000, 11.02.2009 * *****************************************************************/ #include <stdlib.h> #include <stdio.h> #include <math.h> #include "codec.h" #include "dwt.h" /*--------------------------------------------------------------* quantise() *---------------------------------------------------------------*/ void quantise( IMAGE *im, DWT_PARAM *dwt, float fptr[], long qptr[], delta_struct *delta) { int x, y, sbnr, sbnr1, r; unsigned long py, pos, xoff, xend, yoff, yend; /* * AA * */ xoff yoff xend yend
Teilband quantisieren
= = = =
0; 0; dwt->p_lx[dwt->num_sb]; dwt->p_ly[dwt->num_sb];
for ( y = yoff, py = yoff * im->width; y < (signed)yend; y++, py += im->width) { for ( x = xoff, pos = xoff + py; x < (signed)xend; x++, pos++) { if (fptr[pos] > 0.) qptr[pos] = (long)floor( fptr[pos] / delta->aa ); else qptr[pos] = -(long)floor( -fptr[pos] / delta->aa ); } } /* * AD, DA, DD Teilbaender quantisieren * */ for ( sbnr1 = dwt->num_sb; sbnr1 > 0; sbnr1--) { sbnr = sbnr1 - 1; r = dwt->num_sb - sbnr1; /* * DA */ xoff yoff xend yend
- Komponente = = = =
dwt->p_lx[sbnr1]; 0; dwt->p_lx[sbnr]; dwt->p_ly[sbnr1];
for ( y = yoff, py = yoff * im->width; y < (signed)yend; y++, py += im->width) { for ( x = xoff, pos = xoff + py; x < (signed)xend; x++, pos++) { if (fptr[pos] > 0.) qptr[pos] = (long)floor( fptr[pos] / delta->da[r] ); else qptr[pos] = -(long)floor( -fptr[pos] / delta->da[r] ); } } /* * AD */ xoff yoff xend yend
- Komponente = = = =
0; dwt->p_ly[sbnr1]; dwt->p_lx[sbnr1]; dwt->p_ly[sbnr];
for ( y = yoff, py = yoff * im->width; y < (signed)yend; y++, py += im->width) { for ( x = xoff, pos = xoff + py; x < (signed)xend; x++, pos++) { if (fptr[pos] > 0.) qptr[pos] = (long)floor( fptr[pos] / delta->ad[r] );
359
88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: } 114: } 115:
else qptr[pos] =
-(long)floor( -fptr[pos] / delta->ad[r] );
} }
/* * DD */ xoff yoff xend yend
- Komponente = = = =
dwt->p_lx[sbnr1]; dwt->p_ly[sbnr1]; dwt->p_lx[sbnr]; dwt->p_ly[sbnr];
for ( y = yoff, py = yoff * im->width; y < (signed)yend; y++, py += im->width) { for ( x = xoff, pos = xoff + py; x < (signed)xend; x++, pos++) { if (fptr[pos] > 0.) qptr[pos] = (long)floor( fptr[pos] / delta->dd[r] ); else qptr[pos] = -(long)floor( -fptr[pos] / delta->dd[r] ); } }
360
D Quelltexte
D.3.2 0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90:
Decoder
/**************************************************************** * * Datei...: d_main.c * Funktion: Main-Routine fuer Decodierung * Autor...: Tilo Strutz * Datum...: 03.03.2000, 11.02.2009 * ****************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include "get_option.h" #include "codec.h" #include "dwt.h" int decoder( IMAGE *im, DWT_PARAM *dwt, OPTION *op, FILE *in, FILE *out); /*--------------------------------------------------------------* main() *---------------------------------------------------------------*/ int main(int argc, char *argv[]) { char *rtn="WaveQAd"; char in_name[256], out_name[256]; int err; IMAGE ima, *im; DWT_PARAM dwt_par, *dwt; OPTION option, *op; FILE *in=stdin, *out=stdout; fprintf( stderr,"\n%s\t decoding...\n", title); im = &ima; op = &option; dwt = &dwt_par; strcpy( in_name, ""); strcpy( out_name, ""); while ( (optstr = (char*)get_option( argc, (const char**)argv)) != NULL) { switch (optstr[1]) { case ’i’: strcpy( in_name, OptArg); break; case ’o’: strcpy( out_name, OptArg); break; default: usage( argv[0]); } } /* Test, ob alle erforderlichen Parameter eingelesen wurden */ err = check_opt(argv[0]); if (err) goto end; /* Input-File oeffnen */ if ( strlen( in_name) != 0 ) { in = fopen( in_name, "rb"); if (in == NULL) { fprintf(stderr,"\n %s: cannot open %s for reading\n", rtn, in_name); perror(" "); err = 4; goto end; } } else in = stdin; /* Output-File oeffnen */ if ( strlen( out_name) != 0 ) { out = fopen( out_name, "wb"); if (out == NULL) { fprintf(stderr,"\n %s: cannot open %s for writing\n", rtn, out_name); perror(" "); err = 5; goto end; } } else out = stdout; err = decoder( im, dwt, op, in, out); end: if (out != NULL && out != stdout) fclose( out); if (in != NULL && in != stdin ) fclose( in); if (err) {
91: 92: 93: 94: 95: 96: 97: 98: 99: }
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
fprintf( stderr, "\nfailed with error %d.\n", err); exit( 1); } else { fprintf( stderr, "\nready.\n"); exit( 0); }
/**************************************************************** * * Datei...: d_usage.c * Funktion: Parameter fuer Decodierung * Autor...: Tilo Strutz * Datum...: 02.07.2000, 11.02.2009 * ****************************************************************/ #include <stdio.h> #include <stdlib.h> /* erlaubte Optionen, muss mit : beginnen! */ char *OPTIONSTRING = {":i:o:"}; char *NEEDEDOPTIONS = {":"}; /* erforderliche Optionen */ char *title={"plain image decoder ’WaveQA’ v02/2009"}; /*--------------------------------------------------------------* usage() *---------------------------------------------------------------*/ void usage(char *name) { fprintf( stderr,"\n %s\n", title); fprintf(stderr, "\n\ Usage: %s [options]\n\n\ Legal Options: \n\ -i %%s ... name of input image (default: stdin)\n\ -o %%s ... name of compressed image (default: stdout)\n\ ", name); }
/**************************************************************** * * Datei...: decoder.c * Funktion: Transformationscodec (decoder) * Author..: Tilo Strutz * Datum...: 03.03.2000, 25.02.2009 * ****************************************************************/ #include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> #include "codec.h" #include "dwt.h" #include "ac2_proto.h" void void int void long
decode_tb( IMAGE *im, DWT_PARAM *dwt, long lptr[], FILE *out); decode_aa( IMAGE *im, DWT_PARAM *dwt, long lptr[], FILE *out); in_bits_READ( int len, FILE *stream); in_bits_INIT( void); in_bits_FIN( void);
/*--------------------------------------------------------------* decoder() *---------------------------------------------------------------*/ int decoder( IMAGE *im, DWT_PARAM *dwt, OPTION *op, FILE *in, FILE *out) { char *rtn="decoder"; int err; long *lptr=NULL, l; float *fptr=NULL; unsigned char *bptr=NULL; unsigned long in_bytes; delta_struct delt, *delta; delta = &delt; in_bits_INIT(); /* Header decodieren */ im->width = in_bits_READ( 12, in); im->height = in_bits_READ( 12, in); dwt->filter = in_bits_READ( 2, in); dwt->num_sb = in_bits_READ( 3, in); op->quality = in_bits_READ( 11, in); im->size = im->width * im->height; /* Speicher anlegen und alles auf Null setzen */ lptr = (long*)calloc( im->size, sizeof(long)); if (lptr == NULL)
D.3 Waveletbasierte Bildkompression
50: { 51: fprintf(stderr, "\n %s: cannot allocate lptr !\n", rtn); 52: err = 10; 53: goto end; 54: } 55: 56: /* Transformationsparameter bestimmen */ 57: get_dwt_params( im, dwt); 58: 59: /* Approximationssignal decodieren */ 60: decode_aa( im, dwt, lptr, in); 61: 62: /* Teilbandsignale decodieren */ 63: if (dwt->num_sb > 0) decode_tb( im, dwt, lptr, in); 64: 65: /* Speicher anlegen */ 66: fptr = (float*)calloc( im->size, sizeof(float)); 67: if (fptr==NULL) 68: { 69: fprintf(stderr, "\n %s: cannot allocate fptr !\n", rtn); 70: err = 11; 71: goto end; 72: } 73: 74: /* Transformationskoeffizienten rekonstruieren */ 75: get_quant_param( delta, dwt, op); 76: reconstruct( im, dwt, fptr, lptr, delta); 77: 78: free( lptr); lptr = NULL; 79: 80: /* Bild zuruecktransformieren */ 81: if (dwt->num_sb > 0) 82: { 83: if (dwt->filter == BIO9_7 || dwt->filter == BIO_53L) 84: { 85: err = i_97L_control( im, dwt, fptr); 86: } 87: else 88: { 89: err = inverse_dwt_control( im, fptr, dwt); 90: } 91: if (err) goto end; 92: } 93: 94: /* Speicher anlegen */ 95: bptr = (unsigned char*)calloc( im->size, sizeof(unsigned char)); 96: if (bptr == NULL) 97: { 98: fprintf(stderr, "\n %s: cannot allocate bptr !\n", rtn); 99: err = 12; 100: goto end; 101: } 102: 103: /* Bild konvertieren */ 104: for (l = im->size-1; l >= 0; l--) 105: { 106: if (fptr[l] > 255.0) bptr[l] = 255; 107: else if (fptr[l] < 0.0) bptr[l] = 0; 108: else bptr[l] = (unsigned char)floor( fptr[l] + 0.5); 109: } 110: free( fptr); fptr = NULL; 111: 112: /* schreibe PGM-Header */ 113: fprintf( out, "P5\n"); 114: fprintf( out, "%d %d\n", im->width, im->height); 115: fprintf( out, "255\n"); 116: /* Bilddaten ausgeben */ 117: fwrite( bptr, 1, im->size, out); 118: free( bptr); bptr = NULL; 119: 120: in_bytes = in_bits_FIN(); 121: 122: fprintf( stderr,"\n\t%ld Bytes gelesen", in_bytes); 123: fprintf( stderr,", %ld Bytes geschrieben", im->size); 124: fprintf( stderr,", Expansionsrate; %6.3f \n", 125: (float)im->size / (float)in_bytes); 126: 127: end: 128: if (bptr != NULL) free( bptr); 129: if (fptr != NULL) free( fptr); 130: if (lptr != NULL) free( lptr); 131: return err; 132: }
0: 1: 2: 3: 4: 5: 6:
/**************************************************************** * * Datei...: decode_tb.c * Funktion: Decodierung der Teilbandsignale * Autor...: Tilo Strutz * Datum...: 23.05.2000 *
361
7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98:
****************************************************************/ #include <stdlib.h> #include <stdio.h> #include <string.h> #include "codec.h" #include "dwt.h" #include "ac2.h" #include "ac2_proto.h" int xoff, yoff, xend, yend; unsigned long Hset[MAX_DEPTH][17], Hq[NUM_OF_SYM+1], Hsign[3]; unsigned long Hesc[NUM_QUANT_CATEG+1], Hbin[3]; int in_bits_READ( int len, FILE *stream); void start_model( unsigned long H[], int K, unsigned long max); void update_model( unsigned long H[], int K, int symbol, unsigned long max); /*--------------------------------------------------------------* decode_quant() *---------------------------------------------------------------*/ long decode_quant( unsigned long H[], unsigned long Hs[],FILE *in) { int i, q, sign; long mask; unsigned long cum; cum = ac2_get_cum( H[NUM_OF_SYM]); q = NUM_OF_SYM - 1; while ( cum < H[q]) q--; ac2_decode( H[q], H[q+1], H[NUM_OF_SYM], in); update_model( H, NUM_OF_SYM, q, Q1); q = NUM_OF_QSYM - q; if (q > MAX_QUANT_VAL) { /* ESCAPE */ cum = ac2_get_cum( Hesc[NUM_QUANT_CATEG]); i = NUM_QUANT_CATEG - 1; while ( cum < Hesc[i]) i--; ac2_decode( Hesc[i], Hesc[i+1], Hesc[NUM_QUANT_CATEG],in); update_model( Hesc, NUM_QUANT_CATEG, i, Q1); q = 0; mask = 1 >= 1; q = (q 0) { if (s & 1) quad_decode( im, lptr, x, y, d, in); if (s & 2) quad_decode( im, lptr, x + (1p_ly[sbnr1];
start_model( Hq, NUM_OF_SYM, Q1); start_model( Hesc, NUM_QUANT_CATEG, Q1); if (depth) { for ( i = depth-1; i >= 0; i--) start_model( Hset[i], 16, Q1); /* quad_tree-Codierung */ for( y = yoff; y < yend; y += step) { start_model( Hsign, 2, Q1); for( x = xoff; x < xend; x += step) { quad_decode( im, lptr, x, y, depth, in); } } } else { start_model( Hsign, 2, Q1); for( y = yoff; y < yend; y += step) { for( x = xoff; x < xend; x += step) { lptr[x + y*im->width] = decode_quant( Hq, Hsign, in); } } } /*
191: * AD - Teilband 192: */ 193: xoff = 0; 194: yoff = dwt->p_ly[sbnr1]; 195: xend = dwt->p_lx[sbnr1]; 196: yend = dwt->p_ly[sbnr]; 197: 198: start_model( Hq, NUM_OF_SYM, Q1); 199: start_model( Hesc, NUM_QUANT_CATEG, Q1); 200: 201: if (depth) 202: { 203: for ( i = depth-1; i >= 0; i--) 204: start_model( Hset[i], 16, Q1); 205: 206: /* quad_tree-Codierung */ 207: for( y = yoff; y < yend; y += step) 208: { 209: start_model( Hsign, 2, Q1); 210: for( x = xoff; x < xend; x += step) 211: { 212: quad_decode( im, lptr, x, y, depth, in); 213: } 214: } 215: } 216: else 217: { 218: start_model( Hsign, 2, Q1); 219: for( y = yoff; y < yend; y += step) 220: { 221: for( x = xoff; x < xend; x += step) 222: { 223: lptr[x + y*im->width] = decode_quant( Hq, Hsign,in); 224: } 225: } 226: } 227: 228: /* 229: * DD - Teilband 230: */ 231: xoff = dwt->p_lx[sbnr1]; 232: yoff = dwt->p_ly[sbnr1]; 233: xend = dwt->p_lx[sbnr]; 234: yend = dwt->p_ly[sbnr]; 235: 236: start_model( Hq, NUM_OF_SYM, Q1); 237: start_model( Hesc, NUM_QUANT_CATEG, Q1); 238: 239: if (depth) 240: { 241: for ( i = depth-1; i >= 0; i--) 242: start_model( Hset[i], 16, Q1); 243: 244: /* quad_tree-Codierung */ 245: for( y = yoff; y < yend; y += step) 246: { 247: start_model( Hsign, 2, Q1); 248: for( x = xoff; x < xend; x += step) 249: { 250: quad_decode( im, lptr, x, y, depth, in); 251: } 252: } 253: } 254: else 255: { 256: start_model( Hsign, 2, Q1); 257: for( y = yoff; y < yend; y += step) 258: { 259: for( x = xoff; x < xend; x += step) 260: { 261: lptr[x + y*im->width] = decode_quant( Hq, Hsign,in); 262: } 263: } 264: } 265: } 266: finish_decode2( in); 267: }
D.3 Waveletbasierte Bildkompression
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39:
/**************************************************************** * * Datei: decode_aa.c * Funktion: Encodierung des Approximationssignals * Autor: Tilo Strutz * Date: 03.03.2000 * ****************************************************************/ #include <stdlib.h> #include <stdio.h> #include <math.h> #include "codec.h" #include "dwt.h"
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
/***************************************************************** * * Datei...: reconstruct.c * Funktion: Rekonstruktion von quantisierten Koeffizienten * Autor...: Tilo Strutz * Datum...: 19.04.2000, 11.02.2009 * *****************************************************************/ #include <stdlib.h> #include <stdio.h> #include <math.h> #include "codec.h" #include "dwt.h"
int
in_bits_READ( int len, FILE *stream);
/*--------------------------------------------------------------* decode_aa() *---------------------------------------------------------------*/ void decode_aa( IMAGE *im, DWT_PARAM *dwt, long lptr[], FILE *in) { int x, y, len, sign; long xmin; unsigned long py, pos; xmin = in_bits_READ( 12, in); sign = in_bits_READ( 1, in); if (sign ) xmin = -xmin; len = in_bits_READ( 5, in); /* Lesen der Quantisierungssymbole plus Offset */ for( y = dwt->ly, py = 0; y > 0; y--, py += im->width) { for( x = dwt->lx, pos = py; x > 0; x--, pos++) { lptr[pos] = xmin + in_bits_READ( len, in); } } }
/*--------------------------------------------------------------* reconstruct() *---------------------------------------------------------------*/ void reconstruct( IMAGE *im, DWT_PARAM *dwt, float fptr[], long qptr[], delta_struct *delta) { int x, y, sbnr, sbnr1, r; unsigned long py, pos, xoff, xend, yoff, yend; /* * AA Teilband rekonstruieren * */ xoff yoff xend yend
= = = =
0; 0; dwt->p_lx[dwt->num_sb]; dwt->p_ly[dwt->num_sb];
for ( y = yoff, py = yoff * im->width; y < (signed)yend; y++, py += im->width) { for ( x = xoff, pos = xoff + py; x < (signed)xend; x++, pos++) { if (qptr[pos] == 0) fptr[pos] = 0.; else if (qptr[pos] > 0) fptr[pos] = ((float)qptr[pos] + 0.5F) * delta->aa; else fptr[pos] = ((float)qptr[pos] - 0.5F) * delta->aa; } } /* * AD, DA, DD Teilbaender rekonstruieren * */
363
50: for ( sbnr1 = dwt->num_sb; sbnr1 > 0; sbnr1--) 51: { 52: sbnr = sbnr1 - 1; 53: r = dwt->num_sb - sbnr1; 54: 55: /* 56: * DA - Komponente 57: */ 58: xoff = dwt->p_lx[sbnr1]; 59: yoff = 0; 60: xend = dwt->p_lx[sbnr]; 61: yend = dwt->p_ly[sbnr1]; 62: 63: for ( y = yoff, py = yoff * im->width; y < (signed)yend; 64: y++, py += im->width) 65: { 66: for ( x = xoff, pos = xoff + py; x < (signed)xend; x++, pos++) 67: { 68: if (qptr[pos] == 0) fptr[pos] = 0.; 69: else if (qptr[pos] > 0) 70: fptr[pos] = ((float)qptr[pos] + 0.5F) * delta->da[r]; 71: else 72: fptr[pos] = ((float)qptr[pos] - 0.5F) * delta->da[r]; 73: } 74: } 75: 76: /* 77: * AD - Komponente 78: */ 79: xoff = 0; 80: yoff = dwt->p_ly[sbnr1]; 81: xend = dwt->p_lx[sbnr1]; 82: yend = dwt->p_ly[sbnr]; 83: 84: for ( y = yoff, py = yoff * im->width; y < (signed)yend; 85: y++, py += im->width) 86: { 87: for ( x = xoff, pos = xoff + py; x < (signed)xend; x++, pos++) 88: { 89: if (qptr[pos] == 0) fptr[pos] = 0.; 90: else if (qptr[pos] > 0) 91: fptr[pos] = ((float)qptr[pos] + 0.5F) * delta->ad[r]; 92: else 93: fptr[pos] = ((float)qptr[pos] - 0.5F) * delta->ad[r]; 94: } 95: } 96: 97: /* 98: * DD - Komponente 99: */ 100: xoff = dwt->p_lx[sbnr1]; 101: yoff = dwt->p_ly[sbnr1]; 102: xend = dwt->p_lx[sbnr]; 103: yend = dwt->p_ly[sbnr]; 104: 105: for ( y = yoff, py = yoff * im->width; y < (signed)yend; 106: y++, py += im->width) 107: { 108: for ( x = xoff, pos = xoff + py; x < (signed)xend; x++, pos++) 109: { 110: if (qptr[pos] == 0) fptr[pos] = 0.; 111: else if (qptr[pos] > 0) 112: fptr[pos] = ((float)qptr[pos] + 0.5F) * delta->dd[r]; 113: else 114: fptr[pos] = ((float)qptr[pos] - 0.5F) * delta->dd[r]; 115: } 116: } 117: } 118: } 119:
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
/**************************************************************** * * Datei...: idwt_2D.c * Funktion: inverse 2D- Wavelet-Transformation * Autor...: Tilo Strutz * Datum...: 01.05.2000 * ****************************************************************/ #include <stdlib.h> #include <stdio.h> #include <string.h> #include "dwt.h" /*--------------------------------------------------------------* inverse_dwt53_2D() *---------------------------------------------------------------*/ void inverse_dwt53_2D( float fptr[], float vector[], float as[], float ds[], IMAGE *im, unsigned int width, unsigned int height) {
364
20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111:
D Quelltexte
int xodd=0, yodd=0; float *p, *p1, *px, *pv, *ap, *dp; unsigned int x, y, xvlh, yvlh, width_float, width_float_d; if (width % 2) xodd = if (height % 2) yodd = xvlh = (width + 1) >> yvlh = (height + 1) >>
1; 1; 1; 1;
/* alle Spalten */ px = fptr; for( x = width; x > 0; x--, px++) { /* aus Spalte lesen und halbieren */ p = px; pv = &px[ yvlh * im->width ]; ap = as; dp = ds; for ( y = yvlh-1; y > 0; y--, p += im->width, pv += im->width, ap++, dp++) { *ap = 0.5 * *p; /* Approx.signal */ *dp = 0.5 * *pv; /* Detail signal */ } if (yodd) *ap = 0.5 * *p; else { *ap = 0.5 * *p; *dp = 0.5 * *pv;} inverse_dwt53( vector, as, ds, height+yodd, yodd); /* Zeilenvektor in Spalte kopieren */ p = px; p1 = vector; for ( y = height; y > 0; y--, p += im->width, p1++) *p = *p1; } /* alle Zeilen */ p = fptr; width_float = sizeof(float) * xvlh; width_float_d = sizeof(float) * (xvlh - xodd); for( y = height; { (void*)memcpy( (void*)memcpy( inverse_dwt53( }
y > 0; y--, p += im->width) as, p, width_float); ds, &p[xvlh], width_float_d); p, as, ds, width+xodd, xodd);
} /*--------------------------------------------------------------* inverse_dwtd4_2D() *---------------------------------------------------------------*/ void inverse_dwtd4_2D( float fptr[], float vector[], float as[], float ds[], IMAGE *im, unsigned int width, unsigned int height) { float *p, *p1, *px, *pv, *ap, *dp; unsigned int x, y, xvlh, yvlh, width_float; xvlh = width >> 1; yvlh = height >> 1; /* alle Spalten */ px = fptr; for( x = width; x > 0; x--, px++) { /* aus Spalte lesen und halbieren */ p = px; pv = &px[ yvlh * im->width ]; ap = as; dp = ds; for ( y = yvlh; y > 0; y--, p += im->width, pv += im->width, ap++, dp++) { *ap = 0.5 * *p; /* Approx.signal */ *dp = 0.5 * *pv; /* Detail signal */ } inverse_dwt4( vector, as, ds, height); /* Zeilenvektor in Spalte kopieren */ p = px; p1 = vector; for ( y = height; y > 0; y--, p += im->width, p1++) *p = *p1; } /* alle Zeilen */ p = fptr; width_float = sizeof(float) * xvlh; for( y = height; y > 0; y--, p += im->width) {
112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177:
0: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
(void*)memcpy( as, p, width_float); (void*)memcpy( ds, &p[xvlh], width_float); inverse_dwt4( p, as, ds, width); } } /*--------------------------------------------------------------* inverse_dwt_control() *---------------------------------------------------------------*/ int inverse_dwt_control( IMAGE *im, float fptr[], DWT_PARAM *dwt) { char *rtn="inverse_dwt_control"; int i; float *vector, *as, *ds; unsigned int max_dim; max_dim = im->width; if (max_dimheight) max_dim = im->height; vector = (float*)malloc( sizeof(float) * max_dim); if ( vector==NULL) { fprintf( stderr,"\n %s: Unable to allocate vector!\n", rtn); return (1); } as = (float*)malloc( sizeof(float) * max_dim / 2); if ( as==NULL) { fprintf( stderr,"\n %s: Unable to allocate as!\n", rtn); return (1); } ds = (float*)malloc( sizeof(float) * max_dim / 2); if ( ds==NULL) { fprintf( stderr,"\n %s: Unable to allocate ds!\n", rtn); return (1); } /** inverse 2D-transformation **/ switch (dwt->filter) { case BIO5_3: for (i = dwt->num_sb-1; i >= 0; i--) { inverse_dwt53_2D( fptr, vector, as, ds, im, (unsigned)dwt->p_lx[i], (unsigned)dwt->p_ly[i]); } break; case DAUB4: for (i = dwt->num_sb-1; i >= 0; i--) { inverse_dwtd4_2D( fptr, vector, as, ds, im, (unsigned)dwt->p_lx[i], (unsigned)dwt->p_ly[i]); } break; default: fprintf( stderr, "\n %s: wavelet filter #%d not supported!\n", rtn, dwt->filter); return (2); } free( vector); free( as); free( ds); return 0; }
/***************************************************************** * * Datei...: i_97L_control.c * Funktion: inverse 9/7- und 5/3-Wavelet-Transformation * 2D mit Lifting * Autor...: Tilo Strutz * Datum...: 25.02.2009 * *****************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include "codec.h" #include "dwt.h" /*--------------------------------------------------------------* * i_97L_1d() *--------------------------------------------------------------*/ void i_97L_1d( float vector[], float as[], float ds[], unsigned int v_len, int a_len, int d_len) { register int i; register float *lp, *ap, *dp;
D.3 Waveletbasierte Bildkompression
24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115:
116: 117: 118: 119: 120: /* inverse second update step */ 121: lp = &vector[1]; /* low- pass coefficients */ 122: /* dummy detail value */ 123: ds[0] = ds[1]; 124: /* dummy detail value at left border for odd-length signals*/ 125: ds[d_len+1] = ds[d_len]; 126: ap = as; 127: dp = ds; /* high-pass coefficients */ 128: for ( i = a_len; i > 0; i--, dp++, ap++, lp+=2 ) 129: { 130: *lp = *ap - (float)( (dp[0] + dp[1]) * coeff[3]); 131: } 132: 133: /* reverse second prediction step */ /* symmetric extension at right border for even-length signals */ 134: 135: vector[v_len+1] = vector[v_len-1]; 136: lp = &vector[2]; /* high-pass coefficients */ 137: ap = &vector[1]; 138: dp = &ds[1]; 139: for ( i = d_len; i > 0; i--, ap+=2, dp++, lp+=2 ) 140: { 141: *lp = *dp - (float)( (ap[0] + ap[2]) * coeff[2]); 142: } 143: 144: /* reverse first update step */ 145: lp = &vector[1]; /* first true signal value */ 146: ap = &vector[1]; /* low- pass coefficients */ 147: dp = &vector[0]; /* high-pass coefficients */ 148: /* dummy detail value at left border for odd-length signals*/ 149: dp[v_len+1] = dp[v_len-1]; 150: dp[0] = dp[2]; 151: for ( i = a_len; i > 0; i--, lp+=2, dp+=2, ap+=2 ) 152: { 153: *lp = *ap - (float)( (dp[0] + dp[2]) * coeff[1]); 154: } 155: 156: /* symmetric extension at right border 157: * ’+1* because of 0th dummy element on left border 158: */ vector[v_len+1] = vector[v_len-1]; 159: /* dummy detail value */ 160: vector[0] = vector[2]; 161: 162: 163: /* first prediction step */ 164: lp = &vector[1]; /* first true signal value */ 165: dp = &vector[2]; /* high-pass coefficients */ 166: for ( i = d_len; i > 0; i--, lp+=2, dp+=2 ) 167: { 168: lp[1] = *dp - (float)( (lp[0] + lp[2]) * coeff[0]); 169: } 170: } 171: 172: 173: /*--------------------------------------------------------------* 174: * i_97L_2d() IDWT eines 2D-Signals 175: *--------------------------------------------------------------*/ 176: void i_97L_2d (float lptr[], float vector[], float as[], float ds[], 177: IMAGE *im, unsigned int ll_width, 178: unsigned int ll_height) 179: { 180: register int x, y; 181: register float *lp, *lp1; 182: int a_len, d_len; 183: int a_size, d_size; 184: float *lpx; 185: unsigned int width, ll_width_float; 186: 187: width = im->width; 188: 189: /* 190: * alle Spalten 191: */ 192: if (ll_height > 2) 193: { 194: lpx = lptr; 195: a_len= (ll_height + 1) >> 1; 196: d_len = ll_height >> 1; 197: a_size = sizeof(float) * a_len; 198: d_size = sizeof(float) * d_len; 199: for( x = ll_width; x > 0; x--, lpx++) 200: { 201: /* copy data into arrays */ 202: lp = lpx; 203: lp1 = as; /* approximation signal */ 204: for( y = 0; y < a_len; y++, lp += width, lp1++) 205: *lp1 = *lp; 206:
365
lp = &lpx[a_len * width]; lp1 = &ds[1]; /* detail signal */ for( y = 0; y < (signed)d_len; y++, lp += width, lp1++) *lp1 = *lp;
/* inplace calculations */
i_97L_1d( vector, as, ds, ll_height, a_len, d_len); lp = lpx; for( y=0; y < (signed)ll_height; y++, lp += width) *lp = vector[y+1]; } } /* * alle Zeilen */ if (ll_width > 2) { lp = lptr; ll_width_float = sizeof(float) * ll_width; a_len= (ll_width + 1) >> 1; d_len = ll_width >> 1; a_size = sizeof(float) * a_len; d_size = sizeof(float) * d_len; for( y = 0; y < (signed)ll_height; y++, lp += width) { (void*)memcpy( as, lp, a_size); (void*)memcpy( &ds[1], &lp[a_len], d_size); i_97L_1d( vector, as, ds, ll_width, a_len, d_len); (void*)memcpy( lp, &vector[1], ll_width_float); } } } /*--------------------------------------------------------------* * i_97L_control() loop trough subbands *--------------------------------------------------------------*/ int i_97L_control( IMAGE *im, DWT_PARAM *dwt, float lptr[]) { char *rtn="i_9_7L_control"; register i; float *vector, *as, *ds; unsigned int max_dim; max_dim = im->width; if (max_dim < im->height) max_dim = im->height; /** create arrays for 1D-Transformation **/ vector = (float*)malloc( sizeof(float) * (max_dim+2)); if ( vector == NULL) { fprintf(stderr,"\n %s: Unable to allocate vector!\n", rtn); return (2); } as = (float*)malloc( sizeof(float) * (max_dim+1) / 2 +2); if ( as == NULL) { fprintf(stderr,"\n %s: Unable to allocate as!\n", rtn); return (2); } ds = (float*)malloc( sizeof(float) * (max_dim / 2 +2)); if ( ds == NULL) { fprintf(stderr,"\n %s: Unable to allocate ds!\n", rtn); return (2); }
/** forward 2D-transformation **/ switch (dwt->filter) { case BIO9_7: case BIO_53L: for ( i = dwt->num_sb-1; i >= 0; i--) { i_97L_2d( lptr, vector, as, ds, im, (unsigned)dwt->p_lx[i], (unsigned)dwt->p_ly[i]); } break; default: fprintf( stderr, "\n %s: wavelet filter #%d not supported!\n", rtn, dwt->filter); return (2); } free( vector); free( as); free( ds); return 0; }
366
Anhang E
L¨ osungen zu ausgew¨ ahlten Aufgaben 2.7 H(X) < H(Y ) 2.8 a) H(X) = 6.637 bit/Zahl
b) H0 = 6.644 bit/Zahl
2.10 a) P SN R = 28.1 dB 3.2
2 bit/Symbol
4.1 a) ΔR0 = 0.339 bit/Symbol b) ΔR(X) = li - Entropie H(X) = 2.3 - 2.246 = 0.054 bit/Symbol c) CR = log2 (6) / li = 3/2.3 = 1.304 4.3 a) Codewort: ’0001 00001’ l = 9 b) nein, denn 65 = ‘1000001’ ben¨ otigt n=7 Bits, also w¨are k = n − 1 = 6 die beste Sch¨ atzung 4.4 a) Bitstrom ’001101 1000’ 4.5 a) ‘abcdb’ b) Bitstrom ’000000101011101’ 4.6 a) ΔR(X) = 1.125 bit/Symbol b) li = 1.875 Bits/Symbol c) CR = 1.6 5.1 80 Bits 7 11 4 5.2 p(a) = 40 p(b) = 18 40 p(c) = 40 p(d) = 40 S = 73 Bits + Aufwand, um Code zu u ¨ bertragen ΔR(X) = 0.0222 bit/Symbol
E L¨ osungen zu ausgew¨ ahlten Aufgaben 5.3 H(X|X) ≈ 1.2155 bit/Symbol, H(XX) ≈ 1.509 bit/Symbol 59 Bits + Aufwand f¨ ur Code 5.4 59 Bits + Aufwand f¨ ur vier Codes (si , r − 1) b1 d0 b3 c4 a1 b3 a1 c5 b1 d2 a0 b4 a1 b0“, 2 × 14 Symbole ” 5.6 70 Bits
5.5
5.7 60 Bits + Aufwand f¨ ur 2 Codes 5.8 88 Bits + Aufwand f¨ ur Code 5.9 45 Bits + Aufwand f¨ ur Code 5.10 82 Bits 5.11 78 Bits 5.12 ‘1031000300003020001020000020300320000101’ H(X) = 1.486 bit/Symbol 63 Bits + Aufwand f¨ ur Code 5.13 68 Bits 5.14 b) H(X) = 0.9183 bit/Symbol c) li ≥ H(X|X) = 0.8571 bit/Symbol 5.15 a) H(X) = 1.585 bit/Symbol b) H(X|X) = 1.0 bit/Symbol c) H(XX) = 1.2925 bit/Symbol 5.16 a) p(s1 ) = 0.25, p(s2 ) = 0.25, p(s3 ) = 0.5 b) H(X|X) = 1.274 bit/Symbol 5.17 a) p(S) =
2 24 ,
p(W ) =
5 24 ,
p(N ) =
17 24
c) H(X) = 1.122608 H(X|X) = 0.901875 bit/Symbol H(XX) = 1.012241 bit/Symbol
367
368
E L¨osungen zu ausgew¨ahlten Aufgaben
5.18
6.1 a) b) c) d) e)
σx2 = 4.80, H(X) = 2.846 bit/Symbol σe2 = 1.69, H(E) = 2.264 bit/Symbol G = 2.84 Wertebereich −7 ≤ e[n] ≤ +7 ΔR(X) = 0.086 bit/Symbol
6.2 a) X = {9.0000 -1.6892 0 -1.4651} b) x = {2.9228 4.6121 4.3879 6.0772} 6.3 ⎛
34 8 4 ⎜ 4 10 −2 C=⎜ ⎝ 0 −6 −2 2 4 0
⎞ 2 4 ⎟ ⎟ 0 ⎠ 2
369
Formelzeichen und Abku ¨ rzungen ∈ ∀ ≈ := >
E[x]
ist Element von f¨ ur alle ungef¨ ahr gleich Zuweisungsoperator Bitshift-Operation nach links (entspricht Multiplikation mit 2) Bitshift-Operation nach rechts (entspricht Division durch 2 mit Abrunden) Korrespondenz zwischen einem Zeitsignal und seinem Spektrum ganzzahliger Anteil von x.y → x x ,y = 0 kleinster ganzzahliger Wert gr¨ oßer gleich x.y → x + 1 , y = 0 Rest der ganzzahligen Division x durch y (x modulo y oder in C: x % y), z.B.: 7 mod 3 = 1 quantisierter Wert von x Norm oder euklidischer Abstand zwischen den Vektoren a und b Skalarprodukt der Vektoren a und b Intervall in den Grenzen von einschließlich xq bis ausschließlich xq+1 Matrix der Hintransformation mit den Elementen a[n, k] transponierte Matrix von A Approximations- oder Tiefpasssignal Matrix der R¨ ucktransformation mit den Elementen b[k, n] Skalierungsmatrix Verarbeitungsbreite in Bits im arithmetischen Coder Codewert f¨ ur Symbol si Kontext Detail- oder Hochpasssignal Abstand der Vektoren a und b Verzerrungsmaß (engl.: distortion) Intervallbreite N −1 xn Erwartungswert von x, E[x] = N1
dn , d[n] e[n], e eM eq f fs
Wavelet- oder Detailkoeffizient zeitdiskretes Pr¨ adiktionsfehlersignal, Pr¨ adiktionsfehlerwert vorzeichenbereinigter Pr¨ adiktionsfehler Quantisierungsfehler Frequenz Abtastfrequenz (engl.: sampling frequency)
•−−−◦ x.y
x.y x mod y [x]Q ||a − b|| < a, b > [xq , xq+1 ) A = (a[n, k]) AT = (a[k, n]) a[n] B = (b[k, n]) C B ci cx d[n] d(a, b) D Δ
n=0
370 f (x) f [n] g0 [n] g1 [n] G0 (z) G1 (z) h0 [n] h1 [n] H0 (z) H1 (z) hi Hi , H(si ) Hk [i] H H(X) H(X|X) H(XX) I(si ) j k K Kxx [m] li l m N pi , p(si ) p(si |sj ) p(sj si ) pk [i] P ϕ ψ q Qs Qk,l R ρxx [m] ΔR ΔR0 ΔR(X) ΔR(X|X) R
Formelzeichen und Abk¨ urzungen zeitkontinuierliche Funktion von x zeitdiskrete Funktion von n zeitdiskrete Impulsantwort eines Synthese-Tiefpassfilters zeitdiskrete Impulsantwort eines Synthese-Hochpassfilters zeitdiskrete Impulsantwort eines Synthese-Tiefpassfilters im z-Bereich zeitdiskrete Impulsantwort eines Synthese-Hochpassfilters im z-Bereich zeitdiskrete Impulsantwort eines Analyse-Tiefpassfilters zeitdiskrete Impulsantwort eines Analyse-Hochpassfilters zeitdiskrete Impulsantwort eines Analyse-Tiefpassfilters im z-Bereich zeitdiskrete Impulsantwort eines Analyse-Hochpassfilters im z-Bereich relative H¨ aufigkeit von i absolute H¨ aufigkeit des Symbols si Vektor-Array mit kumulativen H¨ aufigkeiten Entropie Entropie des Quellensignals, Signalentropie bedingte Entropie Verbundentropie Informationsgehalt des Symbols si √ ist gleich −1 Codierungsparameter f¨ ur Rice-Codes Anzahl verschiedener Symbole in einem Alphabet Autokorrelationsfunktion von x[n] Codewortl¨ ange f¨ ur Symbol si mittlere Codewortl¨ ange Codierungsparameter f¨ ur Golomb-Codes Menge der nat¨ urlichen Zahlen Wahrscheinlichkeit des Ereignisses si , Zustandswahrscheinlichkeit bedingte Wahrscheinlichkeit, Wahrscheinlichkeit des Ereignisses si unter der Bedingung sj Verbundwahrscheinlichkeit (Einzelquelle) Wahrscheinlichkeit, dass sj und si in dieser Reihenfolge auftreten Vektor-Array mit kumulativen Wahrscheinlichkeiten Phrase Skalierungsfunktion Waveletfunktion Quantisierungssymbol = quantisierter Transformationskoeffizient; Intervallnummer Qualit¨ atsparameter Quantisierungswert an der Position [k, l] Bitrate [Bits/Symbol] Korrelationskoeffizient Redundanz Redundanz einer Quelle Codierungsredundanz Intersymbolredundanz Menge der reellen Zahlen
Formelzeichen und Abk¨ urzungen si σe2 σq2 σx2
371
Symbol, Zeichen, Ereignis i Fehlervarianz Varianz des Quantisierungsfehlers eq Signalvarianz ⎧ ⎪ +1 f¨ ur x > 0 ⎨ sgn(x) Signum-Funktion: sgn(x) = 0 f¨ ur x = 0 ⎪ ⎩ −1 f¨ ur x < 0 T Abbildungsvorschrift, Transformation vn Vektor mit Index n vx x-Komponente eines Verschiebungsvektors vy y-Komponente eines Verschiebungsvektors WA (8) Matrix der Wavelet-Transformation mit einer Signall¨ ange von 8 WB (8) Matrix der inversen Wavelet-Transformation mit einer Signall¨ ange von 8 {x[n]} zeitdiskretes Signal, Folge von Symbolen x[n] n-tes Element eines zeitdiskretes Signals x ˆ[n] gesch¨ atzter Wert von x[n] x [n] modifizierter x[n]-Wert x mittlerer Wert von x x Signalvektor (x0 x1 x2 . . . xn ) xq untere Grenze des Intervalls q Xk,l Transformationskoeffizient an der Position [k, l] X(z) zeitdiskretes Signal im z-Bereich yq Rekonstruktionswert des Intervalls q Z = {si |1 ≤ i ≤ K} Symbolalphabet, Menge von K verschiedenen Symbolen si Z Menge der ganzen Zahlen Z {x[n]} z-Transformierte von x[n]
ASCII AKF AVC Cb CCIR CCITT Cg CIF Co CODEC COC COD CQF Cr CRC CWT
American Standard Code of Information Interchange Autokorrelationsfunktion Advanced Video Coding Farbdifferenzwert (Chrominanz blue) des YCbCr-Farbmodells International Radio Consultative Committee International Telephone and Telegraph Consultative Committee Farbdifferenzwert (Chrominanz green) des YCoCg-Farbmodells Bildformat f¨ ur die Videokompression bei mittleren Bitraten (engl.: Common Intermediate Format) Farbdifferenzwert (Chrominanz orange) des YCbCr-Farbmodells enCOder/DECoder JPEG-2000-Marke (engl.: Coding Style Component) JPEG-2000-Marke (engl.: Coding Style Default) Konjugiert-Quadratur-Filterbank (engl.: Conjugate Quadrature Filterbank) Farbdifferenzwert (Chrominanz red) des YCbCr-Farbmodells Cyclic Redundancy Check kontinuierliche Wavelet-Transformation (engl.: Continuous Wavelet Transform)
372 DCT DHT DNL DQT DRI DFT DSP DWT EOB EOC EOF EOI FCD FDIS FIFO FIR FLC FRExt GOP H.261 H.263 H.26L H.264 HT IDCT IFS IEC IDWT IJG ISO ITU ITU-R ITU-T JPEG JTC JVT KLT LPS MAD MCU MIDI MOS MPEG MPS
Formelzeichen und Abk¨ urzungen diskrete Kosinus-Transformation (engl.: Discrete Cosine Transform) JPEG-Marke (engl.: Define Huffman Table) JPEG-Marke (engl.: Define Number of Lines) JPEG-Marke (engl.: Define Quantisation Table) JPEG-Marke (engl.: Define Restart Intervall) diskrete Fourier-Transformation (engl.: Discrete Fourier Transform) Digitaler Signalprozessor diskrete Wavelet-Transformation (engl.: Discrete Wavelet Transform) Ende des Blocks (engl.: End Of Block) JPEG-2000-Marke (engl.: End Of Codestream) Ende der Datei (engl.: End Of File) JPEG-Marke: Ende des Bildes (engl.: End Of Image) Final Committee Draft Final Draft International Standard First In First Out Endliche Impulsantwort (engl.: Finite Impulse Response) Code, dessen Codew¨ orter die gleiche Codewortl¨ ange haben (engl.: Fixed Length Code) Fidelity Range Extension, Erweiterung von H.264/AVC Gruppe von Bildern (engl.: Group Of Pictures) Standard f¨ ur Bildtelefonie Standard f¨ ur Videokompression f¨ ur Kommunikation bei niedrigen Bitraten Vorl¨ aufer vom H.264-Standard zur Videokompression mit Long-Term-Pr¨ adiktion von Bildinhalten derzeit leistungsf¨ ahigster Standard f¨ ur Videokompression Haar-Transformation inverse diskrete Kosinus-Transformation (engl.: Inverse Discrete Cosine Transform) iteriertes Funktionensystem International Electrotechnical Commission inverse diskrete Wavelet-Transformation Independent JPEG Group International Organisation for Standardisation International Telecommunications Union ITU Radiocommunication Sector ITU Telecommunication Standardisation Sector Joint Photographic Experts Group Joint ISO/IEC Technical Committee Joint Video Team Karhunen-Loeve-Transformation Symbol mit geringerer Wahrscheinlichkeit (engl.: Less Probable Symbol) mittlerer absoluter Fehler (engl.: Mean Absolute Difference) kleinste Codiereinheit (engl.: Minimum Coded Unit) Musical Instrument Digital Interface subjektives Qualit¨ atsmaß (engl.: Mean Opinion Score) Motion Picture Experts Group Symbol mit h¨ oherer Wahrscheinlichkeit (engl.: More Probable Symbol)
Formelzeichen und Abk¨ urzungen MSE MUX NTSC PAL PPM PSNR PR QCC QCD QCIF ROI RST SAD SNR SOC SOD SOF SOI SOS SOT STFT SVC VCEG VHS VLC VQEG WDV WHT XOR Y
mittlerer quadratischer Fehler (engl.: Mean Square Error) Multiplexer Farbfernsehnorm (National Television System Committee) Farbfernsehnorm (Phase Alternating Line) Prediction by Partial Matching Spitzen-Signal-Rausch-Verh¨ altnis (engl.: Peak-Signal-to-Noise-Ratio) perfekte Rekonstruktion JPEG-2000-Marke (engl.: Quantisation Component) JPEG-2000-Marke (engl.: Quantisation Default) Bildformat f¨ ur die Videokompression bei sehr niedrigen Bitraten (engl.: Quarter Common Intermediate Format) bevorzugte Bildregion (engl.: Region Of Interest) JPEG-Marke (engl.: Restart Marker) Summe der absoluten Fehler (engl.: Sum of Absolute Difference) Signal-Rausch-Verh¨ altnis (engl.: Signal-to-Noise-Ratio) JPEG-2000-Marke (engl.: Start Of Codestream) JPEG-2000-Marke (engl.: Start Of Data) JPEG-Marke: Start eines Rahmens (engl.: Start Of Frame) JPEG-Marke: Start des Bildes (engl.: Start Of Image) JPEG-Marke: Start eines Scans (engl.: Start Of Scan) JPEG-2000-Marke (engl.: Start Of Tile part) gefensterte Fourier-Transformation (engl.: Short Time Fourier Transform) Scalable Video Coding Video Coding Experts Group Video Home System Code, dessen Codew¨ orter unterschiedliche Codewortl¨ angen haben (engl.: Variable Length Code) Video Quality Experts Group Wahrscheinlichkeitsdichteverteilung Walsh-Hadamard-Transformation ⎧ ⎪ ur x + y = 1 ⎨ 1 f¨ Exklusive-Oder, bin¨ arer Operator, x ⊕ y = 0 f¨ ur x + y = 0 ⎪ ⎩ 0 f¨ ur x + y = 2 Helligkeitskomponente (Luminanz) verschiedener Farbmodelle
373
374
Literaturverzeichnis [Ahm74] Ahmed, N.; Natarjan, T.; Rao, K.R.: Discrete Cosine Transform. IEEE Transaction on Computers, Vol.23, January 1974, 90–93 [Aiz95]
Aizawa, K.; Huang, T.S.: Model-Based Image Coding: Advanced Video Coding Techniques for Very Low Bit-Rate Applications. Proc. of the IEEE, Vol.83, No.2, February 1995, 259–271
[Ant92]
Antonini, M.; Barlaud, M.; Mathieu, P.; Daubechies, I.: Image Coding Using Wavelet Transform. IEEE Trans. on Image Processing, Vol.1, No.2, April 1992, 205–220
[Bar88]
Barnsley, M.F.: Fractals Everywhere, Academic Press, San Diego, 1988
[Bar93]
Barnsley, M.F.; Hurd, L.P.: Fractal Image Compression, AK Peters, Ltd., Wellesley, Massachusetts, 1993
[Bar95]
Barnsley, M.F.; Hurd, L.P.: Fraktale Bildkompression, Verlag Vieweg, 1995
[Barn96] Barnes, C.F.; Rizvi, S.A.; Nasrabadi, N.M.: Advances in Residual Vector Quantization: A Review. IEEE Trans. on Image Processing, Vol.5, No.2, 226–262, February 1996 [Bjo98]
Bjontegaard G.: Response to call for proposals for H.26L. ITU-T SG16/Q15, doc. Q15-F-11, Seoul, Korea, October 1998
[Bol00]
Bologna, G.; Calvagno, G.; Mian, G.A.; Rinaldo, R.: Wavelet packets and spatial adaptive intraband coding of images. Signal Processing: Image Communication, Vol.15, Elsevier, 2000, 891–906
[Bra00]
Brandenburg, K.; Kunz, O; Sugiyama, A: MPEG-4 natural audio coding. Signal Processing: Image Communication , Vol.15, 2000, 423–444
[Buh98]
Buhmann, J.M.; Fellner, D.W.; Held, M.; Kettner, J.; Puzicha, J.: Dithered Color Quantization. EUROGRAPHICS’98, Vol.17, No.3, 1998
[Bur94]
Burrows, M.; Wheeler, D.J.: A Block-Sorting Lossless Data Compression Algorithm. Digital Systems Research Center, Research Report 124, Palo Alto, CA, USA, 1994, http://gatekeeper.dec.com/pub/DEC/SRC/research-reports/abstracts/src-rr124.html
[BZIP2]
http://www.bzip.org, zuletzt besucht am 4. M¨ arz 2009
[Cal98]
Calderbank, A.R.; Daubechies, I.; Sweldens, W.; Yeo, B.L.: Wavelet transform that maps integers to integers. Applied Computational and Harmonic Analysis, Vol.5, No.3, 1998, 332–369
[Chen93] Chen, J.; Itoh, S.; Hashimoto, T.: Wavelet Pyramid Image Coding with predictable and Controllable Picture Quality. IEICE Trans. on Fundamentals of Electronics, Communications and Computer Science, Vol. E76-A, No.9, Sept. 1993, 1502–1514 [Cle84]
Cleary J.G.; Witten, I.H.: Data Compression Using Adaptive Coding and Partial String Matching. IEEE Trans. on Communications, Vol.COM-32, No.4, April 1984, 396–402
[Cle97]
Cleary J.G.; Witten, I.H.: Unbounded length contexts for PPM. The Computer Journal, Vol.40, No.2+3, 1997, 67–75
Literaturverzeichnis
375
[Coh92]
Cohen, A.; Daubechies, I.; Feauveau, J.-C.: Biorthogonal Bases of Compactly Supported Wavelets. Comm. on Pure and Applied Mathematics, Vol.45, 1992, 485–560
[Coi92]
Coifman, R.R.; Wickerhauser, M.V.: Entropy-based algorithms for best basis selection. IEEE Trans. on Information Theory, Vol.38, No.2, 1992, 713–718
[Dal00]
Daly, S.; Zeng, W.; Li, J.; Lei, S.: Visual weighting in wavelet compression for JPEG2000. Proc. of SPIE, Conf. Image and Video Com. and Proc., San Jose, Jan. 2000, Vol.3974, 66–80
[Dau88]
Daubechies, I.: Orthonormal Bases of Compactly Supported Wavelets. Communications on Pure and Applied Mathematics, Vol.41, 1988, 909–996
[Dau98]
Daubechies, I.; Sweldens, W.: Factoring Wavelet Transform into Lifting Steps. J. Fourier Anal. Appl., Vol.4, No.3, 1998, 247–269
[Dav95]
Davis, Geoffrey: Adaptive self-quantization of wavelet subtrees: A wavelet-based theory of fractal image compression. Proc. of SPIE - The International Society for Optical Engineering, Vol.2569, San Diego, CA, USA, July 1995, 294–306
[DCC98] Storer, J.A.; Cohn, M.(eds.): Proc. of Data Compression Conference, March 31 - April 1, Snowbird, Utah, USA, IEEE Computer Society Press, 1998 [DCC99] Storer, J.A.; Cohn, M.(eds.): Proc. of Data Compression Conference, March 29-31, Snowbird, Utah, USA, IEEE Computer Society Press, 1999 [DCC00] Storer, J.A.; Cohn, M.(eds.): Proc. of Data Compression Conference, March 28-30, Snowbird, Utah, USA, IEEE Computer Society Press, 2000 [DCC01] Storer, J.A.; Cohn, M.(eds.): Proc. of Data Compression Conference, March 27-29, Snowbird, Utah, USA, IEEE Computer Society Press, 2001 [Duf96]
Dufaux, F.; Moscheni, F.: Background Mosaicking for Low Bitrate Video Coding. Proc. of Int. Conf. on Image Processing (ICIP), Vol.1, 1996, 673–676
[EBU04] EBU-Tech 3299: High Definition (HD) Image Formats for Television Production, Geneva, 2004 [EBU08] EBU-Tech 3328: Current Status of High Definition Television Delivery Technology, Geneva, 2008 ¨ [Edl95] Edler, B.: Aquivalenz von Transformation und Teilbandzerlegung in der Quellencodierung, Dissertation, Fakult¨ at f¨ ur Maschinenwesen der Universit¨ at Hannover, 1995 [ESP87]
ESPRIT-PICA: Adaptive Discrete Cosine Transform Coding Scheme for Still Image Communication on ISDN. ISO/IEC JTC1/SC2/WG8 N502 Rev.1, Juni 1987
[Fan49]
Fano, R.M.: The transmission of information. Research Laboratory for Electronics, Massachusetts Institute of Technology, Technical Report, No.65, 1949
[Fis95]
Fisher, Y.(Hrsg.): Fractal Image Compression. Springer-Verlag, 1995
[Fli91]
Fliege, N.: Systemtheorie. Verlag B.G. Teubner Stuttgart, 1991
[Fli93]
Fliege, N.: Multiraten-Signalverarbeitung. Verlag B.G. Teubner Stuttgart, 1993
[Fli03]
Flierl, M.; Girod, B.: Generalized B Pictures and the Draft H.264/AVC Video Compression Standard. IEEE Trans. on Circuits and Systems for Video Technology, Vol.13, No.7, July 2003
[Ger90]
Gervautz, M.; Purgathoher, W.: A Simple Method for Color Quantization: Octree Quantization. in Graphic Gems, ed. by Anrew S. Glassner, Academic Press, INC., San Diego, 287–293
376
Literaturverzeichnis
[Gir92]
Girod, B.: Psychovisual aspects of image communication. Signal Processing, Vol.28 1992, 239–251
[Gir97]
Girod, B.; Rabenstein, R.; Stenger, A.: Einf¨ uhrung in die Systemtheorie. Verlag B.G. Teubner Stuttgart, 1997
[Gir99]
Girod, B.: Efficiency analysis of multihypothesis motion-compensated prediction for video coding. IEEE Trans. on Image Processing, Vol.9, Feb. 1999
[Gol66]
Golomb, S.W.: Run-Length Encodings. IEEE Trans. on Information Theory, Vol.12, September 1966, 399–401
[Gra84]
Gray, R.M.: Vector quantization. IEEE ASSP Magazine, Vol.1, No.2, 1984, 4–29
[Gra98]
Gray, R.M.; Neuhoff, D.L.: Quantization. IEEE Trans. on Information Theory, Vol.44, No.6, October 1998
[Guo97]
Guo, H.; Burrus, C.S.: Waveform and image compression using the Burrows Wheeler transform and the wavelet transform. Proc. of the 1997 Int. Conf. on Image Processing (ICIP ’97), Santa Barbara, CA, October 26-29, 1997
[Haa10]
Haar, A.: Zur Theorie der orthogonalen Funktionen-Systeme. Math. Ann. Vol.69, 1910, 331–371
[Has97]
Haskell, B.G.; Puri, A.; Netravali, A.N.: Digital Video: An Introduction to MPEG-2. Kluwer Academic Publishers, Boston/Dordrecht/London, 1997
[Hau94]
Hauske, G.: Systemtheorie der visuellen Wahrnehmung. Verlag B.G. Teubner Stuttgart, 1994
[Hec82]
Heckbert, P.: Color image quantization for frame buffer display. ACM, Computer Graphics, Vol.16, No.3, 1982, 297–307
[Hei96]
Heising, G.: Bewegtbildcodierung unter Verwendung von Blockverzerrungsmodellen zur Bewegungskompensation. FREQUENZ, Fachverlag Schiele & Sch¨ on GmbH BerlinKreuzberg, Band 50, 1996, 11–12
[Hei98]
Heising, G.; Marpe, D.; Cycon, H.L.: A Wavelet-Based Video Coding Scheme Using Image Warping Prediction. IEEE Int. Conf. on Image Processing (ICIP’98), Chicago, Illinois, October 4–7, 1998, 84–86
[Hei01]
Heising, G.; Marpe, D.; Cycon, H.L.; Petukhov, A.P.: Wavelet-based very low bit-rate video coding using image warping and overlapped block motion compensation. IEE Proc. Vision, Image and Signal Processing, Vol.148, No.2, April 2001, 93–101
[Her97]
Herley, C.; Xiong, Z.; Ramchandran, K.; Orchard, M.T.: Joint Space-Frequency Segmentation Using Balanced Wavelet Packet Trees for Least-Cost Image Representation. IEEE Trans. on Image Processing, Vol.6, No.9, 1997, 1213–1230
[Hoe97]
H¨ ontsch, I.; Karam, L.J.; Safranek, R.J.: A Perceptual Tuned Embedded Zerotree Image Coder. Proc. of ICIP’97, Int. Conf. on Image Processing, Santa Barbara, CA, October 26-29, 1997, Vol.1, 41–44
[How93]
Howard, P.G.;Vitter, J.S.: Fast and Efficient Lossless Image Compression. Proc. of the Data Compression Conference (DCC’93), Snowbird, UT, April 1993.
[Huf52]
Huffman, D.: A method for the construction of minimum redundancy codes. Proc. of the IRE, Vol.40, No.10, September 1952, 1098–1101
[ISO92]
ISO/IEC 10918-1, CCITT Recommendation T.81, Information technology – Digital Compression and Coding of Continuous-Tone Still Images: Requirements and Guidelines, 1992
Literaturverzeichnis
377
[ISO93a] ISO/IEC 11172, Information technology – Coding of moving pictures and associated audio for digital storage media at up to about 1.5 Mbits/s, International Standard, Part 1: Systems; Part 2: Video; Part 3: Audio; Part 4: Conformance Testing; Part 5: Software Reference Model, 1993 [ISO93b] ISO/IEC JTC1 11544, ITU-T Rec. T.82, Information technology – Progressive Lossy/Lossless Coding of Bi-Level Images. Final Committee Draft 11544, 1993 [ISO95]
ISO/IEC JTC1 10918-2, ITU-T Rec. T.83, Information technology – Digital compression and coding of continous-tone still images: Compliance testing, 1995
[ISO96a] ISO/IEC JTC1 10918-3, ITU-T Rec. T.84, Information technology – Digital compression and coding of continous-tone still images: Extensions, 1996 [ISO96b] ISO/IEC 13818-1, ITU-T Rec. H.262, Information technology – Generic coding of moving pictures and associated audio – Part 1: Systems, 1996 [ISO96c] ISO/IEC 13818-2, ITU-T Rec. H.262, Information technology – Generic coding of moving pictures and associated audio – Part 2: Video, 1996 [ISO96d] ISO/IEC 13818-3, Information technology – Generic coding of moving pictures and associated audio – Part 3: Audio, 1996 [ISO99]
ISO/IEC 14492, ITU-T Rec. T.82, Information technology – Lossy/Lossless Coding of Bi-Level Images. Final Committee Draft 14492, 16 July 1999
[ISO00a] ISO/IEC FCD 15444-1, Information technology – JPEG 2000 Image Coding System. JPEG 2000 Final Committee Draft Version 1.0, 16 M¨ arz 2000 [ISO00b] ISO/IEC JTC1/SC29/WG11 N3536, Overview of the MPEG-4 Standard V.15. Beijing – July 2000 [ISO00c] ISO/IEC 14495-1, Information technology – Lossless and near-lossless compression of continuous-tone still images: Baseline (JPEG–LS). International Standard, corrected and reprinted version, 15 September 2000 [ISO01a] ISO/IEC JTC1/SC29/WG11 N3908 Coding of Moving Pictures and Audio. MPEG-4 Video Verification Model version 18.0, Pisa, Januar 2001 [ISO01b] ISO/IEC 14496-2. Coding of Audio-Visual Objects – Part 2: Visual, 2nd edition, 2001 [ISO01c] ISO/IEC 14496-3. Coding of Audio-Visual Objects – Part 2: Audio, 2nd edition, 2001 [ISO02]
ISO/IEC 14496-10 AVC, JVT-E022d7, Joint Final Committee Draft (JFCD) of Joint Video Specification (MPEG-4 Part 10, gleichzeitig ITU-T Rec. H.264), Geneva, Schweiz, Oktober 2002
[ISO03a] ISO/IEC 15444-5, Information technology – JPEG 2000 image coding system: Reference software. International Standard, 2003 [ISO03b] ISO/IEC 15444-6, Information technology – JPEG 2000 image coding system: Compound image file format. International Standard, 2003 [ISO04a] ISO/IEC 15444-1, Information technology – JPEG 2000 image coding system: Core coding system. International Standard, 2nd edition, 15 September 2004 [ISO04b] ISO/IEC 15444-2, Information technology – JPEG 2000 image coding system: Extensions. International Standard, 1st edition, 15 Mai 2004 [ISO04c] ISO/IEC 15444-4, Information technology – JPEG 2000 image coding system: Conformance testing. International Standard, 2004 [ISO05a] ISO/IEC 15444-9, Information technology – JPEG 2000 image coding system: Interactivity tools, APIs and protocols. International Standard, 2005
378
Literaturverzeichnis
[ISO05b] ISO/IEC 15444-12, Information technology – JPEG 2000 image coding system: ISO base media file format. International Standard, corrected version, 1 Oct. 2005 [ISO07a] ISO/IEC 15444-3, Information technology – JPEG 2000 image coding system: Motion JPEG 2000. International Standard, 2007 [ISO07b] ISO/IEC 15444-8, Information technology – JPEG 2000 image coding system: Secure JPEG 2000. International Standard, 2007 [ISO07c] ISO/IEC 15444-11, Information technology – JPEG 2000 image coding system: Wireless. International Standard, 2007 [ISO08a] ISO/IEC 15444-10, Information technology – JPEG 2000 image coding system: Extensions for three-dimensional data. International Standard, 1st edition, 15 Dec. 2008 [ISO08b] ISO/IEC 15444-13, Information technology – JPEG 2000 image coding system: An entry-level JPEG 2000 encoder. International Standard, 1st edition, 15 July 2008 [ITU93]
ITU-T Recommendation H.261: CODEC for audio-visual services at b x 64 Kbps, 1993
[ITU95a] BT.601 (ITU-R) Studio encoding parameters of digital television for standard 4:3 and wide screen 16:9 aspect ratios (Recommendation CCIR 601), 1995 [ITU95b] ITU-T Recommendation H.263: Video coding for low bit rate communications, Version 1, 1995 [ITU98]
ITU-T Recommendation H.263: Video coding for low bit rate communications, Version 2, 1998
[ITU00]
ITU-T Recommendation H.263: Video coding for low bit rate communications, Version 3, 2000
[ITU01]
ITU-T H.26L: Test Model Long Term Number 7 (TML-7) draft0, Austin, Texas, USA, April 2001
[ITU02]
ITU-R Recommendation BT.709-5: Parameter values for the HDTV standards for production and international programme exchange, 2002
[ITU03]
ITU-T H.264: Advanced video coding for generic audiovisual services, republished recommendation, May 2003
[ITU05]
ITU-R Recommendation BT.470-7: Conventional Television Systems, 2005
[Iwa95]
Iwakami, N.; Moriya, T.; Miki, S.: High-quality audio-coding at less than 64 kbit/s by using transform-domain weighted interleave vector quantization (TwinVQ). ICASSP’95, 9-12 May 1995, Vol.5, 3095–3098
[Iwa96]
Iwakami, N.; Moriya, T.: Transform-Domain Weighted Interleave Vector Quantization (TwinVQ). 101st AES Convention, Paper No. 4377, November 1996
[Jac89]
Jacquin, A.: A Fractal Theory of Iterated Markov operators with Applications to Digital Image Coding. PhD Thesis, Georgia Institute of Technology, August 1989
[Jac92]
Jacquin, A.: Image Coding based on a Fractal Theory of Iterated Contractive Image Transformations. IEEE Trans. on Image Processing, Vol.1, No.1, January 1992, 18–30
[Jai81]
Jain, J.R.; Jaun, A.K.: Displacement Measurement and Its Application in Interframe Image Coding. IEEE Trans. on Communications, Vol.COM-29, No.12, December 1981, 1799–1808
[Jay84]
Jayant, N.S.; Noll, P.: Digital Coding of Waveforms. Prentice-Hall, Inc., Englewood Cliffs, NJ, 1984
Literaturverzeichnis [Jon95]
379
Jones, P.W.; Daly, S.; Gaborski, R.S.; Rabbani, M.: Comparative study of wavelet and DCT decompositions with equivalent quantization and encoding strategies for medical images. Proc. of SPIE - The International Society for Optical Engineering, Vol.2431, 1995, 571–582
[Kam98] Kammeyer, K.D; Kroschel, K.: Digitale Signalverarbeitung. Teubner Taschenb¨ ucher Elektrotechnik, Verlag B.G. Teubner Stuttgart, 1998 [Kar03]
Karszewicz, M.; Kurceren,R.: The SP- and SI-Frames Design for H.264/AVC. IEEE Trans. on Circuits and Systems for Video Technology, Vol.13, No.7, July 2003, 737-644
[Kec98]
Keck, W.: Optimierte Quellencodierung und robuste Decodierung von digitalen Videosignalen. Dissertation, Institut f¨ ur Nachrichten¨ ubertragung, Universit¨ at Stuttgart, Shaker Verlag GmbH Aachen, 1998
[Kla98]
Klappenecker, A.; May, F.U.; Beth, Th.: Lossless Compression of 3D MRI and CT Data. Proc. SPIE, Vol.3458, Wavelet Applications in Signal and Image Processing VI, 1998, 140–149
[Klo97]
Klock, H.; Polzer, A.; Buhmann, J.M.; Arnold, J.F.: Region-based motion compensated 3D-wavelet transform coding of video. Proc. of Int. Conf. on Image Processing (ICIP’97), Santa Barbara, CA, October 26-29, 1997, Vol.2, 776–779
[Kno99]
Knowles, G.: A New Zerotree Image Compression Algorithm. 7th Int. Conf. on Image Processing and its Applications (IPA’99, IEE No.465), Manchester, UK, 13–15 July 1999, 162–165
[Kodak]
http://r0k.us/graphics/kodak/, zuletzt besucht am 19. Oktober 2009
[Kog81]
Koga, T.; Linuma, K.; Hirano, A.; Iijima, Y.; Ishiguro, T.: Motion-Compensated Interframe Coding for Video Conferencing. Proc. of NTC’81, New Orleans, LA, December 1981, G5.3.1–5
[Koh89]
Kohonen, T.: Self-Organization and Associative Memory. Springer-Verlag, Berlin, 3rd edition, 1989
[Kru02]
Kr¨ uger, K.-E.: Transformationen, VIEWEG-Verlag, Braunschweig/Wiesbaden, Februar 2002
[Lij95]
Li, J.; Cheng, P.-Y.; Kuo, C.-C.J.: An Embedded Wavelet Packet Transform Technique for Texture Compression. Proc. of SPIE - The International Society for Optical Engineering, Vol.2569, San Diego, CA, USA, July 1995, 602–613
[Lin80]
Linde, Y.; Buzo, A.; Gray, R.M.: An algorithm for vector quantizer design. IEEE Trans. on Communications, Vol.28, No.1, 1980, 84–95
[Lis03]
List, P.; Joch, A.; Lainema, J.; Bjoentegard, G.; Karszewicz, M.: Adaptive Deblocking Filter. IEEE Trans. on Circuits and Systems for Video Technology, Vol.13, No.7, July 2003, 614–619
[Llo82]
Lloyd, S.P.: Least sqares quantization in PCM. (1957) Nachdruck in IEEE Trans. on Information Theory, Vol.28, 1982, 129–137
[Loc97]
Lochmann, D.: Digitale Nachrichtentechnik. Verlag Technik GmbH, Berlin, 2.Auflage, 1997
[Luk82]
Lukas, F.J.; Budrikis, Z.L.: Picture quality prediction based on a visual model. IEEE Trans. on Communications. COM-30, July 1982, 1679–1692
[Mal89]
Mallat, S.G.: A Theory for Multiresolution Signal Decomposition: The Wavelet Representation. IEEE Trans. on Pattern Analysis and Machine Intelligence, Vol.11, No.7, 1989, 674–693
380
Literaturverzeichnis
[Mal98]
Mallot, H.A.: Sehen und die Verarbeitung visueller Informationen. Vieweg, Braunschweig/Wiesbaden, 1998
[Mal03]
Malvar, H.S.; Hallapuro, A; Karszewicz, M.; Kerofsky, L.: Low-Complexity Transform and Quantization in H.264/AVC. IEEE Trans. on Circuits and Systems for Video Technology, Vol.13, No.7, July 2003, 598-603
[Mal03b] Malvar, H.S.; Sullivan, F.: YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range. Joint Video Team (JVT) of ISO/IEC MPEG ITU-T VCEG, JVT Ad Hoc Group Meeting, 22-24 July 2003, Trondheim, Document JVT-I014r3.doc [Mar90]
Marcellin, M.W.; Fischer, T.R.: Trellis coded quantization of memoryless and GaussMarkov source. IEEE Trans. on Communications, 1990, Vol.38, No.1, 82–93
[Mar97]
Marpe, D.; Cycon, H.L.: Efficient Pre-Coding Techniques for Wavelet-Based Image Compression, Picture Coding Symposium (PCS’97), Berlin, Germany, 10–12 Sep. 1997, 45–50
[Mar98]
Marpe, D.; Cycon, H.L.; Li, W.: A Complexity Constraint Best-Basis Wavelet Packet Algorithm for Image Compression. Proc. of IEE – Vision, Image and Signal Processing, Vol.145, No.6, 1998, 391–398
[Mar00]
Marpe, D.; Bl¨ attermann, G.; Ricke, J.; Maaß, P.: A Two-Layered Wavelet-Based Algorithm for Efficient Lossless and Lossy Image Compression. IEEE Trans. on Circuits and Systems for Video Technology, Vol.10, No.7, October 2000, 1094–1102
[Mar01]
Marpe, D.; Bl¨ attermann, G.; Heising, G.; Wiegand, T.: Video Compression Using Context-based Adaptive Arithmetic Coding. Proc. of IEEE Int. Conf. on Image Processing, ICIP’2001, October 7-11, 2001
[Mar03]
Marpe, D.; Schwarz, H.; Wiegend, T.: Context-Based Adaptive Binary Arithmetic Coding in the H.264 / AVC Video Compression Standard. IEEE Trans. on Circuits and Systems for Video Technology, Vol.13, No.7, July 2003, 620–636
[Mar04]
Marpe, D.; George, V.; Cycon, H.L.; Barthel, K.U.: Performance Evaluation of Motion-JPEG2000 in Comparison with H.264 / AVC Operated in Intra Coding Mode, Proc. SPIE, Feb. 2004, Vol.5266, 129-137
[Mart90] Martucci, S.A.: Reversible compression of HDTV images using median adaptive prediction and arithmetic coding. Proc. IEEE Symp. on Circuits and Systems, 1990, 1310–1313 [Max60]
Max, J.: Quantization for minimum distortion. IEEE Trans. on Information Theory, Vol.6, 1960, 7–12
[Maz95]
Mazzarri, A.; Leonardi, R.: Perceptual Embedded Image Coding Using Wavelet Transforms. IEEE Int. Conf. on Image Processing, October 23-26, 1995, Washington, D.C., USA, Volume I, 586-589
[Mem97] Memon, N.D.; Wu, X.: Recent Developments in Context-Based Precitive Techniques for Lossless Image Compression. The Computer Journal, Vol.40, No.2/3, 1997, 127– 136 [Mey00]
Meyer, F.G.; Averbuch, A.Z.; Str¨ omberg, J.O.: Fast Adaptive Wavelet Packet Image Compression. IEEE Trans. on Image Processing, Vol.9, No.5, May 2000, 792–800
[Mey01]
Meyer, B.; Tischer, P.: Glicbawls — Grey Level Image Compression By Adaptive Weighted Least Squares. Proc. of Data Compression Conference, DCC’01, 27–29 March 2001, Snowbird, Utah, USA, 2001
[Mil95]
Mildenberger, O.: System- und Signaltheorie. Vieweg, Braunschweig/Wiesbaden, 1995
Literaturverzeichnis
381
[Mit97]
Mitchell, J.L.; Pennebaker, W.B.; Fogg, C.E.; LeGall, D.J.(ed.): MPEG Video: Compression Standard. Chapman & Hall, New York, 1997, ISBN 0-412-08771-5
[Mof95]
Moffat, A.; Neal, R.; Witten, I.H.: Arithmetic Coding Revisited (Extended Abstract). Proc. of the Data Compression Conference, March 28–30, 1995, Snowbird, Utah, edited by J.A. Storer and M. Cohn, 202–211
[Mof90]
Moffat, A.: Implementing the PPM Data Compression Scheme. IEEE Trans. on Communications, Vol.38, No.11, November, 1990, 1917–1921
[MPE02] MPEG-4 Industry Forum (MP4): MPEG-4 – The Media Standard, November 2002 [Mus89]
Musmann, H.G.; H¨ otter, M.; Ostermann, J.: Object-Oriented Analysis-Sythesis Coding of Moving Images. Signal Processing: Image Communication, Elsvier Science Publishers B.V., Vol.1, 1989, 117–138
[Ohm94] Ohm, J.-R.: Three-Dimensional Subband Coding with Motion Compensation. IEEE Trans. on Image Processing, Vol.3, No.5, September 1994, 559–571 [Oso96]
Osorio, D.; Vorobeyev, M.: Colour vision as an adaptation to frugivory in primates. Proceedings of the Royal Society (London) B. Vol.263, 1996, 593–599
[Ost04]
Ostermann, J. ; Bormans, J.; List, P.; Marpe, D.; Narroschke, M.; Pereira, F.; Stockhammer, T.; Wedi, T.: Video Coding with H.264 / AVC: Tools, Performance, and Complexity (invited paper), IEEE Circuits and Systems Magazine, April 2004, Vol.4, No.1, 7-28
[Pap91]
Papageorgiou, M.: Optimierung. Oldenbourg Verlag, M¨ unchen, 1991
[Pen88]
Pennebaker, W.B.; Mitchell, J.L.; Langdon Jr., G.G.; Arps, R.B.: An overview of the basic principles of the Q-Coder adaptiv binary arithmetic coder. IBM Journal of Research and Development, Vol.32, No.6, November 1988, 717–726
[Pen93]
Pennebaker, W.B.; Mitchell, J.L.: JPEG Still Image Data Compression Standard. Published by Van Nostrand Reinhold, 1993
[Per02]
Pereira, F.; Ebrahini, T.: The MPEG-4 Book. Prentice Hall PTR, 2002
[PGM1]
Beschreibung des PGM-Formates. http://de.wikipedia.org/wiki/Portable Graymap, zu letzt besucht am 12.02.2009
[PGM2]
Spezifikation des PGM-Formates. http://netpbm.sourceforge.net/doc/pgm.html, zu letzt besucht am 12.02.2009
[Que97]
de Queiroz, R.; Choi, C.; Huh, Y; Rao, K.: Wavelet transforms in a JPEG-like coder. Trans. on Circuits and Systems for Video Technology, Vol.7, No.2, April 1997, 419–424
[Rao96]
Rao, K.R.; Hwang, J.J.: Techniques and Standards for Image, Video and Audio Coding. Prentice-Hall, Inc., Upper Saddle River, NJ, 1996
[Rau00]
Rauschenbach, U.: Compression of Palettized Images with Progressive Coding of the Color Information. Proc. of SPIE, Symposium on Visual Communications and Image Processing, Perth, Australia, 20-23 June, 2000
[Ric79]
Rice, R.F.: Some Practical Universal Noisless Coding Techniques. Part I–III Technical reports JPL-79-22, JPL-83-17, JPL-91-3. Jet Propulsion Lab, Pasadena, CA, USA, Mar. 1979, Mar. 1983, Nov. 1991
[Ric03]
Richardson, I.E.G.: H.264 and MPEG-4 Video Compression. John Wiley & Sons Ltd., 2003
[Roc72]
Rocca, F.; Zanoletti, S.: Bandwidth Reduction via Movement Compensation on a Model of the Random Video Process. IEEE Trans. on Communications. Vol.COM20, Oktober 1972, 960–965
382
Literaturverzeichnis
[Roe95]
R¨ ohler, R.: Sehen und Erkennen, Psychophysik des Gesichtssinnes. Springer-Verlag, Berlin, Heidelberg, New York, 1995
[Rou95]
O’Rourke, T.P.; Stevenson R.L.: Human Visual System Based Wavelet Decomposition for Image Compression. Journal of Visual Communication and Image Presentation, Vol.6, No.2, June 1995, 109–121
[Sai96]
Said, A.; Pearlman, W.A.: A New Fast and Efficient Image Codec Based on Set Partitioning in Hierarchical Trees. IEEE Trans. on Circuits and Systems for Video Technology, Vol.6, June 1996, pp.243-250
[Salo97]
Salomon, D.: Data Compression – A complete reference. Springer-Verlag, New York, 1997
[Sale97]
Salembier, Ph.; Marqu´e, F.; Pard` as, M.; Morros, R.; Corset, I.; Jeannin, S.; Bouchard, L.; Meyer, F.; Marcotegui, B.: Segmentation-based Video Coding System Allowing the Manipulation of Objects. IEEE Trans. on Circuits ans Systems for Video Technology, Vol.7, No.1, February 1997, 60–74
[Scha08] Sch¨ afer, R.: H.264/AVC & Co. – die Videokompressionsverfahren NTZ, VDE Verlag Berlin Offenbach, Heft 7-8, 2008, 14–17 [Schw99] Schwarz, H.; M¨ uller, E.: Hypotheses-based Motion Segmentation for Object-based Video-Coding. Proc. on Picture Coding Symposium (PCS’99), Portland, Oregon, USA, April 21–23, 1999 [Schw00] Schwarz, H.: Untersuchungen zur objektbasierten Videocodierung mit einer 3DWavelet-Transformation. Dissertation, Institut f¨ ur Nachrichtentechnik und Informationselektronik, Universit¨ at Rostock, 2000, Mensch & Buch Verlag Berlin, ISBN 389820-173-2 [Schw07] Schwarz, H.; Marpe, D.; Wiegand, T: Overview of the Scalable Video Coding Extension of the H.264/AVC Standard. IEEE Trans. on Circuits and Systems for Video Technology, Special Issue on Scalable Video Coding, Vol.17, No.9, September 2007, 1103-1120 [Ser97]
Seroussi, G.; Weinberger, M.J.: On Adaptive Strategies for an Extended Family of Golomb-type Codes. Proc. of Data Compression Conference, DCC’97, March 25–27, Snowbird, Utah, USA, 1997, 131–140
[Sha48]
Shannon, C.E.: A mathematical theory of communication. Bell System Technical Journal, Vol.27, 1948
[Sha76]
Shannon, C.E.; Weaver, W: Mathematische Grundlagen der Informationstheorie. ¨ R.Oldenbourg Verlag, M¨ unchen Wien, 1976, (Ubersetzung der englischsprachigen Originalausgabe ’The Mathematical Theory of Communication’, University of Illinois Press, 1949)
[Sha93]
Shapiro, J.M.: Embedded Image Coding Using Zerotrees of Wavelet Coefficients. IEEE Trans. on Signal Processing, Vol.41, No.12, December 1993, 3445–3462
[Shu99]
Shu, Y.; Robinson J.A.: Robust Motion Picture Residue Coding for Noisy Channels. IEE 7th Int. Conf. on Image Processing and its applications, (IPA’99, IEE No.465), Manchester, UK, 13–15 July 1999, 153–156
[Shu73]
Shum, F.; Elliot A.; Brown, W.: Speech Processing with Walsh-Hadarmad Transforms. IEEE Trans. on Audio and Electroacoustics, Juni 1973, 174–179
[Sil94]
Silvestrini, N.: Idee Farbe – Farbsysteme in Kunst und Wissenschaft. Baumann & Stromer Verlag, Z¨ urich, 1994
Literaturverzeichnis
383
[Sil98]
Silvestrini, N.; Fischer, E.P.; Stromer, K.: Farbsysteme in Kunst und Wissenschaft. DuMont Buchverlag, K¨ oln, 1998
[Smi84]
Smith, M.J.T.; Barnwell III, T.P.: A Procedure for Designing Exact Reconstruction Filter Banks for Tree Structured Sub-band Coders. Proc. of IEEE ICASSP’84, March 1984, 27.1.1–27.1.4
[SMP93] Society of Motion Picture and television Engineers RP177: Derivation of Basic Television Color Equations (R2002), 1993 [SMP99] Society of Motion Picture and television Engineers: Television - 1125-Line HighDefinition Production - Signal Parameters, SMPTE 240M, 1999 [SMP04] Society of Motion Picture and television Engineers: Television - Composite Analog Video Signal - NTSC for Studio Applications, SMPTE 170M, 1999 [Stra96]
Strang, G.; Nguyen, T.: Wavelets and Filter Banks. Wellesley-Cambridge Press, 1996, ISBN 0-9614088-7-1
[Stru95]
Strutz, T.; M¨ uller, E.: Image data compression with pdf-adaptive reconstruction of wavelet coefficients. Proc. of SPIE - The International Society for Optical Engineering, Vol.2569, San Diego, CA, USA, July 1995, 747–758
[Stru96]
Strutz, T.; M¨ uller, E.: Dyadische Wavelet-Transformation mit orthogonalen Filtern -Implementationen in C-. FREQUENZ, Fachverlag Schiele & Sch¨ on GmbH BerlinKreuzberg, Band 50, Vol.3–4, 1996, 51–59
[Stru97a] Strutz, T.; Schwarz, H.; M¨ uller, E.: Bildcodierung durch hierarchische Pr¨ adiktion im Wavelet-Bereich. FREQUENZ, Fachverlag Schiele & Sch¨ on GmbH Berlin-Kreuzberg, Band 51, No.3–4, 1997, 106–115 [Stru97b] Strutz, T.; M¨ uller, E.: Adaptive Wavelet Transformation Using Forecast Decomposition Selection. Picture Coding Symposium (PCS’97), Berlin, Germany, 10–12 Sep. 1997, 67–72 [Stru98]
Strutz, T.: Untersuchungen zur skalierbaren Kompression von Bildsequenzen bei niedrigen Bitraten unter Verwendung der Wavelet-Transformation. Dissertation, Institut f¨ ur Nachrichtentechnik und Informationselektronik, Universit¨ at Rostock, Shaker Verlag GmbH Aachen, ISBN 3-8265-3600-2, 1998
[Stru99]
Strutz, T.; Ahrens, A.: Wavelet-based Image Sequence Coding for Transmission over HF-Channels. Seventh Int. Conf. on Im. Proc. and its Applications (IPA’99), Manchester, UK, 12–15 July, 1999, 572–576
[Stru02]
Strutz, T.: Context-Based Adaptive Linear Prediction for Lossless Image Coding. 4th Int. Conf. on Source and Channel Coding, Berlin, 28-30 Jan. 2002, 105–109
[Stru04]
Strutz, T.; M¨ uller, E.: Construction of semi-recursive PR-filter banks via generalised lifting. Signal Processing, Elsevier, Vol.84, 2004, 77–93
[Stru09]
Strutz, T.: Lifting Parameterisation of the 9/7 Wavelet Filter Bank and its Application in Lossless Image Compression. ISPRA’09, Cambridge, UK, 21-23 Feb. 2009, 161–166
[S¨ uh03]
S¨ uhring, K.; Schwarz, H.; Wiegand, T.: Effizienter kodieren - Details zum kommenden Videostandard H.264/AVC. c’t, Verlag Heinz Heise GmbH & Co KG, Heft 6, 2003, 266–273
[Sul91]
Sullivan, G.J.; Baker, R.L.: Motion Compensation for Video Compression Using Control Grid Interpolation. Proc. of Int. Conf. on Acoustics, Speech, and Signal Processing (ICASSP’91), Toronto, Canada, May 1991, 2713–2716
384
Literaturverzeichnis
[Sul98]
Sullivan, G.J.; Wiegand, Th.: Rate-Distortion Optimization for Video Compression. IEEE Signal Processing Magazine, Vol.15, No.6, November 1998, 74–90
[Sul07]
Sullivan, G.J.; Haoping Yu; Sekiguchi, S.-i.; Huifang Sun; Wedi, T.; Wittmann, S.; Yung-Lyul Lee; Segall, A.; Suzuki, T.: New Standardized Extensions of MPEG4AVC/H.264 for Professional-Quality Video Applications. IEEE Int. Conf. on Image Processing, ICIP 2007, Vol.1, 16-19 Sept. 2007, I-13 – I-16
[Sym04]
Symes, P.: Digital Video Compression, McGraw-Hill, 2004
[Swe95]
Sweldens, W.: The Lifting Scheme: A New Philosophy in Biorthogonal Wavelet Construction. Proc. of SPIE - The International Society for Optical Engineering, Vol.2569, San Diego, CA, USA, July 1995, 68–79
[Tam00] Tamm, M.: Packen wie noch nie, Datenkompression mit dem BWT-Algorithmus. c’t, Verlag Heinz Heise GmbH & Co KG, Heft 16, 2000 [Tau02]
Taubman, D.S., Marcellin, M.W.: JPEG2000 Image Compression Fundamentals, Standards and Practice. Kluwer Academic Publishers, ISBN 0-7923-7519-X, 2002
[Teu78]
Teuhola, J.: A compression method for clustered bit-vectors. Inform. Processing Lett., Vol.7, Oct. 1978, 308–311
[Tho91]
Thomas, S.W.; Bogart, R.G: Color Dithering. in Graphic Gems II, ed. by James Arvo, Academic Press, INC., San Diego, 72–77
[Tsa96]
Tsai, M.-J.; Villasenor, J.D.; Chen, F.: Stack-Run Coding for Low Bit Rate Image Communication. Proc. of IEEE Int. Conf. on Image Processing, September 16–19, 1996, Lausanne, Switzerland, (0044)
[Var98]
Vary, P.; Heute, U.; Hess, W.: Digitale Sprachsignalverarbeitung. Verlag B.G. Teubner Stuttgart, 1998
[Vel93]
Veldhuis, R.; Breeuwer, M.: An Introduction to Source Coding. Prentice Hall, Eindvoven, ISBN 0-13-489089-2, 1993
[Vet92]
Vetterli, M.; Herley, C.: Wavelets and filter banks: Theory and Design. IEEE Trans. on Signal Processing, Vol.40, No.9 September 1992, 2207–2232
[Vet95]
Vetterli, M.; Kovaˇcevi´c, J.: Wavelets and Subband Coding., Prentice Hall PTR, Englewood Cliffs, New Jersey, 1995
[Vit85]
Vitter, J.S.: Design and Analysis of Dynamic Huffman Codes. Journal of the ACM, Vol.34, No.4, October 1987, 825–845
[Vit89]
Vitter, J.S.: Dynamic Huffman Coding. ACM Trans. on Mathematical Software, Vol.15, No.2, June 1989, 158–167
[VQE00] VQEG: Final Report from the Video Quality Experts Group on the Validation of Objective Models of Video Quality Assessment, March 2000, ftp.its.bldrdoc.gov (04.05.2008) [VQE03] VQEG: Final Report from the Video Quality Experts Group on the Validation of Objective Models of Video Quality Assessment, Phase II, August 2003, ftp.its.bldrdoc.gov (04.05.2008) [Wah89] Wahl, F.M.: Digitale Bildverarbeitung. Springer-Verlag, Berlin, 1989 [Wat97]
Watson, G.; Yang, J.S.; Villasenor, J.: Visibility of wavelet quantization noise. IEEE Trans. on Image Procesing, Vol.6, 1997, 1164–1175
[Wed99]
Wedi, T.: A Time-Recursive Interpolation Filter for Motion Compensated Prediction Considering Aliasing. Int. Conf. on Image Processing (ICIP’99), Kobe, Japan, October 1999
Literaturverzeichnis
385
[Wed03]
Wedi, Th.; Musman, H.G.: Motion- and Aliasing-Compensated Prediction for Hybrid Video Coding. IEEE Trans. on Circuits and Systems for Video Technology, Vol.13, No.7, July 2003, 577-586
[Wei96]
Weinberger, M.J.; Seroussi, G.; Sapiro, G.: LOCO-I: A Low Complexity, Context Based, Lossless Image Compression Algorithm. Proc. of Data Compression Conference, DCC’96, March 1996, Snowbird, Utah, USA, 1996, pp.140–149
[Wei00]
Weinberger, M.J.; Seroussi, G.; Sapiro, G.: LOCO-I: Lossless Image Compression Algorithm: Principles and Standardization into JPEG-LS. IEEE Trans. on Image Processing, Vol.9, No.8, August 2000, pp.1309–1324
[Wel84]
Welch, T.: A technique for high-performance data compression. IEEE Computer, June, 1984 ¨ Wickerhauser, M.V.: Adaptive Wavelet-Analyse, Vieweg, 1996, Ubersetzung aus dem Englischen (Adapted Wavelet Analysis from Theory to Software, AK Peters, 1993)
[Wic96] [Wie97]
Wiegand, Th.; Xiaozheng, Z.; Girod, B.: Block-Based Hybrid Video Coding Using Motion-Compensated Long-Term Memory Prediction. Picture Coding Symposium ’97, Berlin, Germany, 10–12 September 1997, 153–158
[Wie01]
Wiegand, Th.; Girod, B.: Lagrange Multiplier Selection in Hybrid Video Coder Control. Proc. of IEEE Int. Conf. on Image Processing, ICIP’2001, Thessaloniki, Greece, 7–10 October 2001
[Wie03a] Wiegand, T.; Sullivan, G.J.; Bjontegaard, G.; Luthra, A.: Overview of the H.264/AVC Video Coding Standard. IEEE Trans. on Circuits and Systems for Video Technology, Vol.13, No.7, July 2003, 560-576 [Wie03b] Wiegand, T.; Schwarz, H.; Joch, A.; Kossentini, F.; Sullivan, G.J.: Rate-Constrained Coder Control and Comparison of Video Coding Standards. IEEE Trans. on Circuits and Systems for Video Technology, Vol.13, No.7, July 2003, 688–703 [Wie07]
Wiegand,. T.; Sullivan, G.J.: The H.264/AVC Video Coding Standard. IEEE Signal Processing Magazine, Vol.24, No.2, March 2007, 148–153
[Wien07] Wien, M.; Schwarz, H.; Oelbaum, T.: Performance Analysis of SVC. IEEE Trans. on Circuits and Systems for Video Technology, Special Issue on Scalable Video Coding, Vol.17, No.9, September 2007, 1194–1203 [Win99]
Winkler, S.: Issues in vision modeling for perceptual video quality assessment. Elsevier, Signal Processing, Vol.78, 1999, 231–252
[Wit87]
Witten, I.H.; Neal, R.M.; Cleary J.G.: Arithmetic coding for data compression. Communications of the ACM, Vol.30, No. 6, Juni 1987, 520–540
[WuX91] Wu, X.: Efficient Statistical Computations for Optimal Color Quantization. in Graphic Gems II, ed. by James Arvo, Academic Press, INC., San Diego, 126–133 [WuX92] Wu, X.: Color Quantization by Dynamic Programming and Principal Analysis, ACM Trans. on Graphics, Vol.11, No.4, Oct. 1992, 348–372 [WuX97a] Wu, X.; Memon, N.: Context-based, Adaptive, Lossless Image Codec. IEEE Trans. on Communications, Vol.45, No.4, April 1997, 437–444 [WuX97b] Wu, X.: Lossless Compression of Continuous-tone Images via Context Selection, Quantization, and Modeling. IEEE Trans. on Image Processing, Vol.6, No.5, May 1997, 656–664 [WuY01] Wu, H.R.; Yu, Z.; Winkler, S.; Chen, T.: Impairment Metrics for MC/DPCM/DCT Encoded Digital Video. Proc. of 22th Picture Coding Symposium, PCS–2001, 25–27 April 2001, Seoul, Korea, 29–32
386
Literaturverzeichnis
[Xio95]
Xiong, Z.; Herley, C.; Ramchandran, K.; Orchard, M.T.: Space-Frequency Quantization for a Space-Varying Wavelet Packet Image Coder. IEEE Int. Conf. for Image Processing, 1995, 614-617
[Xio97]
Xiong, Z.; Herley, C.; Ramchandran, K.; Orchard, M.T.: Wavelet Packet Image Coding Using Space-Frequency Quantization. IEEE Trans. on Image Processing, Vol.6, No.5, 1997, 677–693
[Ziv77]
Ziv, J.; Lempel, A.: A Universal Algorithm for Sequential Data Compression. IEEE Trans. on Information Theory, Vol.23, No.3, 1977, 337–343
[Ziv78]
Ziv, J.; Lempel, A.: Compression of invidual sequences via variable-rate coding. IEEE Trans. on Information Theory, Vol.24, No.5, 1978, 530–536
387
Sachwortverzeichnis 3D-Transformation 263 5/3-Wavelet-Filter 132, 146, 150, 166 Graphen 139 9/7-Wavelet-Filter 240, 258 Graphen 140 9/7-Wavelet-Transformation 151 A Abh¨ angigkeit von der Verteilung 8 Abstandsmaß 27 Abtastrate 19 Abtastwert 1, 32 AC-Koeffizient 195 Adaptation der Codierung 60 des Auges 173 Akkomodation 173 Aliasing 19 Aliasingkomponente 128 Alpha-Maske 293 Alphabet 5 Amplitudenwert 1 Analyse 126 Analysefilter 127 Analysehochpass 131 Analysetiefpass 129 Analysetiefpassfilter 131 Anpassungsf¨ ahigkeit 14 Antiimaging-Filterung 20 Approximation, schrittweise 24, 163, 206 Approximationssignal 115, 140 Attraktor 123, 124 Aufl¨ osung ortliche 276 ¨ der Frequenz 143 eines Abtastwertes 3 spektrale 119, 136, 140 zeitliche 140, 142 Aufl¨ osungsebene 116, 142 Aufl¨ osungsverm¨ ogen, psychophysisches 182 Auftretenswahrscheinlichkeit 5, 32 von Teilchen 8 Auge 173 Autokorrelationsfunktion 101 AVC 295
B B-Bild 267, 278 Bandpassfunktion 137 Baseline-Prozess JPEG 204 Basen beste 142 duale 139 Basisbilder 197 Basisfunktion 109 einer Filterbank 137 signifikante 155 Baumstruktur 90 Betragsspektrum 19 Bewegtbildaufl¨ osung 175 Bewegung 261 der Kamera 263 von Objekten 263 Bewegungskompensation 262, 283 H.264 299 Bewegungssch¨ atzung 262, 264 Bewegungsvektor 262, 264 Codierung 269 Bezirk, JPEG 2000 242, 251 Bilddatenkompression fraktale 124 waveletbasierte 158 Bildfolgefrequenz 176, 275 Bildgruppe 278 Bildkompression, Schema 154 Bildpunkt 10 Bildsequenz 261 Bildsequenzkompression 261, 273 Bildverzerrungen 13 bin¨ are Quelle 8 Bindung, statistische 16, 78, 143, 155 bit, Bit 5 Bit-Markierung 89 Bitrate 10 Bitratensteuerung 261, 281, 283 Bitstrom 155, 262, 277 Block-Matching 264 Blockartefakte 13, 198 Blocksortierung 86 Burrows-Wheeler-Transformation 86
388 C CABAC 308 CAVLC 306 Cb-Komponente 183 CCIR-601 275 Cg-Komponente 185 Chrominanz 182 Chrominanzblock 280 CIE-Normfarbtafel 178 CIF-Format 276 cleanup pass, JPEG 2000 242 Cleanup-Phase, JPEG 2000 242, 245 Code 6 fester L¨ ange 33 kanonischer 45 un¨ arer 6, 40 variabler L¨ ange 33 Code-Block, JPEG 2000 240, 242 Codebaum 32 Codebuch 27 Codec 2 Codewert 6 Codewort 6, 32 Codewortl¨ ange 6, 32 mittlere 32 variable 33 Codiergewinn 101 Codierung arithmetische 47 Golomb38 Huffman35 LZW83 objektbasierte 293 Rice40, 225 semi-adaptive 60 Shannon-Fano34 statistische 31 un¨ are 6, 40 universelle 82 verlustlose 225 voll-adaptive 58, 63 von Bewegungsvektoren 269 von Phrasen 82 waveletbasierte 239 Codierungsadaptation 60 Codierungsredundanz 15, 31, 155 Codierungstheorie, Shannon 69 Co-Komponente 185 compression lossless 3
Sachwortverzeichnis lossy 3 CQF 129 Cr-Komponente CYM-Farbraum
183 180
D Datenkompression 31, 154 Ziel 3 Datenmenge 2, 10 Datenrate 18 Datenreduktion 3, 18 Daubechies-Wavelet 133 DC-Koeffizient 195 DCT 112 DCT-Koeffizient 195 Deblocking-Filter 308 Decoder 2 Decodierung 2 arithmetische 53 von Pr¨ afixcodes 44 Decodierungsprozess 155 Dekorrelation 109 optimale 112 von Signalwerten 155 Detailsignal 115, 141 Dezimalsystem 6 Dezimation 19 DFT 111 digitales Fernsehen 274 Digitalisierung 1 von Bilddaten 275 Direkt-Modus 292 Dithering 190 Domain-Block 124 duale Basen 111, 139 Dunkeladaptation 175 DWT 115 dyadische Zerlegung 118 Dynamikbereich 24 E Echtzeit¨ ubertragung 14 Elementarstrom 277 Empf¨ anger 3 Encoder 2 Encodierung 2 Entropie 7 bedingte 75 Quellen32 Entropiecodierung 31, 155 Entscheidungsgehalt 7
Sachwortverzeichnis Ereignis 5 Ereignisfolge 9 Expander-Kennlinie
389
26
F Farbdithering 190 Farbkonstanz 179 Farbmischung additive 179 subtraktive 180 Farbpaletten 189 Farbquantisierung 189 Farbraum CYM180 HLS181 HSI181 RGB179 YCbCr183 YCgCo185 YCgCo-R188 YCoCg185 YIQ183 YUV182 Farbsehen 175 Farbsysteme 177 Farbton 181 Farbtransformation 182 reversible 187 Farb-Unterabtastung 188 Fehlererkennung 1 Fehlermaß 11 Fehlerschutz 1 Fehlervarianz 12 Fernsehnorm 275 Festkomma-Transformation 241 Filter biorthogonale 131 CQF130 Deblocking308 FIR128 Konjugiert-Quadratur129 nichtrekursive 128 symmetrische 131 Wavelet137 Filterbank 126 5/3139 biorthogonale 131 Implementationen 145 orthogonale 129 symmetrische 137 Filterbank-Kaskade 137
Filtereigenschaften 130 Filterentwurf 128, 130, 131, 133 biorthogonaler 132 Kriterien 137 orthogonaler 130 Filterkoeffizient 129 Filterverst¨ arkung 131, 137 Fixed Length Code 33 Fixpunkt 123, 124 Fixpunktsatz 123 Folge von Ereignissen 9 von Symbolen 5 fovea centralis 174 Frequenzbereich 20 Frequenzgang komplement¨ arer 132 von Filtern 132 Funktionensystem, iteriertes 123 G ganzzahlige Wavelet-Transformation Gleichverteilung 8 Golomb-Codes 38, 62 exponentielle 41 GOP 278 Gruppe, Symbol65 H H.263 288 H.264 294 Codierung 41 H.26L 295 Codierung 42 H¨ aufigkeit absolute 49 kumulative 49, 64 H¨ aufigkeitsverteilung 33 Haar-Wavelet 133 Halbbild 176, 285 Halbpixelsch¨ atzung 271 HDTV-Format 276 Helligkeit 181 Helligkeitsadaptation 175 Helligkeitsempfindung 174 Helligkeitskanten 175 Helligkeitssehen 175 Helmholtz-Koordinaten 178 Hochfrequenzteilband 137 Hochpassfilter 127 HSI-Farbraum 181
152
390 I I-Bild 262, 278 299 I PCM-Modus Imaging 20 Impulsantwort 126, 129, 131 Information 2 Informationsgehalt einer Nachricht 8 eines Signals 7 eines Symbols 5 mittlerer 7 Informationsquelle 1 informationstheoretische Grundlagen 5 Informationstr¨ ager 3 Informationsverdichtung 155 Informationsverlust 3 Integer Wavelet Transformation 152, 241 Inter-Block 262 Interpolation 20 Interpolationsfilter 291, 300 Intersymbolredundanz 16, 155 Intervallnummer 21 Intra-Block 262 adiktion 298 Intra 16x16-Pr¨ adiktion 297 Intra 4x4-Pr¨ Irrelevanz 15, 16, 155 Iterationsfolge 123 J JBIG 192 JPEG-LS 225 JPEG-Standard 192 JPEG 2000 239 JVT 295 K Kachel, JPEG 2000 240 Kanal 2 Kanalcodierung 1 Kaskadieren 136, 142 der Blockzerlegung 269 Kategorie, Symbol65 Kausalit¨ at 10 Kommunikationstechnik 9 Kompander 26 Komplexit¨ at 14 Komponente Farb194 spektrale 126 Teilband137 Kompression
Sachwortverzeichnis DCT-basierte 194 objektbasierte 293 verlustbehaftete 3, 155 verlustlose 3, 225 von Bildsequenzen 261 waveletbasierte 158, 239 Kompressionsverfahren, hybrides 154 Kompressionsverh¨ altnis 10 Kompressor-Kennlinie 26 Kontext 9 Kontextquantisierung 62, 227 Kontextumschaltung 61 kontraktive Abbildung 122 Kontraktivit¨ atsfaktor 122 Konvergenz kontraktiver Abbildungen 123 Korrelation von Ereignissen 16 zeitliche 261 zwischen Signalwerten 143 zwischen Transformationskoeffizienten 143 zwischen Vektoren 269 Korrelationskoeffizient 101 L Laufl¨ angencodierung 78 layer, JPEG 2000 240 LGB-Algorithmus 27 Lichtempfindlichkeit 175 Lifting-Schema 148 logarithmische Suche 265 Luminanz 182 Luminanzblock 280 LZ77-Codierung 82 LZ78-Codierung 83 LZW-Codierung 83 M Machsche B¨ ander 175 MAD, mittlerer absoluter Fehler 11 magnitude refinement pass, JPEG 2000 Main-Profil 284 Makroblock 280 Mandelbrotfigur 120 Markensegment 209, 210 Maskierungseffekte 176 Max-Lloyd-Quantisierer 25 MBAFF-Modus 302 MCU 209 Median-Cut-Verfahren 190 Mehrfachaufl¨ osung 115, 137
242
Sachwortverzeichnis
391
Mehrschritt-Suche 265 Metrik 121 Modell H¨ aufigkeits60 Verteilungs64 Modellanpassung 58 Modellumschaltung 64 Modulation 2 Morse-Code 33 MOS-Skala 12 Move-to-Front-Codierung 63, 88 MPEG 273 MPEG-2 284 MPEG-4 289 Part 10 295 MPEG-Systemschicht 277 MSE, mittlerer quadratischer Fehler multiresolution 115 N Nachricht 33 Informationsgehalt Interpretation 9 Nachrichtenquelle 1 NAL 295 Netzhaut 173, 174 Normfarbtafel 178 Notation 4 NTSC 275 Nullstellen 133
8
O Octree-Algorithmus 190 Oktavbandzerlegung 136, 140 Oktavfilterbank 136, 137 Orthogonalsystem 109 Ortsbereich 155 Ortsfrequenz 200 P P-Bild 262, 278 PAL 275 Phase, lineare 131 Phasenverschiebung 147 Phrase 82 Phrasen-Codierung 82 Pol-Nullstellen-Diagramm PPM 77 Pr¨ acodierung 155 Pr¨ adiktion 99 ortliche 296 ¨
133
11
bidirektionale 267, 278 nichtlineare 105 optimale 102 von Bewegungsvektoren 302 von Bildinhalten 263 von Signalwerten 99 zeitliche 263 zweidimensionale 103 Pr¨ adiktionsbild 262 Pr¨ adiktionsfehler 100 Pr¨ adiktionsfehlerbild 265 Pr¨ adiktionsg¨ ute 101 Pr¨ adiktionswert 100 Pr¨ afixcodes 34 universelle 42 precinct, JPEG 2000 242, 251 Profil, MPEG 284 Progression, spektrale 206 progressives Bild 285 ¨ progressive Ubertragung 24 progressive Verarbeitung 205 Prozess, stochastischer 9 PSNR 12 Q QCIF-Format 276 Quadtree-Codierung 89, 162 Qualit¨ at objektive 10 subjektive 10 Qualit¨ atsbewertung 10 Qualit¨ atsmaße 11 Quantisierer midrise 22 midtread 22 Quantisierung 21, 155 der Farbe 189 gleichm¨ aßige 21 logarithmische 26 skalare 21 Vektor26 Wahrnehmungs-optimierte 25 Quantisierungsfehler 21 Quantisierungsfehlerleistung 22 minimale 25 Quantisierungsintervall 21 Quantisierungskennlinie 25 Quantisierungssymbol 21, 155 Quantisierungstabelle JPEG 197 MPEG-1 281
392
Sachwortverzeichnis
Quantisierungswert 197 Quelle 1 bin¨ are 8, 81 Quellencodierung 1 Quellenentropie 7 R R¨ ucktransformation 108 R¨ uckw¨ artspr¨ adiktion 267 Randbehandlung 146 Range-Block 124 Rate-Distortion-Theorie 13 Rauschen 9 RCT 187 Redundanz 1, 15 einer Quelle 15 Referenzbild 262, 264, 300 multiples 300 Referenzblock 267, 300 Rekonstruktion 21 perfekte 103, 108, 128 Rekonstruktionsvektor 26 Rekonstruktionswert 21 Retina 173, 174 RGB-Farbraum 179 Rice-Codes 40, 44, 62, 225 RLC 78 Robustheit 14 Rohdaten 3 run length coding 78 S SAD, Summe der absoluten Fehler Sch¨ atzwert 100 Schicht, JPEG 2000 240 Segmentierung, der Teilbandsignale Selbst¨ ahnlichkeit 121 Separierbarkeit 140 sequentielle Verarbeitung 205 Signalanalyse 137 Signalentropie 7 Signalerweiterung periodische 147 spiegelsymmetrische 147 Signalinformation 24 Signalquelle 1, 32 Signal-Rausch-Verh¨ altnis 11 Signalsynthese 137 Signaltransformation 108, 137 Signalvarianz 12, 101 Signalvektor 26
11
143
Signalverarbeitung, digitale 1 significance propagation, JPEG 2000 242 Signifikanz-Phase, JPEG 2000 242, 243 Skalierbarkeit 285 Skalieren o 285 ¨rtliches von Matrizen 110, 118 von Wavelets 117 zeitliches 285 Skalierungsfunktion 115, 137 5/3139 Daubechies133 Skalierungsmatrix 110 Slice 280 SNR 12 Speicheraufwand 16 Spektralfarbe 181 Spektrum eines Signals 19 wahrnehmbares 174 Spitzen-Signal-Rausch-Verh¨ altnis 12 Sprite 294 St¨ abchen 173, 175 Statistik der Symbole 58 Subpixelsch¨ atzung 266, 300 Suchraum 265 Suchstrategie 265 Symbol 5 Symbolalphabet 32 Symbolstatistik 60 Symbolverteilung 32 Synthese 126 Synthesefilter 127 Synthesehochpass 131 Synthesetiefpassfilter 131 Szenenwechsel 261 T Teilband 141 Teilbandsignale 127 Template 104, 226 Tiefpassfilter 127 Tile, JPEG 2000 240 Totzone 23 Tr¨ ager von Information 3 Trainingsvektoren 27 Transformation 4x4303 9/7-Wavelet151 biorthogonale 111, 139 diskrete Fourier111
Sachwortverzeichnis
393
diskrete Kosinus112, 118 diskrete Wavelet115, 126 dreidimensionale 263 dyadische Wavelet137 Festkomma241 fraktale 120 Haar115, 118 Hauptachsen112 Integer241, 303 irreversible 241 Karhunen-Lo`eve112 mehrdimensionale 108 orthogonale 109 orthogonale Wavelet137 orthonormale 110 reversible 241 Walsh-Hadamard113, 118, 304 Wavelet-Paket142 z126 Transformationsbereich 137 Transformationscoder 154 Transformationskern 108 Transformationskoeffizient 109, 137, 155 Transformationsmatrix 109 skalierte 139 Transparenz 294 Transportstrom 277 U ¨ Uberabtastung 20 ¨ Ubertragungsmodell 1 ¨ Ubergangswahrscheinlichkeit 70 un¨ arer Code 6, 40 universelle Pr¨ afixcodes 42 Unterabtastformate 188 Unterabtastung 19, 127 der Farbkomponenten 188, 280 Unterraum 26 UVLC 42 V vanishing moments 133 Variable Length Code 33 Varianz 12 des Pr¨ adiktionsfehlers des Sch¨ atzfehlersignals VCEG 295 Vektorquantisierung 26 der Farbe 189 Vektorraum 26 Verbundentropie 74
101 100
Verbundereignis 71 Verbundwahrscheinlichkeit 71 Verfeinerungs-Phase, JPEG 2000 Verschiebung von Wavelets 117 Verteilungsstatistik 60 Verz¨ ogerungszeit 14 Verzerrungsmaß 11 Video-Objekte 293 Videosequenz 261 Viererbaum-Codierung 89 VLC 33 Vollbild 176, 285 Voraussage, von Signalamplituden Vorw¨ artspr¨ adiktion 265 VQEG 13 W Wahrnehmung 3 menschliche 182 visuelle 173 Wahrnehmungseigenschaften 16 Wahrnehmungssystem 162 Wahrscheinlichkeit 8 bedingte 70 eines Ereignisses 5 Summen34 ¨ Ubergangs70 Verbund71 Zustands70 Wahrscheinlichkeitsdichte 25 Warping 271 Wavelet 115, 137 5/3139 9/7140 Daubechies133 diskretes 117 Haar119, 133 kontinuierliches 117 Mutter117 Wavelet-Filter 137 5/3132, 146, 150, 166 9/7240, 258 Wavelet-Funktion 115 Wavelet-Koeffizienten 139 Wavelet-Pakete 142 Wavelet-Transformation 115 9/7151 biorthogonale 139 diskrete 126 dyadische 137 ganzzahlige 152
242, 244
100
394 orthogonale 137 WaveQA-Algorithmus 158, 166, 258, 350 WHT 113, 304 W¨ orterbuch 82 Y YCbCr-Farbraum 183 YCgCo-Farbraum 185 YCgCo-R-Farbraum 188 YCoCg-Farbraum 185 YIQ-Farbraum 183 Y-Komponente 182, 183, 185 YUV-Farbraum 182
Sachwortverzeichnis Z Zapfen 173, 175 Zeichen 5 Zeit-Skalierung-Ebene 140 Zellenaufteilung 27 Zerlegung, dyadische 118 Zerlegungsebene 137, 141 Zerlegungsstruktur 126 beste 142 Zerlegungstiefe 137 zero trees 164 Zick-Zack-Abtastung 200 Zick-Zack-Reihenfolge 286 Zufall 9 Zustandsdiagramm 70 Zustandswahrscheinlichkeit 70 Zwei-Kanal-Filterbank 126 kaskadierte 136