Kompresja danych – kodowanie Huffmana Dariusz Sobczuk Plan wykładu Kodowanie metodą Shannona-Fano Kodowanie metodą Huffmana Elementarny kod Golomba Kod Golomba Kod Rice’a kompresja danych 2 Efektywny kod symboli Słowa kodowe przyporządkowane są pojedynczym symbolom i mają różną liczbę bitów (warunek efektywnego kodu symboli) Słowa symboli o większym prawdopodobieństwie wystąpienia na wejściu są krótsze (długość słów proporcjonalna do il. Informacji związanej z danymi wydarzeniami) Kod jest przedrostkowy, czyli jednoznacznie dekodowalny (można korzystać za struktury drzewa binarnego) kompresja danych 3 Kodowanie Shannona–Fano (1948–1949) Pierwsza propozycja budowy kodu efektywnego o minimalnej redundancji Algorytm konstrukcji kodu nie gwarantuje, że zawsze zostanie uzyskany kod o minimalnej redundancji kompresja danych 4 Kod Shannona-Fano 1. 2. 3. 4. 5. Określ wagi (il wystąpień) poszczególnych symboli Posortuj listę symboli w nierosnącym porządku wag, i ustal ją jako grupę początkową Podziel grupę symboli na dwie części o możliwie równej sumie wag z zachowaniem porządku listy Przyporządkuj symbolom grupy z większą wagą 0, a symbolom z mniejszą wagą 1 Rekursywnie powtórz kroki 3 i 4, aż grupa początkowa podzielona zostanie na jednoelementowe grupy kompresja danych 5 Przykład kodowania metodą S-F Dany alfabet As={a,b,c,d,e} z wagami odpowiednio w(a)=6, w(b)=12, w(c)=4, w(d)=5, w(e)=4 Posortowanie b,a,d,c,e wagi 12,6,5,4,4 Pierwszy podział wagi 12,6 | 5,4,4 kod 0,0,1,1,1 Następne 12 | 6 || 5 | 4,4 kod 00,01,10,11,11 Końcowy kod 00,01,10,110,111 kompresja danych 6 Binarne drzewo dla metody S-F 0 0 b 1 1 0 a 1 d 0 c kompresja danych 1 e 7 Efektywność metody S-F Entropia H dla tego przypadku wynosi H = 2.176 Średnia bitowa L = 2.258 Nie jest to wartość optymalna, nawet w tej klasie koderów Pomimo to używana jest w takich koderach jak WinZip, oraz Cabarc firmy Microsoft kompresja danych 8 Optymalne drzewo binarne kodu symboli Własności takiego drzewa to: Liść symbolu o najmniejszej wadze ma najdłuższe słowo, czyli leży najgłębiej w drzewie drzewo jest binarne i lokalnie pełne, a więc liść leżący na najgłębszym poziomie ma brata, którym jest liść o drugiej w kolejności najmniejszej wadze Własność tę posiada drzewo Huffmana, które jest optymalne w swojej klasie kodów symboli kompresja danych 9 Kodowanie Huffmana (1952) Shannon opowiada na wykładzie o problemach związanych z konstrukcją kodu o minimalnej redundancji Huffman, student Shannona po niedługim czasie proponuje właściwe rozwiązanie, dzięki czemu... zostaje zwolniony ze zdawania egzaminu kompresja danych 10 Kod Huffmana – założenia Symbolom o większym prawdopodobieństwie wystąpienia odpowiadają kody krótsze niż symbolom o mniejszym prawdopodobieństwie wystąpienia Dwóm najrzadziej występujące symbolom odpowiadają kody tej samej długości Niemożliwe skrócenie kodu dla żadnego symbolu kompresja danych 11 Kod Huffmana 1. 2. 3. 4. 5. Określ wagi dla symboli, tworząc zbiór wolnych wierzchołków Sortuj listę wierzchołków wolnych nierosnąco Dwa wolne wierzchołki z najmniejszymi wagami i połącz z tworzonym węzłem rodzica. Wagę rodzica ustal jako sumę wag dzieci. Zastąp te wierzchołki wierzchołkiem rodzica nadając dzieciom etykiety odpowiednio 0 i 1 Powtarzaj krok 3 , aż zostanie wolny korzeń drzewa Odczytaj ze struktury drzewa słowa kodowe liści kompresja danych 12 Przykład drzewa Huffmana porównanie 0 0 12 1 1 19 b 0 0 1 b 8 11 1 0 a 1 d 0 0 1 6 a d 5 0 4 c Drzewo Huffmana 1 4 c 1 e e Shanona-Fano kompresja danych 13 Kodowanie Huffmana porównanie Weźmy ten sam przykład co dla S-F Otrzymujemy inne drzewo kodowe Entropia H dla tego wynosi H = 2.176 Średnia bitowa dla S-F 2.258 Średnia bitowa dla Huffmana 2.226 Dla kodowania Huffmana jest to wartość optymalna w klasie koderów symboli kompresja danych 14 Przykładowy sekwencja poddawana kompresji Jakżeż ja się uspokoję – Pełne strachu oczy moje, Pełne grozy myśli moje, Pełne trwogi serce moje, Pełne drżenia piersi moje – Jakżeż ja się uspokoję... kompresja danych 15 Drzewo Huffmana dla badanego tekstu 153 65 88 36 18 29 8 15 4 2 48 25 7 2 10 3 40 20 12 4 8 14 6 23 6 13 12 10 5 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 d h l ś ł m n e w g t z ę k p s u y , . N i W kompresja danych a r o – c ż j S P 16 Kod Huffmana dla badanego tekstu Symbol a c d e ę g h i j k l ł m n o L. wyst. 6 3 1 18 4 2 1 7 10 4 1 4 5 5 11 Kod 10100 110001 0000000 001 01010 010001 0000001 10011 1101 01011 0000010 00001 00010 00011 1011 Symbol p r s ś t u w y z ż , . – <spacja> <nw> kompresja danych L. wyst. 7 6 7 1 2 3 1 3 2 5 3 3 2 20 6 Kod 0110 10101 0111 0000011 010010 100000 010000 100001 010011 11001 100010 100011 110000 111 10010 17 Kod Huffmana – cechy Nieskomplikowany sposób budowy drzewa Huffmana Kod jest optymalny, tzn. nie istnieje sposób kodowania przyporządkowujący symbolom kody o innych długościach, dla którego średnia długość kodu byłaby mniejsza kompresja danych 18 Kod Huffmana – przykład tekstu Zastosowanie kodu Huffmana dla testowej wiadomości powoduje otrzymanie średniej długości kodu na symbol 4,48 bit (przy entropii 4,45 bit na symbol) kompresja danych 19 Czy kod Huffmana to już koniec? Kodowanie Huffmana jest optymalne w klasie algorytmów przypisujących symbolom kody o długości wyrażonej w całkowitej liczbie bitów Możliwe jest skonstruowanie kodu, który średnio będzie przypisywał kody o długościach będących ułamkami bitów kompresja danych 20 Kod dwójkowy o prawie stałej długości W kodzie dwójkowym o prawie stałej wartości Bn’ dla n-elementowego alfabetu As={a0,...,an-1} pierwszym r symbolom przypisywane są słowa k=[log2n] bitowe postaci Bn’(ai)=Bk(i) a pozostałym słowa o długości (k+1) bitów postaci Bn’(ai)=Bk+1(r+i), r=2k+1 – n Dla źródeł o alfabecie zawierającym n=2i, i=1,2,... symboli Bn’=Bi a r=0, kod staje się kodem o stałej długości kompresja danych 21 Przypomnienie: kod unarny Symbol 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Kod 0 10 110 1110 11110 111110 1111110 11111110 111111110 1111111110 11111111110 111111111110 1111111111110 11111111111110 111111111111110 1111111111111110 Symbol 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 kompresja danych Kod 1 01 001 0001 00001 000001 0000001 00000001 000000001 0000000001 00000000001 000000000001 0000000000001 00000000000001 000000000000001 0000000000000001 22 Elementarny kod Golomba Niech dla parametru m (rząd kodu), EGm oznacza kod o zmienno-zmiennej wartości zdefiniowany przez alfabet As={1,01,...,0i1,...,0m-11,0m} (ciąg prawie jak przy kodowaniu unarnym), gdzie 0i oznacza ciąg 0 o długości i. Kod EGm przypisuje rozszerzonemu symbolowi am= 0m wartość ζm= 0, podczas gdy symbole ai=0i1 są kodowane za pomocą przedrostka 1 z dołączoną reprezentacją i w kodzie dwójkowym prawie stałej wartości Bn’. Warto zwrócić uwagę, że kod jest korzystny w przypadku często pojawiających się wartości 0m kompresja danych 23 Słowa elementarnego kodu Golomba Alfabet Bit ciągi alfabetu dla m=8 Słowa kodowe Bit ciągi alfabetu dla m=9 Słowa kodowe a0 1 1000 1 1000 a1 01 1001 01 1001 a2 001 1010 001 1010 a3 0001 1011 0001 1011 a4 00001 1100 00001 1100 a5 000001 1101 000001 1101 a6 0000001 1110 0000001 1110 a7 0000001 1111 0000001 11110 a8 0000000 0 00000001 11111 a9 -- -- 00000000 0 kompresja danych 24 Kod Golomba Kod Golomba to kod symboli o nieskończonym alfabecie źródła z rzędem kodu m oznaczany Gm. Alfabet , składający się w wersji podstawowej z kolejnych liczb całkowitych nieujemnych, dzielony jest na rozłączne przedziały o stałej długości określonej przez rząd kodu AS={(0,1,...,m-1),(m,m+1,...,2m-1),...} lub AS = {π 0( m ) , π 1( m ) ,....} kompresja danych 25 Kod Golomba cd Formułując słowo kodowe ζi należy wskazać numer przedziału u do którego trafia symbol i, a potem miejsce i od początku tego przedziału d. Długość przedziału m powinna się korelować z geometrycznym rozkładem prawdopodobieństwa źródła (gdzie pi+1= ρ·pi) Szybsze opadanie charakterystyki (mniejsze ρ) wymaga krótszych przedziałów, wolniejsze dłuższych Odpowiedni dobór wartości m do szacowanej wartości ρ decyduje o efektywności kodu kompresja danych 26 Kod Golomba cd Słowo Golomba składa się z dwóch części: przedrostka będącego numerem przedziału symbolu zapisanego w kodzie unarnym, o potencjalnie nieograniczonej liczbie symboli przyrostka wskazującego odległość od początku przedziału wyrażoną słowem kodu dwójkowego prawie stałej długości Kod Golomba dla m=1 jest kodem unarnym kompresja danych 27 Kod Golomba - różne rzędy i m=1 m=2 m=3 0 0 0|0 0|0 1 10 0|1 0|10 2 110 10|0 0|11 3 1110 10|1 4 11110 110|0 10|10 5 111110 110|1 10|11 6 1111110 1110|0 110|0 7 11111110 1110|1 110|10 8 111111110 11110|0 110|11 .. ... ... ... kompresja danych 10|0 28 Przykład tworzenia kodu Golomba Wyznaczymy słowo kodowe dla m=3 oraz i=13 [i/m]=[13/3]=4; U(4)=11110 Przyrostek słowa zapisany w kodzie dwójkowym prawie stałej długości dla wartości d= (i mod m) =1; B’(1)=10 Daje to słowo kodowe G(13)=1111010 kompresja danych 29 Wyznaczanie rzędu kodu Golomba Rząd kodu Golomba powinien określać długość serii powtórzeń bardziej prawdopodobnych symboli źródła Warunek Golomba określa rząd jako: ⎡ log(1 + ρ ) ⎤ m=⎢ −1 ⎥ log ρ ⎢ ⎥ kompresja danych 30 Kod Rice’a Szczególny przypadek kodu Golomba, dla m=2k nazwany jest kodem Rice’a Rk k mniej znaczących bitów zostaje zapisana jako przyrostek słowa kodowego bardziej znaczące bity po przesunięciu o k pozycji w prawo zostaje zapisane w kodzie unarnym kompresja danych 31 Kod Rice’a - różne rzędy i k=1 k=2 k=3 0 0|0 0|00 0|000 1 0|1 0|01 0|001 2 10|0 0|10 0|010 3 10|1 0|11 0|011 4 110|0 10|00 0|100 5 110|1 10|01 0|101 6 1110|0 10|10 0|110 7 1110|1 10|11 0|111 8 11110|0 110|00 10|000 .. ... ... ... kompresja danych 32 Przykład kodowania Rice’a Słowo kodu R2 dla i=6 Dwójkową reprezentację i=110 dzielimy na dwie części 1|10 Starszą część zapisujemy w postaci kodu unarnego U(1)=10 Dołączamy przyrostek 10 Otrzymujemy R2(6)=1010 kompresja danych 33 Kod Rice’a realizacja Kody Rice’a definiowane są jako dynamiczne kody Goloba Źródłowy ciąg dzielony jest na bloki o stałych lub zmiennych rozmiarach. W każdym bloku ustalony zostaje najkorzystniejszy kod Rice’a Do każdego bloku trzeba dołączyć identyfikator określonej postaci kodu Rice’a Kod Rice’a z adaptacyjnie dobieraną wartością k dla każdej kodowanej wartości wykorzystano w standardzie JPEG-LS kompresja danych 34 Plan następnego wykładu Kodowanie arytmetyczne Kodowanie adaptacyjne Dla kodowania arytmetycznego Dla kodowania Huffmana Porównanie różnych kodowań adaptacyjnych kompresja danych 35