Definicja ♦ ♦ ♦ Jeśli wtedy

Transkrypt

Definicja ♦ ♦ ♦ Jeśli wtedy



Definicja
Jeśli
wtedy
Cel kompresji: zredukowanie do minimum oczekiwanego (średniego)
kosztu
gdzie li jest długością słowa kodu ci kodującego symbol ai
Definicja
Definicje
Efektywność kodowania określamy jako
H
Lśr
100%
1
2 Kod jest przedrostkowy, jeśli nie możemy otrzymać żadnego słowa kodu z
innego słowa kodu poprzez dodanie do niego zer lub jedynek (tzn. Żadne
słowo kodu nie jest przedrostkiem innego słowa kodu)
Definicja
Twierdzenie
Może istnieć wiele takich kodów
Ważne twierdzenie – nazywa się nierównością Krafta
Przykład.
Rozważmy tekst Stanisława Wyspiańskiego: „Jakżeż ja się uspokoję”
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ę…
Założenia:
• Każdy symbol odpowiada jednemu
znakowi
• Prawdopodobieństwo wystąpienia
każdego symbolu jest jednakowo
prawdopodobne
• Przyjmujemy kod ASCII
rozszerzony o „polskie litery”, czyli
ISO 8859-2
Przykład.
Rozważmy tekst Stanisława Wyspiańskiego: „Jakżeż ja się uspokoję”
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ę…
Założenia:
• Każdy symbol odpowiada jednemu
znakowi
• Prawdopodobieństwo wystąpienia
każdego symbolu jest jednakowo
prawdopodobne
• Przyjmujemy kod ASCII
rozszerzony o „polskie litery”, czyli
ISO 8859-2
Przykład.
Rozważmy tekst Stanisława Wyspiańskiego: „Jakżeż ja się uspokoję”
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ę…
Założenia:
• Każdy symbol odpowiada jednemu
znakowi
• Prawdopodobieństwo wystąpienia
każdego symbolu jest jednakowo
prawdopodobne
• Przyjmujemy kod ASCII
rozszerzony o „polskie litery”, czyli
ISO 8859-2
Model
bardziej
złożony
Przykład.
Rozważmy tekst Stanisława Wyspiańskiego: „Jakżeż ja się uspokoję”
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ę…
Założenia:
• Każdy symbol odpowiada jednemu
znakowi
• Prawdopodobieństwo wystąpienia
każdego symbolu jest jednakowo
prawdopodobne
• Przyjmujemy kod ASCII
rozszerzony o „polskie litery”, czyli
ISO 8859-2
Model
bardziej
złożony
Model
bardziej
złożony
Dodatkowe
koszty
Częstość
występowania
symboli w
sekwencji:
Rozważmy model wykorzystujący informacje o częstości występowania
symboli
Przykładowy kod
Dodatkowe
koszty
Definicja
Zalety
•Bardzo szybkie
kodowanie dzięki
prostocie konstrukcji
kodów i ich
regularności
•Brak potrzeby
przesyłania informacji
o budowie kodu do
dekodera
Wady
•Zwykle słaby
współczynnik kompresji
•Możliwa ekspansja
danych jeśli rozkład
prawdopodobieństwa
występowania symboli nie
pasuje do założonego przy
konstrukcji kodu
Kod unarny
Cechy
Zastosowania
Długość: x bitów
Kod binarny
Cechy
Zastosowania
Długość:
Definicja
Komentarz:
Cechy
Zastosowania
Długość:
Definicja
Komentarz:
Cechy
Zastosowania
Długość:
Liczby Fibonacciego definiuje następująca zależność rekurencyjna:
przy czym
Każda liczba całkowita dodatnia może być zapisana jako suma różnych liczb
Fibonacciego
Definicja
Przykład
Odwrócona reprezentacja Zeckedndofra
W trakcie kodowania wygodniejsza jest reprezentacja, w której najmniej
znaczący bit znajduje się na początku
Przykład
Każdą liczbę całkowitą można przedstawić w odwróconej reprezentacji
Zeckendorfa w taki sposób, aby nie zawierała dwóch następujących po
sobie jedynek.
Definicja
Komentarz
Definicja
Komentarz
Zalety
Wady
•Prosta budowa
•Nieco trudniejszy w obliczaniu
niż wcześniejsze kody
•Stosunkowo dobry
współczynnik kompresji dla
danych, dla których
prawdopodobieństwo
występowania symboli maleje
dla kolejnych symboli alfabetu
Definicja
Zalety
Wady
Podstawowe twierdzenie Shannona o kodowaniu bezszumowym
Dla bezpamięciowego źródła S o entropii H(S) możliwe jest przypisanie
ciągom k symboli źródła, słów kodu przedrostkowego tak, że spełnione
jest
H( S ) ≤ L k / k < H( S ) + 1 / k
 asymptotycznie, możliwe jest uzyskanie średniej długości kodu (w
przeliczeniu na pojedynczy symbol) równej entropii źródła
 optymalna długość słowa kodowego dla symbolu o
prawdopodobieństwie p równa jest –log (p) (czyli autoinformacji dla
tego symbolu)
 można zbudować koder entropijny o efektywności bliskiej 100%
Jak wygenerować kod przedrostkowy?

Problem:
◦ Mamy wyznaczony przez model rozkład prawdopodobieństwa
symboli źródła
p1, p2, p3, p4 ... pN, : ∑pi = 1
◦ Znamy optymalne długości słów kodowych (tj. przybliżone
długości słów optymalnego kodu przedrostkowego)
l1, l2, l3, l4 ... lN : li = –log (pi)
◦ Wiemy jaki warunek muszą spełniać długości słów kodowych aby
istniał kod jednoznacznie dekodowalny (nierówność Krafta)
∑2-l ≤ 1
Chcemy wyznaczyć
◦ Kod przedrostkowy o minimalnej średniej długości kodu
 szukamy: dokładnych długości słów
 szukamy: postaci (kolejnych bitów) słów
i

Algorytm Shannona-Fano generuje kod przedrostkowy dla zadanego
rozkładu prawdopodobieństwa symboli alfabetu.
Krok 1:
Ustaw symbole alfabetu źródła w ciąg s uporządkowane zgodnie z
prawdopodobieństwem ich użycia;
Krok 2:
AlgorytmShannonaFano(ciąg s)
if (s zawiera dwa symbole)
dołącz 0 do słowa kodowego jednego z symboli, 1
do
słowa drugiego symbolu;
elseif (s zawiera więcej niż dwa symbole)
podziel s na dwa podciągi s1 i s2 tak, by różnica
między sumą prawdopodobieństw symboli w podciągach
była najmniejsza;
dołącz 0 do słów kodowych symboli w s1 i 1 do słów
symboli w s2;
AlgorytmShannonaFano(s1);
AlgorytmShannonaFano(s2);
endif;
Przykład: kodujemy ciąg abracadabra
W tabeli mamy ciąg symboli alfabetu źródła i kolejne kroki budowania
słów kodowych
ciąg s
częstość symbolu
ciąg s1 i s2
słowo symbolu
ciąg s111 i s112
słowo symbolu
d
r
b
a
1/11
1/11
2/11
2/11
5/11
c
d
r
b
a
0
ciąg s11 i s12
słowo symbolu
c
0
c
00
0
d
00
c
000
0
r
01
1
b
01
d
001
ciąg s121 i s122
r
słowo symbolu
010
011
010
011
wynik
000
001
b
1
Przykład: kodujemy ciąg abracadabra
Można wygenerować kod o innych długościach słów
ciąg s
częstość symbolu
ciąg s1 i s2
słowo symbolu
ciąg s111 i s112
słowo symbolu
ciąg s1111 i s1112
d
r
b
a
1/11
1/11
2/11
2/11
5/11
c
d
r
b
a
0
ciąg s11 i s12
słowo symbolu
c
0
c
00
0
d
00
c
000
c
0
r
00
d
000
1
b
01
r
001
d
słowo symbolu
0000
0001
wynik
0000
0001
001
01
1
Algorytm Huffmana generuje kod przedrostkowy dla zadanego rozkładu
prawdopodobieństwa symboli alfabetu
1.
2.
3.
4.
W algorytmie Huffmana buduje się drzewo binarne, zwane drzewem Huffmana.
 Każdemu z liści odpowiada pojedynczy symbol alfabetu źródła.
 Z każdym węzłem skojarzona jest waga równa łącznemu prawdopodobieństwu liści
w poddrzewie dla którego ten węzeł jest korzeniem
Utwórz n drzew, gdzie n jest rozmiarem alfabetu źródła.
Każdemu z symboli alfabetu źródła odpowiada pojedyncze drzewo składające się
wyłącznie z korzenia i mające wagę równą prawdopodobieństwu wystąpienia danego
symbolu.
Wyznacz dwa drzewa o najmniejszych wagach i utwórz z nich nowe drzewo, w którym
dwa właśnie wyznaczone drzewa te są synami korzenia o wadze równej sumie ich wag.
Powtarzaj krok 2 aż pozostanie tylko jedno drzewo (n – 1 razy).
Słowo kodowe kodu Huffmana dla danego symbolu znajduje się przechodząc ścieżką od
korzenia drzewa Huffmana do liścia odpowiadającego temu symbolowi (i-ty bit słowa
kodowego ma wartość 0, jeżeli i-ta krawędź ścieżki prowadzi do lewego syna i-tego
węzła, a 1 — jeżeli do prawego).
Przykład: kodujemy ciąg abracadabra
2. Wyznacz dwa drzewa o najmniejszych wagach i utwórz z nich nowe drzewo,
w którym dwa właśnie wyznaczone drzewa te są synami korzenia o wadze
równej sumie ich wag. Powtarzaj krok 2 aż pozostanie tylko jedno drzewo
(n – 1 razy).
4/11
0
1
2/11
0
1
5/11
2/11
1/11
1/11
2/11
a
b
c
d
r
Przykład: kodujemy ciąg abracadabra
2. Wyznacz dwa drzewa o najmniejszych wagach i utwórz z nich nowe drzewo,
w którym dwa właśnie wyznaczone drzewa te są synami korzenia o wadze
równej sumie ich wag.
1
Powtarzaj krok 2 aż
0
1
pozostanie tylko jedno
drzewo
(n – 1 razy).
6/11
0
1
4/11
0
1
2/11
0
1
5/11
2/11
1/11
1/11
2/11
a
b
c
d
r
3. Słowo kodowe kodu Huffmana dla
danego symbolu znajduje się
przechodząc ścieżką od korzenia
drzewa Huffmana do liścia
odpowiadającego temu symbolowi (i-ty
bit słowa kodowego ma wartość 0, jeżeli
i-ta krawędź ścieżki prowadzi do
lewego syna i-tego węzła, a 1 — jeżeli
do prawego).
1
0
1
6/11
0
1
4/11
0
1
symbol
2/11
0
1
słowo kodowe
a
0
b
100
c
1010
5/11
2/11
1/11
1/11
2/11
d
1011
a
b
c
d
r
r
11
Własności kodów Huffmana
Podobnie, jak algorytm Shannona-Fano, przedstawiony algorytm jest
niedeterministyczny
niedeterminizm można łatwo usunąć – kanoniczne kodowanie
Huffmana
Efektywnośc kodów Huffmana jest typowo nieznacznie większa niż
Shannona-Fano (dla przykładu „abracadabra” jest taka sama)
algorytm Huffmana jest prostszy
symbol
Shannon-Fano (1)
Shannon-Fano (2)
Huffman
a
1
1
0
b
011
01
100
c
000
0000
1010
d
001
0001
1011
r
010
001
11

Zalety
o prosty
o szybki
 Wady
o nieefektywny, gdy
prawdopodobieństwo wystąpienia
jednego z symboli alfabetu źródła
jest duże (ale można kodować ciągi
symboli)
o dwuprzebiegowy (koszt transmisji
modelu może być duży, nie do
zastosowania wprost do kodowania
on-line)

Użycie algorytmu Huffmana w adaptacyjnym
modelu jest możliwe
Metoda brute-force – każdorazowo po zakodowniu symbolu buduj
od nowa drzewo Huffmana
( Uwaga na Zero Frequency Problem )
... ale w praktyce zbyt kosztowne
Ale mamy algorytm generujący kod zbliżony do kodu Huffmana,
nadający się do zastosowania w algorytmie adaptacyjnym.
Drzewo Huffmana budowane jest przyrostowo – możliwa jest
„aktualizacja modelu”
•został wynaleziony niezależnie przez Fallera i Gallagera
• udoskonalony przez Cormacka i Horspoola oraz (niezależnie) przez
Knutha
• następnie udoskonalony przez Vittera
Na czym polega?
Budujemy przyrostowo drzewo
binarne, którego węzły zawierają
liczniki częstości, a liście są
dodatkowo skojarzone z symbolami
alfabetu źródła
Drzewo ma własność rodzeństwa, gdy:
1.
każdy węzeł nie będący liściem ma 2 potomków;
2.
przechodząc węzły w kolejności z góry do dołu, a na danym
poziomie od prawej do lewej, otrzymamy ciąg węzłów o
nierosnących licznikach.
Drzewo mające własność rodzeństwa
jest drzewem Huffmana (tw. FalleraGallagera)
Przykład: drzewo mające własność rodzeństwa
11
6
5
a
2
4
r
2
2
b
1
1
c
d


Budowane drzewo zawiera liść (0-węzeł) reprezentujący wszystkie
symbole, które jeszcze nie wystąpiły w kodowanym ciągu
Kodowanie rozpoczynamy od drzewa składającego się wyłącznie z 0-
węzła


Używamy pomocniczej struktury węzły, listy dwukierunkowej
zawierającej węzły drzewa uporządkowane w kolejności przeglądania
drzewa z góry do dołu, a na danym poziomie od prawej do lewej
Podlistę listy węzły składającą się z wszystkich węzłów o wartości
licznika i nazywamy blokiem-i , a pierwszy węzeł takiego bloku liderem
DynamiczneKodowanieHuffmanaFGK(symbol s)
p = liść zawierający symbol s;
wyprowadź słowo kodowe dla s (*);
if p jest 0-węzłem
utwórz nowy węzeł q dla symolu s;
q.licznik = 1;
p = nowy węzeł w miejscu 0-węzła
będący rodzicem 0-węzła i
węzła q;
p.licznik = 1;
else
p.licznik++;
endif
while p nie jest korzeniem
if p narusza własność rodzeństwa
if lider bloku-i
zawierającego p nie jest
rodzicem p
zamień p z liderem;
endif
endif
p = rodzic(p);
p.licznik++;
endwhile
a
p
r
b
0
1
1
2
p
0
1
1
q
1
1
a
1
a
0
1
q
b
Przykład: kodujemy ciąg abrr, wstawienie symbolu b
a
0
1
b
r
2
2
2
p
1
a
0
2
1
2
1
1
a
p
1
a
1
1
b
1
1
b
0
1
b
0
r
wstawienie symbolu r (przywróć własność rodzeństwa)
1
r
r
2
3
2
p
p
2
1
1
a
a
1
1
1
r
wstawienie symbolu r
2
a
1
1
1
1
b
0
1
2
b
b
0
1
r
0
1
r
r
3
1
3
1
2
a
3
a
1
1
b
1
r
2
a
1
1
0
1
2
1
1
b
0
2
p
r
b
0
2
p
r
ponowne wstawienie symbolu r (przywróć własność rodzeństwa)
3
4
p
1
2
2
a
2
r
1
1
1
1
b
0
2
p
r
b
0
1
a
ponowne wstawienie symbolu r (przywróć własność rodzeństwa)
4
2
2
r
1
1
b
0
1
a
postać drzewa po przetworzeniu ciągu abrr
Dodatkowe założenie: w bloku-i węzłów najpierw znajdują się węzły
wewnętrzne, później liście

minimalizujemy głębokość drzewa

bardziej złożone staje się przywracanie własności rodzeństwa

ciąg o długości s zakodujemy na nie więcej niż h+s bitach,
gdzie h to liczba bitów dla kodowania statycznego Huffmana

Algorytm adaptacyjny można zbudować z kilku
stałych modeli

Ale po kolei ...
◦
◦
◦
◦
Zmodyfikowane kody binarne
Rodzina kodów Golomba
Rodzina kodów Golomba-Rice’a
Model danych dla parametrycznej rodziny kodów
(model algorytmu FELICS)
Prefiksowy kod dla skończonego alfabetu, np. dla liczb 0 .. j-1
◦ słowa kodowe o długości  log(j)  lub  log (j)  bitów,
gdzie j to rozmiar alfabetu
◦ właściwie to rodzina kodów
Symbol
(długość słowa kodowego
kodu binarnego dla alfabetu j
symboli to  log(j)  )
Alfabet
0 .. 4
0 .. 5
0 .. 6
0 .. 7
0
.00
.00
.00
.000
1
.01
.01
.010
.001
2
.10
.100
.011
.010
3
.110
.101
.100
.011
4
.111
.110
.101
.100
.111
.110
.101
.111
.110
5
6
7
.111
Generowanie słowa kodowego
kodujemy liczbę i zmodyfikowanym kodem binarnym dla liczb 0 .. j – 1,
przyjmijmy N =  log(j)  i n = 2 N
jeżeli i < n – j
zakoduj i za pomocą N – 1 -bitowego kodu binarnego
else
zakoduj i + n – j za pomocą N -bitowego kodu binarnego
Własności zmodyfikowanego kodu binarnego
◦ długość słowa kodowego:  log(j)  lub  log (j) 
◦ dla j = 2
N
kod staje się N -bitowym kodem binarnym
◦ liczba dłuższych słów kodowych jest zawsze parzysta
◦
parametryczna rodzina kodów
przeznaczona do kodowania nieujemnych liczb całkowitych
nieskończona
parametrem kodu jest całkowite m, m > 0
◦
zawiera kody optymalne dla wykładniczego rozkładu
prawdopodobieństwa symboli
(dla niektórych parametrów rozkładu)
(nadaje się do źródeł o rozkładzie nierosnącym)
◦
słowa kodowe łatwe w generacji i dekodowaniu
Generowanie słowa kodowego
kodujemy liczbę x kodem
Golomba z parametrem m
prefiks słowa:
 x/ m 
zakodowane unarnie (kod α Eliasa)
sufiks słowa: x mod m
zakodowane zmodyfikowanym
kodem binarnym dla przedziału
[0, m – 1]
np. 8 kodem Golomba z parametrem 3
 8/3  = 2
110
8 mod 3 = 2
11
Jest to szczególny przypadek kodu Golomba zauważony już przez
Golomba i niezależnie od niego odkryty przez Rice’a.
Kody Golomba są szczególnie proste, gdy m = 2 k
kodujemy liczbę x kodem Golomba-Rice’a z parametrem k
prefiks słowa:  x/ 2 k 
sufiks słowa:
x mod 2 k
zakodowane unarnie (kod α Eliasa)
x >> k
zakodowane zmodyfikowanym kodem
binarnym dla przedziału [0, m – 1]
k najmniej znaczących bitów x
Dla skończonego alfabetu używamy tylko części nieskończonej
rodziny.
Przyjmijmy rozmiar alfabetu 2 N
• dla rodziny Golomba
kody o m > 2 N-1 mają
słowa kodowe
wszystkich symboli
alfabetu dłuższe od
kodu o m = 2 N-1
• dla kodów GolombaRice’a kody o k > N – 1
mają słowa wszystkich
symboli alfabetu dłuższe
od kodu o k = N – 1
• sensowne jest używanie
początkowych 2 N-1
kodów
• sensowne jest używanie
początkowych N kodów
(k = 0 .. N – 1 )

Rodziny Golomba-Rice’a można użyć do kodowania ciągów symboli
o wykładniczym rozkładzie prawdopodobieństwa.
(rozkład często spotykany w kompresji obrazów, dźwięków ... )

Jeżeli parametr rozkładu jest nieznany, lub zmienia się w trakcie
pracy źródła to parametr kodu Golomba-Rice’a trzeba dobierać
adaptacyjnie.
Jak to zrobić?
Wybierajmy ten kod, który jest najlepszy dla już przetworzonych symboli
Jak to zrobić?
Algorytm modelowania zastosowany przez Howarda i Vittera w
algorytmie bezstratnej kompresji obrazów FELICS.
Idea
Dla każdego kodu z rodziny utrzymuj licznik (tablica liczników)
◦ licznik liczby bitów, którą by uzyskano, kodując dotychczas
przetworzoną część ciągu tym kodem.
Po zakodowaniu symbolu zwiększ licznik każdego z kodów
o długość słowa kodowego właśnie zakodowanego symbolu
w kodzie odpowiadającym licznikowi
Do kodowania symbolu użyj kodu o najmniejszym liczniku
◦ Udoskonalenie: okresowo, gdy wartość najmniejszego z liczników
przekroczy pewien próg, podziel wszystkie liczniki przez 2
 unikniemy przepełnienia
 zwiększymy znaczenie symboli kodowanych niedawno
◦ Ww. metoda to tylko część całego algorytmu
(i tylko część modelu)
◦ Metoda z FELICS nadaje się do każdej rodziny
◦ Jeszcze prostsza metoda istnieje dla rodziny Golomba-Rice’a
 zastosowana przez Weinberger, Seroussi, Sapiro w algorytmie
LOCO(JPEG-LS)
 niezależnie od rozmiaru alfabetu mamy 2 liczniki (licznik
zakodowanych symboli i licznik sumy wartości tych symboli)
Warto się zapoznać

Idea kodowania arytmetycznego

Koncepcja implementacji dla liczb o ograniczonej
precyzji

Wybrane algorytmy
◦ MQ-Coder
◦ Range-Coder
◦ Szybki model dla kodera arytmetycznego