• Kompressionsverfahren
  • Urs Pedrocchi, Sportschule Glarnerland
  • 17.03.2023
  • Informatik
  • 2. OS
Um die Lizenzinformationen zu sehen, klicken Sie bitte den gewünschten Inhalt an.

https://informatik.mygymer.chef2021005.codierung-kompression/005.kompression.html#kompression

Er­stel­lung eines Hufmann-​Baumes

Am Bei­spiel der Co­die­rung des Tex­tes «MIS­SIS­SIP­PI» soll der Huffman-​Algorithmus er­läu­tert wer­den.

Zu­erst zählt man, wie oft jedes Zei­chen im Text vor­kommt und er­stellt eine Häu­fig­keits­ta­bel­le.

Zeichen

M

P

I

S

Häuffigkeit

1

Nun geht es darum, einen Co­die­rungs­baum zu er­stel­len. Die Häu­fig­kei­ten der Buch­sta­ben bil­den je einen Kno­ten. Die Häu­fig­keit steht im Kno­ten, der Buch­sta­ben dar­un­ter. Die Kno­ten wer­den nach auf­stei­gen­der Häu­fig­keit sor­tiert:



Kno­ten mit Zei­chen­häu­fig­keit

Nun wer­den die zwei Kno­ten mit den kleins­ten Häu­fig­kei­ten an einen neuen Kno­ten an­ge­hängt. Der neue Kno­ten ent­hält die sum­mier­te Häu­fig­keit der ur­sprüng­li­chen Kno­ten:



Kno­ten zu­sam­men­fas­sen 1

Das wird wie­der­holt, bis alle Kno­ten mit­ein­an­der ver­bun­den sind. Wenn zwei Kno­ten die glei­che Häu­fig­keit haben, spielt es keine Rolle, wel­cher ge­wählt wird:





Kno­ten zu­sam­men­fas­sen 2

Wich­tig ist, dass nach jedem Schritt die Kno­ten wie­der neu sor­tiert wer­den.



Kno­ten zu­sam­men­fas­sen 3

Wenn der Baum fer­tig ist, wer­den alle Äste, wel­che nach links zei­gen, mit einer «0» mar­kiert, alle die nach rechts zei­gen mit einer «1».





Kan­ten be­nen­nen

Nun kann eine Co­die­rungs­ta­bel­le er­stellt wer­den, indem der Code für jedes Zei­chen vom Baum ab­ge­le­sen wird:





1
Auf­ga­be
  • Er­stel­le zu fol­gen­dem Text einen Huffman-​Baum und co­die­re den Text ent­spre­chend:

    EX­TER­NER EF­FEKT

  • Wie viel Bit be­an­sprucht das Wort in Huffman-​Codierung? Wie viel in ASCII?

Kom­pres­si­on

ohne Kom­pres­si­on
Ko­die­ren
De­ko­die­ren
mit Kom­pres­si­on

Bei der Kom­pres­si­on wird ver­sucht, Daten ef­fi­zi­en­ter ab­zu­spei­chern, so dass we­ni­ger Spei­cher­platz be­legt wird. Ge­ra­de beim Über­tra­gen von Daten – z.B. Streamen eines Films, oder gros­ser Da­tei­en– ist dies enorm wich­tig. Wir un­ter­schei­den zwei grund­sätz­lich un­ter­schied­li­che Arten von Kom­pres­si­on:

ver­lust­freie Kom­pres­si­on

Bei der ver­lust­frei­en Kom­pres­si­on, kön­nen die Daten voll­stän­dig re­kon­stru­iert wer­den. D.h. es han­delt sich – wie bei der Co­die­rung – um eine ein­deu­ti­ge und um­kehr­ba­re Ab­bil­dung.



An­wen­dung

Über­all dort, wo kein Ver­lust pas­sie­ren darf – ein Pro­gramm läuft nicht mehr, wenn Be­feh­le feh­len!Bil­der, Audio und Video wäh­rend der Pro­duk­ti­on und Be­ar­bei­tung – sonst würde bei jedem Spei­chern (also Co­die­ren) die Qua­li­tät ab­neh­men.



Bei­spie­le

flac – Sound

zip, rar – Da­tei­en

gif, png, raw, psd, xcf – Gra­fik

ver­lust­be­haf­te­te Kom­pres­si­on

Hier wer­den beim Spei­chern Daten ent­fernt. Da­durch kann ent­spre­chend viel Spei­cher ge­won­nen wer­den, al­ler­dings las­sen sich die Original-​Daten nur noch teil­wei­se re­kon­stru­ie­ren. Es wird ver­sucht vor allem nicht wich­ti­ge Daten weg­zu­las­sen.



An­wen­dung

beim Fer­tig­stel­len von Me­di­en, also wenn diese nicht mehr wei­ter be­ar­bei­tet wer­den sol­len



Bei­spie­le

mp3 – Sound

jpg – Gra­fik

mp4, avi, mov – Video

Huffman-​Codierung

David Huff­man hat 1952 ein Ver­fah­ren ent­wi­ckelt, mit wel­chem Zei­chen platz­spa­ren­der co­diert wer­den kön­nen. Seine Idee ist, dass Zei­chen, wel­che häu­fig im Text vor­kom­men, einen kür­ze­ren Code er­hal­ten, als Zei­chen, wel­che sel­ten im Text vor­kom­men.



Code­baum

Ein Code­baum ist eine Struk­tur mit einem Start­kno­ten. Von die­sem aus geht es ent­we­der nach links oder rechts unten wei­ter. Eine 0 im Code be­deu­tet nach links gehen, eine 1 nach rechts gehen. Wenn ein Kno­ten mit einem Buch­sta­ben er­reicht wird, hat man ein Zei­chen de­co­diert, man be­ginnt wie­der von vorne.

De­co­die­re die fol­gen­de Bit­fol­ge mit dem oben­ste­hen­den Code­baum. (SP) steht für ein Leer­zei­chen (engl. space).

0111101011000110110101

Co­die­re den er­hal­te­nen Text nun wahl­wei­se in ASCII und an­schlies­send in Bi­när­code.
Wie lange ist die er­hal­te­ne Bit­fol­ge?

ver­lust­freie Kom­pri­mie­rung von Bil­dern

Wie wir be­reits ge­lernt haben, kön­nen Bil­der als Ras­ter be­stehend aus ein­zel­nen Pixel ge­spei­chert wer­den. Das Bild unten be­steht aus 195 Pixel in 13 Zei­len und 15 Spal­ten. Die­ses Bild be­sitzt zwei Farb­wer­te, hell oder dun­kel. Ein Pixel kann in die­sem Fall mit einem Bit, einer Eins oder einer Null ge­spei­chert wer­den. Das Bild kann durch das fol­gen­de Bit­mus­ter be­schrie­ben wer­den:

15,

1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,

1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,

1,1,0,0,0,0,0,0,0,0,0,0,1,1,1,

1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,

1,1,1,0,0,0,0,0,0,0,0,1,1,1,1,

1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,

1,1,1,1,1,0,0,0,0,1,1,1,1,1,1,

1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,

1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,

1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,

1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,

1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,

1,1,1,0,0,0,0,0,0,0,0,1,1,1,1

Eine kom­pak­te­re Art der Co­die­rung ist die Lauflängen-​Methode. Dabei wird ge­zählt wie viele

Pixel der glei­chen Farbe auf­ein­an­der fol­gen. Das obere Bild be­ginnt mit 16 dunk­len Pixel, dann fol­gen 12 helle, da­nach wie­der 4 dunk­le, usw. Eine Lauf­län­gen Co­die­rung des obi­gen Bil­des sieht wie folgt aus:

15,0,16,12,4,10,6,8,7,8,8,6,10,4,12,2,13,2,13,2,13,2,13,2,10,8,4

Zur De­co­die­rung des Codes und für das Zeich­nen des Bil­des wird die An­zahl Spal­ten be­nö­tigt, wel­che das Bild hat. Dies ist der erste Wert der hier ge­wähl­ten Lauf­län­gen Co­die­rung da­nach fol­gen ab­wechs­lungs­wei­se die An­zahl hel­ler und dunk­ler Pixel. In die­sem Fall be­ginnt es mit 0 hel­len Pixel, dann 16 dunk­len Pixel, dann 12 hel­len, u.s.w.

2
De­ko­die­ren - Er­zeu­gen von Pi­xel­bil­dern
Zu den fol­gen­den Lauf­län­gen Codes sol­len die ent­spre­chen­den Bil­der ge­zeich­net wer­den. Es muss dar­auf ge­ach­tet wer­den, dass die An­zahl der Spal­ten ent­spre­chend der ers­ten Zahl im Lauf­län­gen Code ist. De­ko­die­re (zeich­ne) die fol­gen­den Bil­der:
  • 19,0,42,12,8,10,8,1,1,8,1,1,7,2,1,6,1,2,7,3,1,4,1,3,7,3,2,2,2,3,7,2,1,2,2,2,1,2,7,1,1,8,1,1,8,10,8,12,22
  • 19,0,42,5,1,5,7,13,6,13,6,13,6,13,7,11,9,9,11,7,13,5,15,3,17,1,9
  • 15,0,36,1,13,3,11,5,9,7,7,9,5,11,3,13,4,9,6,9,6,3,3,3,6,3,3,3,6,3,3,3,6,3,3,3,4
  • 17,0,25,5,9,8,9,8,9,6,1,1,9,2,5,1,9,1,6,1,9,1,6,1,9,1,4,3,9,1,3,4,6,4,3,4,6,4,3,4,6,3,29
3
Lauf­län­gen ko­die­ren
Zeich­ne in einem lee­ren Ras­ter ein Mus­ter oder eine Pi­xel­gra­fik . Ko­die­re nun das er­stell­te Werk mit Hilfe der Lauf­län­gen Me­tho­de. Die erste Zahl im Code gibt die An­zahl Spal­ten an, die fol­gen­de Zahl die An­zahl helle Pixel. Als Bei­spiel lie­fert das Pixel-​Muster rechts den fol­gen­den Code.

6,12,12,3,3,3,3
4
De­ko­die­ren
Die er­stell­ten Lauf­län­gen Co­die­run­gen kön­nen mit Hilfe der elek­tro­ni­schen Bei­la­ge über­prüft wer­den. Mit die­ser las­sen sich auch Pixel-​Muster be­lie­bi­ger Grös­se in­ter­ak­tiv er­zeu­gen.
Scan­ne dazu den ne­ben­ste­hen­den QR-​Code und gib dei­nen Code ein. Kli­cke an­schlies­send auf De­co­die­ren und über­prü­fe dein Bild.

ver­lust­freie Kom­pri­mie­rung von Tex­ten durch die Huff­man Co­die­rung

David Huff­man hat 1952 ein Ver­fah­ren ent­wi­ckelt, mit wel­chem Zei­chen platz­spa­ren­der co­diert wer­den kön­nen. Seine Idee ist, dass Zei­chen, wel­che häu­fig im Text vor­kom­men, einen kür­ze­ren Code er­hal­ten, als Zei­chen, wel­che sel­ten im Text vor­kom­men.

Code­baum

Ein Code­baum ist eine Struk­tur mit einem Start­kno­ten. Von die­sem aus geht es ent­we­der nach links oder rechts unten wei­ter. Eine 0 im Code be­deu­tet nach links gehen, eine 1 nach rechts gehen. Wenn ein Kno­ten mit einem Buch­sta­ben er­reicht wird, hat man ein Zei­chen de­co­diert, man be­ginnt wie­der von vorne.

Huffmann-​Baum für Anna
1
De­co­die­re die fol­gen­de Bit­fol­ge mit dem ne­ben­ste­hen­den Code­baum.
(SP) steht für ein Leer­zei­chen (engl. space).
0111101011000110110101
1
Co­die­re den er­hal­te­nen Text nun in ASCII und an­schlies­send in Bi­när­code.
Wie lange ist die er­hal­te­ne Bit­fol­ge?
x