Algorytmy kodowania entropijnego

Transkrypt

Algorytmy kodowania entropijnego
Algorytmy kodowania
entropijnego
1. Kodowanie Shannona-Fano
2. Kodowanie Huffmana
Kodowanie entropijne
Sformułowanie problemu:
Źródło S generuje symbole (litery) ai z alfabetu A
Zadany jest model probabilistyczny określający
prawdopodobieństwa P(ai) i entropię H źródła
Znaleźć kod prefiksowy minimalizujący redundancję
R =
∑ l P (a ) − H
i
i
i
Historycznie pierwszy taki algorytm – Shannon (Bell Labs),
Fano (MIT), 1949
Kodowanie Shannona - Fano
1.
2.
3.
4.
5.
Tworzymy listę liter
Sortujemy ją wg. malejących częstości wystąpienia
(prawdopodobieństw)
Dzielimy listę na dwie podlisty, tak by sumy częstości
na obu były jak najbliŜsze
Wszystkim literom na górnej liście przypisujemy 0, na
dolnej 1
Stosujemy rekursywnie krok 3 i 4 dopóki kaŜdy z
symboli stanie się liściem w drzewie
Przykład: Alfabet {a, b, c, d, e} opisany częstościami:
a
b
c
d
e
15
7
6
6
5
Kodowanie Shannona-Fano – c.d.
{a,b,c,d,c;39}
{a,b;22}
15
0
0
a
7
1
b
{c,d,e;17}
1
6
0
c
{d,e;11}
1
6
0
d
Litera
Częst.
P(ai)
H(ai)
c (ai)
li*p(ai)
a
15
0.385
0.530
00
0.770
b
7
0.179
0.444
01
0.358
c
6
0.154
0.416
10
0.308
d
6
0.154
0.416
110
0.462
e
5
0.128
0.380
111
0.384
39
1.000
2.186
2.282
5
1
e
R=0.096
= 4.4%H
Kody Shannona-Fano – własności
Łatwy do zaprogramowania, dość efektywny algorytm
Z konstrukcji – kod prefiksowy
Kod typu „od góry – do dołu” (od korzenia do liści).
Czy jest to kod optymalny (czy dla danego modelu
probabilistycznego minimalizuje średnią długość)?
Odpowiedź – niekoniecznie!!!
Kodowanie Huffmana – algorytm
Przepis na konstrukcję drzewa binarnego kodu:
1.
2.
3.
4.
5.
Utwórz listę symboli; posortuj wg prawdopodobieństw
Utwórz wierzchołki zewn. (liście) odpowiadające
wyjściowym symbolom
Weź dwa węzły odpowiadające symbolom o
najmniejszym prawdopodobieństwie. Przypisz im
odpowiednio 0 i 1. Utwórz węzeł reprezentujący ich
sumę (z prawdopodobieństwem równym sumie)
Dodaj nowo utworzony węzeł do listy węzłów. Usuń z
tej listy jego węzły macierzyste
Powtarzaj całą procedurę dopóki nie pozostanie tylko
jeden węzeł (utoŜsamiony z korzeniem drzewa)
Kodowanie Huffmana – przykład
1
0
24
0
13
a,15
0
b,7
1
11
1
c,6
0
d,6
Litera
Częst.
P(ai)
H(ai)
c (ai)
li*p(ai)
a
15
0.385
0.530
1
0.385
b
7
0.179
0.444
000
0.537
c
6
0.154
0.416
001
0.462
d
6
0.154
0.416
010
0.462
e
5
0.128
0.380
011
0.384
39
1.000
2.186
2.230
1
e,5
R=0.044
= 2.0 % H
Kody Huffmana – własności
Łatwy do zaprogramowania
Z konstrukcji – kod prefiksowy
Kod typu „od dołu – do góry” (od liści do korzenia)
Jest to kod optymalny (dla danego modelu
probabilistycznego)
Ograniczenia na średnią długość kodu:
H(S) ≤ l ≤ H(s) + e
gdy pmax > 0.5
e = pmax
e = pmax + 0.086 gdy pmax ≤ 0.5
Kodowanie dynamiczne
Omawiane wyŜej modele wymagają znajomości modelu
probabilistycznego – na ogół nie jest on znany. MoŜliwe
wyjście – procedura dwuprzebiegowa.
Nawet gdy model znany, to jego przekazanie (zwłaszcza w
przypadku modelu wyŜszego rzędu) stanowi dodatkowe
obciąŜenie.
Wyjście pozbawione powyŜszych wad – kodowanie
dynamiczne (adaptacyjne).
Kodowanie dynamiczne – zasada
Ogólny schemat kodowania dynamicznego:
KODER
DEKODER
Inicjalizuj_model();
Inicjalizuj_model();
while ((a=getchar(input)) != eof)
while ((a=dekoduj(input)) != eof)
{
}
{
koduj(a,output);
putc(a,output);
update_model(a);
update_model(a);
}
Koder i dekoder uŜywają tych samych procedur inicjalizuj_model i update_model –
to powoduje, Ŝe model ewoluuje tak samo dla nadawcy (kodera) i odbiorcy
(dekodera).
Kody Huffmana - zastosowania
Zwykle w połączeniu z innymi metodami (jako część
procedury; np. LZ, JPEG)
Kompresja tekstu – typowy stopień kompresji 1 : 1.65
Słabiej nadaje się do bezstratnej kompresji obrazu i
dźwięku – osiągany stopień kompresji 1 : 1.7 (gdy
kodujemy róŜnice między pikselami lub kolejnymi
próbkami dźwięku
Kompresja obrazów – kody Huffman
Obraz
Huffman
Huffman
róŜnice
Dyn. Huff.
róŜnice
1_ch
57 504
32 968
32 261
2_ch
61 430
38 541
37 896
Ziemia
40 543
33 880
39 501
Miasto
58 374
52 643
52 321

Podobne dokumenty