07.03.2014 Views

Kompresja danych – kodowanie Huffmana

Kompresja danych – kodowanie Huffmana

Kompresja danych – kodowanie Huffmana

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<strong>Kompresja</strong> <strong>danych</strong> <strong>–</strong><br />

<strong>kodowanie</strong> <strong>Huffmana</strong><br />

Dariusz Sobczuk


Plan wykładu<br />

Kodowanie metodą Shannona-Fano<br />

Kodowanie metodą <strong>Huffmana</strong><br />

Elementarny kod Golomba<br />

Kod Golomba<br />

Kod Rice’a<br />

kompresja <strong>danych</strong> 2


Efektywny kod symboli<br />

Słowa kodowe przyporządkowane są pojedynczym<br />

symbolom i mają różną liczbę bitów (warunek<br />

efektywnego kodu symboli)<br />

Słowa symboli o większym prawdopodobieństwie<br />

wystąpienia na wejściu są krótsze (długość słów<br />

proporcjonalna do il. Informacji związanej z danymi<br />

wydarzeniami)<br />

Kod jest przedrostkowy, czyli jednoznacznie<br />

dekodowalny (można korzystać za struktury drzewa<br />

binarnego)<br />

kompresja <strong>danych</strong> 3


Kodowanie Shannona<strong>–</strong>Fano (1948<strong>–</strong>1949)<br />

Pierwsza propozycja budowy kodu<br />

efektywnego o minimalnej redundancji<br />

Algorytm konstrukcji kodu nie gwarantuje,<br />

że zawsze zostanie uzyskany kod o<br />

minimalnej redundancji<br />

kompresja <strong>danych</strong> 4


Kod Shannona-Fano<br />

1. Określ wagi (il wystąpień) poszczególnych symboli<br />

2. Posortuj listę symboli w nierosnącym porządku<br />

wag, i ustal ją jako grupę początkową<br />

3. Podziel grupę symboli na dwie części o możliwie<br />

równej sumie wag z zachowaniem porządku listy<br />

4. Przyporządkuj symbolom grupy z większą wagą 0,<br />

a symbolom z mniejszą wagą 1<br />

5. Rekursywnie powtórz kroki 3 i 4, aż grupa<br />

początkowa podzielona zostanie na<br />

jednoelementowe grupy<br />

kompresja <strong>danych</strong> 5


Przykład kodowania metodą S-F<br />

Dany alfabet As={a,b,c,d,e} z wagami odpowiednio<br />

w(a)=6, w(b)=12, w(c)=4, w(d)=5, w(e)=4<br />

Posortowanie<br />

b,a,d,c,e wagi 12,6,5,4,4<br />

Pierwszy podział<br />

wagi 12,6 | 5,4,4 kod 0,0,1,1,1<br />

Następne 12 | 6 || 5 | 4,4 kod 00,01,10,11,11<br />

Końcowy kod 00,01,10,110,111<br />

kompresja <strong>danych</strong> 6


Binarne drzewo dla metody S-F<br />

0 1<br />

0 1 0 1<br />

b<br />

a<br />

d<br />

0 1<br />

c<br />

e<br />

kompresja <strong>danych</strong> 7


Efektywność metody S-F<br />

Entropia H dla tego przypadku wynosi<br />

H = 2.176<br />

Średnia bitowa<br />

L = 2.258<br />

Nie jest to wartość optymalna, nawet w tej<br />

klasie koderów<br />

Pomimo to używana jest w takich koderach<br />

jak WinZip, oraz Cabarc firmy Microsoft<br />

kompresja <strong>danych</strong> 8


Optymalne drzewo binarne<br />

kodu symboli<br />

Własności takiego drzewa to:<br />

Liść symbolu o najmniejszej wadze ma najdłuższe<br />

słowo, czyli leży najgłębiej w drzewie<br />

drzewo jest binarne i lokalnie pełne, a więc liść<br />

leżący na najgłębszym poziomie ma brata, którym<br />

jest liść o drugiej w kolejności najmniejszej wadze<br />

Własność tę posiada drzewo <strong>Huffmana</strong>, które<br />

jest optymalne w swojej klasie kodów symboli<br />

kompresja <strong>danych</strong> 9


Kodowanie <strong>Huffmana</strong> (1952)<br />

Shannon opowiada na wykładzie o<br />

problemach związanych z konstrukcją kodu o<br />

minimalnej redundancji<br />

Huffman, student Shannona po niedługim<br />

czasie proponuje właściwe rozwiązanie, dzięki<br />

czemu... zostaje zwolniony ze zdawania<br />

egzaminu<br />

kompresja <strong>danych</strong> 10


Kod <strong>Huffmana</strong> <strong>–</strong> założenia<br />

Symbolom o większym prawdopodobieństwie<br />

wystąpienia odpowiadają kody krótsze niż<br />

symbolom o mniejszym prawdopodobieństwie<br />

wystąpienia<br />

Dwóm najrzadziej występujące symbolom<br />

odpowiadają kody tej samej długości<br />

Niemożliwe skrócenie kodu dla żadnego<br />

symbolu<br />

kompresja <strong>danych</strong> 11


Kod <strong>Huffmana</strong><br />

1. Określ wagi dla symboli, tworząc zbiór wolnych<br />

wierzchołków<br />

2. Sortuj listę wierzchołków wolnych nierosnąco<br />

3. Dwa wolne wierzchołki z najmniejszymi wagami i<br />

połącz z tworzonym węzłem rodzica. Wagę rodzica<br />

ustal jako sumę wag dzieci. Zastąp te wierzchołki<br />

wierzchołkiem rodzica nadając dzieciom etykiety<br />

odpowiednio 0 i 1<br />

4. Powtarzaj krok 3 , aż zostanie wolny korzeń drzewa<br />

5. Odczytaj ze struktury drzewa słowa kodowe liści<br />

kompresja <strong>danych</strong> 12


Przykład drzewa <strong>Huffmana</strong><br />

porównanie<br />

0 1<br />

0 1<br />

12<br />

b<br />

19<br />

0 1 0 1<br />

11<br />

0 1<br />

8<br />

b<br />

a<br />

d<br />

0 1 0 1<br />

6 5 4 4<br />

a<br />

d<br />

c<br />

e<br />

c<br />

0 1<br />

e<br />

Drzewo <strong>Huffmana</strong><br />

Shanona-Fano<br />

kompresja <strong>danych</strong> 13


Kodowanie <strong>Huffmana</strong><br />

porównanie<br />

Weźmy ten sam przykład co dla S-F<br />

Otrzymujemy inne drzewo kodowe<br />

Entropia H dla tego wynosi H = 2.176<br />

Średnia bitowa dla S-F 2.258<br />

Średnia bitowa dla <strong>Huffmana</strong> 2.226<br />

Dla kodowania <strong>Huffmana</strong> jest to<br />

wartość optymalna w klasie koderów<br />

symboli<br />

kompresja <strong>danych</strong> 14


Przykładowy sekwencja<br />

poddawana kompresji<br />

Jakżeż ja się uspokoję <strong>–</strong><br />

Pełne strachu oczy moje,<br />

Pełne grozy myśli moje,<br />

Pełne trwogi serce moje,<br />

Pełne drżenia piersi moje <strong>–</strong><br />

Jakżeż ja się uspokoję...<br />

kompresja <strong>danych</strong> 15


Drzewo <strong>Huffmana</strong><br />

dla badanego tekstu<br />

153<br />

36<br />

65<br />

88<br />

18<br />

29<br />

48<br />

40<br />

8<br />

15<br />

25<br />

20<br />

4<br />

7<br />

12<br />

23<br />

10<br />

2 2 10 3 4 8 14 6 6 13 12 5<br />

1 1 1 1 4 5 5 18 1 2 2 2 4 4 7 7 3 3 3 3 6 7 6 6 11 2 3 5 10 20<br />

d h l ś ł m n e w g t z ę k p s u y , . N i a r o <strong>–</strong> c ż j<br />

W<br />

S<br />

P<br />

kompresja <strong>danych</strong> 16


Kod <strong>Huffmana</strong> dla badanego<br />

tekstu<br />

Symbol L. wyst. Kod Symbol L. wyst. Kod<br />

a 6 10100 p 7 0110<br />

c 3 110001 r 6 10101<br />

d 1 0000000 s 7 0111<br />

e 18 001 ś 1 0000011<br />

ę 4 01010 t 2 010010<br />

g 2 010001 u 3 100000<br />

h 1 0000001 w 1 010000<br />

i 7 10011 y 3 100001<br />

j 10 1101 z 2 010011<br />

k 4 01011 ż 5 11001<br />

l 1 0000010 , 3 100010<br />

ł 4 00001 . 3 100011<br />

m 5 00010 <strong>–</strong> 2 110000<br />

n 5 00011 20 111<br />

o 11 1011 6 10010<br />

kompresja <strong>danych</strong> 17


Kod <strong>Huffmana</strong> <strong>–</strong> cechy<br />

Nieskomplikowany sposób budowy drzewa<br />

<strong>Huffmana</strong><br />

Kod jest optymalny, tzn. nie istnieje sposób<br />

kodowania przyporządkowujący symbolom<br />

kody o innych długościach, dla którego<br />

średnia długość kodu byłaby mniejsza<br />

kompresja <strong>danych</strong> 18


Kod <strong>Huffmana</strong> <strong>–</strong> przykład tekstu<br />

Zastosowanie kodu <strong>Huffmana</strong> dla<br />

testowej wiadomości powoduje<br />

otrzymanie średniej długości kodu na<br />

symbol 4,48 bit (przy entropii 4,45 bit<br />

na symbol)<br />

kompresja <strong>danych</strong> 19


Czy kod <strong>Huffmana</strong><br />

to już koniec?<br />

Kodowanie <strong>Huffmana</strong> jest optymalne w klasie<br />

algorytmów przypisujących symbolom kody<br />

o długości wyrażonej w całkowitej liczbie<br />

bitów<br />

Możliwe jest skonstruowanie kodu, który<br />

średnio będzie przypisywał kody o<br />

długościach będących ułamkami bitów<br />

kompresja <strong>danych</strong> 20


Kod dwójkowy<br />

o prawie stałej długości<br />

W kodzie dwójkowym o prawie stałej wartości B n<br />

’<br />

dla<br />

n-elementowego alfabetu As={a 0 ,...,a n-1 } pierwszym<br />

r symbolom przypisywane są słowa k=[log 2 n] bitowe<br />

postaci B n’ (a i )=B k (i) a pozostałym słowa o długości<br />

(k+1) bitów postaci B n’ (a i )=B k+1 (r+i), r=2 k+1 <strong>–</strong>n<br />

Dla źródeł o alfabecie zawierającym n=2 i , i=1,2,...<br />

symboli B n’ =B i a r=0, kod staje się kodem o stałej<br />

długości<br />

kompresja <strong>danych</strong> 21


Przypomnienie: kod unarny<br />

Symbol<br />

Kod<br />

0 0<br />

1 10<br />

2 110<br />

3 1110<br />

4 11110<br />

5 111110<br />

6 1111110<br />

7 11111110<br />

8 111111110<br />

9 1111111110<br />

10 11111111110<br />

11 111111111110<br />

12 1111111111110<br />

13 11111111111110<br />

14 111111111111110<br />

15 1111111111111110<br />

Symbol<br />

Kod<br />

0 1<br />

1 01<br />

2 001<br />

3 0001<br />

4 00001<br />

5 000001<br />

6 0000001<br />

7 00000001<br />

8 000000001<br />

9 0000000001<br />

10 00000000001<br />

11 000000000001<br />

12 0000000000001<br />

13 00000000000001<br />

14 000000000000001<br />

15 0000000000000001<br />

kompresja <strong>danych</strong> 22


Elementarny kod Golomba<br />

Niech dla parametru m (rząd kodu), EGm oznacza<br />

kod o zmienno-zmiennej wartości zdefiniowany przez<br />

alfabet As={1,01,...,0 i 1,...,0 m-1 1,0 m } (ciąg prawie jak<br />

przy kodowaniu unarnym), gdzie 0 i oznacza ciąg 0 o<br />

długości i. Kod EGm przypisuje rozszerzonemu<br />

symbolowi a m = 0 m wartość ζ m = 0, podczas gdy<br />

symbole a i =0 i 1 są kodowane za pomocą przedrostka<br />

1 z dołączoną reprezentacją i w kodzie dwójkowym<br />

prawie stałej wartości B n’ .<br />

Warto zwrócić uwagę, że kod jest korzystny w<br />

przypadku często pojawiających się wartości 0 m<br />

kompresja <strong>danych</strong> 23


Słowa elementarnego<br />

kodu Golomba<br />

Alfabet<br />

a 0<br />

Bit ciągi alfabetu<br />

dla m=8<br />

Słowa<br />

kodowe<br />

Bit ciągi alfabetu dla<br />

m=9<br />

Słowa<br />

kodowe<br />

1 1000<br />

1 1000<br />

a 1<br />

01 1001<br />

01 1001<br />

a 2<br />

001 1010<br />

001 1010<br />

a 3<br />

0001 1011<br />

0001 1011<br />

a 4<br />

00001 1100<br />

00001 1100<br />

a 5<br />

000001 1101<br />

000001 1101<br />

a 6<br />

0000001 1110<br />

0000001 1110<br />

a 7<br />

0000001 1111<br />

0000001 11110<br />

a 8<br />

0000000<br />

0<br />

00000001 11111<br />

a 9<br />

--<br />

--<br />

00000000<br />

0<br />

kompresja <strong>danych</strong> 24


Kod Golomba<br />

Kod Golomba to kod symboli o nieskończonym<br />

alfabecie źródła z rzędem kodu m oznaczany Gm.<br />

Alfabet , składający się w wersji podstawowej z<br />

kolejnych liczb całkowitych nieujemnych, dzielony<br />

jest na rozłączne przedziały o stałej długości<br />

określonej przez rząd kodu<br />

A S ={(0,1,...,m-1),(m,m+1,...,2m-1),...} lub<br />

A<br />

S<br />

(<br />

= { π<br />

m)<br />

0<br />

(<br />

, π<br />

m)<br />

1<br />

,....}<br />

kompresja <strong>danych</strong> 25


Kod Golomba cd<br />

Formułując słowo kodowe ζ i należy wskazać numer<br />

przedziału u do którego trafia symbol i, a potem<br />

miejsce i od początku tego przedziału d.<br />

Długość przedziału m powinna się korelować z<br />

geometrycznym rozkładem prawdopodobieństwa<br />

źródła (gdzie p i+1 = ρ·p i )<br />

Szybsze opadanie charakterystyki (mniejsze ρ)<br />

wymaga krótszych przedziałów, wolniejsze dłuższych<br />

Odpowiedni dobór wartości m do szacowanej<br />

wartości ρ decyduje o efektywności kodu<br />

kompresja <strong>danych</strong> 26


Kod Golomba cd<br />

Słowo Golomba składa się z dwóch części:<br />

przedrostka będącego numerem przedziału<br />

symbolu zapisanego w kodzie unarnym, o<br />

potencjalnie nieograniczonej liczbie symboli<br />

przyrostka wskazującego odległość od początku<br />

przedziału wyrażoną słowem kodu dwójkowego<br />

prawie stałej długości<br />

Kod Golomba dla m=1 jest kodem unarnym<br />

kompresja <strong>danych</strong> 27


Kod Golomba - różne rzędy<br />

i<br />

m=1<br />

m=2<br />

m=3<br />

0<br />

0<br />

0|0<br />

0|0<br />

1<br />

10<br />

0|1<br />

0|10<br />

2<br />

110<br />

10|0<br />

0|11<br />

3<br />

1110<br />

10|1<br />

10|0<br />

4<br />

11110<br />

110|0<br />

10|10<br />

5<br />

111110<br />

110|1<br />

10|11<br />

6<br />

1111110<br />

1110|0<br />

110|0<br />

7<br />

11111110<br />

1110|1<br />

110|10<br />

8<br />

111111110<br />

11110|0<br />

110|11<br />

..<br />

...<br />

...<br />

...<br />

kompresja <strong>danych</strong> 28


Przykład tworzenia kodu Golomba<br />

Wyznaczymy słowo kodowe dla m=3<br />

oraz i=13<br />

[i/m]=[13/3]=4; U(4)=11110<br />

Przyrostek słowa zapisany w kodzie<br />

dwójkowym prawie stałej długości dla<br />

wartości d= (i mod m) =1; B’(1)=10<br />

Daje to słowo kodowe G(13)=1111010<br />

kompresja <strong>danych</strong> 29


Wyznaczanie rzędu kodu Golomba<br />

Rząd kodu Golomba powinien określać<br />

długość serii powtórzeń bardziej<br />

prawdopodobnych symboli źródła<br />

Warunek Golomba określa rząd jako:<br />

m<br />

⎡ log(1 + ρ)<br />

⎢ log ρ<br />

=<br />

−1<br />

⎤<br />

⎥<br />

kompresja <strong>danych</strong> 30


Kod Rice’a<br />

Szczególny przypadek kodu Golomba,<br />

dla m=2 k nazwany jest kodem Rice’a R k<br />

k mniej znaczących bitów zostaje<br />

zapisana jako przyrostek słowa<br />

kodowego<br />

bardziej znaczące bity po przesunięciu o<br />

k pozycji w prawo zostaje zapisane w<br />

kodzie unarnym<br />

kompresja <strong>danych</strong> 31


Kod Rice’a - różne rzędy<br />

i<br />

k=1<br />

k=2<br />

k=3<br />

0<br />

0|0<br />

0|00<br />

0|000<br />

1<br />

0|1<br />

0|01<br />

0|001<br />

2<br />

10|0<br />

0|10<br />

0|010<br />

3<br />

10|1<br />

0|11<br />

0|011<br />

4<br />

110|0<br />

10|00<br />

0|100<br />

5<br />

110|1<br />

10|01<br />

0|101<br />

6<br />

1110|0<br />

10|10<br />

0|110<br />

7<br />

1110|1<br />

10|11<br />

0|111<br />

8<br />

11110|0<br />

110|00<br />

10|000<br />

..<br />

...<br />

...<br />

...<br />

kompresja <strong>danych</strong> 32


Przykład kodowania Rice’a<br />

Słowo kodu R 2 dla i=6<br />

Dwójkową reprezentację i=110 dzielimy<br />

na dwie części 1|10<br />

Starszą część zapisujemy w postaci<br />

kodu unarnego U(1)=10<br />

Dołączamy przyrostek 10<br />

Otrzymujemy R 2 (6)=1010<br />

kompresja <strong>danych</strong> 33


Kod Rice’a realizacja<br />

Kody Rice’a definiowane są jako dynamiczne kody<br />

Goloba<br />

Źródłowy ciąg dzielony jest na bloki o stałych lub<br />

zmiennych rozmiarach. W każdym bloku ustalony<br />

zostaje najkorzystniejszy kod Rice’a<br />

Do każdego bloku trzeba dołączyć identyfikator<br />

określonej postaci kodu Rice’a<br />

Kod Rice’a z adaptacyjnie dobieraną wartością k dla<br />

każdej kodowanej wartości wykorzystano w<br />

standardzie JPEG-LS<br />

kompresja <strong>danych</strong> 34


Plan następnego wykładu<br />

Kodowanie arytmetyczne<br />

Kodowanie adaptacyjne<br />

Dla kodowania arytmetycznego<br />

Dla kodowania <strong>Huffmana</strong><br />

Porównanie różnych kodowań<br />

adaptacyjnych<br />

kompresja <strong>danych</strong> 35

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!