• Nie Znaleziono Wyników

wtedy Jeśli Definicja  

N/A
N/A
Protected

Academic year: 2021

Share "wtedy Jeśli Definicja  "

Copied!
60
0
0

Pełen tekst

(1)

Definicja

Jeśli

wtedy

(2)

Cel kompresji: zredukowanie do minimum oczekiwanego (średniego) kosztu

gdzie li jest długością słowa kodu ci kodującego symbol ai Definicja Efektywność kodowania określamy jako

śr

%

L

H  100

Definicje 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)

(3)

Definicja Może istnieć wiele takich kodów

Twierdzenie Ważne twierdzenie – nazywa się nierównością Krafta

(4)

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

(5)

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

(6)

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

(7)

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

(8)

Model bardziej złożony

Dodatkowe koszty

(9)

Częstość

występowania symboli w

sekwencji:

(10)

Rozważmy model wykorzystujący informacje o częstości występowania symboli

(11)

Przykładowy kod

Dodatkowe koszty

(12)

Definicja

Zalety Wady

•Bardzo szybkie kodowanie dzięki prostocie konstrukcji kodów i ich

regularności

•Brak potrzeby

przesyłania informacji o budowie kodu do dekodera

•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

(13)

Kod unarny

Cechy

Zastosowania

Długość: x bitów

(14)

Kod binarny

Cechy

Zastosowania

Długość:

(15)

Definicja

Komentarz:

Cechy

Zastosowania

Długość:

(16)

Definicja

Komentarz:

Cechy

Zastosowania

Długość:

(17)

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

(18)

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.

(19)

Definicja

Komentarz

(20)

Definicja

Komentarz

(21)

Zalety

•Prosta budowa

•Stosunkowo dobry

współczynnik kompresji dla danych, dla których

prawdopodobieństwo

występowania symboli maleje dla kolejnych symboli alfabetu

Wady

•Nieco trudniejszy w obliczaniu niż wcześniejsze kody

(22)
(23)

Definicja

Zalety Wady

(24)

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) ≤ Lk / 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%

(25)

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-li ≤ 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

(26)

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;

(27)

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 c d r b a

częstość symbolu 1/11 1/11 2/11 2/11 5/11

ciąg s1 i s2 c d r b a

słowo symbolu 0 0 0 0 1

ciąg s11 i s12 c d r b

słowo symbolu 0 0 0 0 0 1 0 1

ciąg s111 i s112 c d słowo symbolu 0 0 0 0 0 1

ciąg s121 i s122 r b

słowo symbolu 0 1 0 0 1 1

wynik 0 0 0 0 0 1 0 1 0 0 1 1 1

(28)

Przykład: kodujemy ciąg abracadabra

Można wygenerować kod o innych długościach słów

ciąg s c d r b a

częstość symbolu 1/11 1/11 2/11 2/11 5/11

ciąg s1 i s2 c d r b a

słowo symbolu 0 0 0 0 1

ciąg s11 i s12 c d r b

słowo symbolu 0 0 0 0 0 0 0 1

ciąg s111 i s112 c d r

słowo symbolu 0 0 0 0 0 0 0 0 1 ciąg s1111 i s1112 c d

słowo symbolu 0 0 0 0 0 0 0 1

wynik 0 0 0 0 0 0 0 1 0 0 1 0 1 1

(29)

Algorytm Huffmana generuje kod przedrostkowy dla zadanego rozkładu prawdopodobieństwa symboli alfabetu

1. 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

2. 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.

3. 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. 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).

(30)

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).

r 2/11 d

1/11 c

1/11 a

5/11

b 2/11

2/11 4/11

0

0 1

1

(31)

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).

r 2/11 d

1/11 c

1/11 a

5/11

b 2/11

2/11 4/11

6/11 1

1 0

0

0

0

1

1

1

(32)

r 2/11 d

1/11 c

1/11 a

5/11

b 2/11

2/11 4/11

6/11 1

1 0

0

0

0

1

1

1

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).

symbol słowo kodowe

a 0

b 1 0 0

c 1 0 1 0

d 1 0 1 1

r 1 1

(33)

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 0 1 1 0 1 1 0 0

c 0 0 0 0 0 0 0 1 0 1 0

d 0 0 1 0 0 0 1 1 0 1 1

r 0 1 0 0 0 1 1 1

(34)

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)

(35)

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

(36)

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. Fallera- Gallagera)

(37)

Przykład: drzewo mające własność rodzeństwa

r 2

d 1 c

1 a

5

b

2 2

4 6

11

(38)

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

(39)

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

(40)

Przykład: kodujemy ciąg abrr, wstawienie symbolu b 0

a

1

a 1 0

b

1

a 1 1

b 1 0

2

a 1 1

b 1 0

p

p

q

q

r

(41)

wstawienie symbolu r (przywróć własność rodzeństwa) r

2

a 1 1

b 1

0 1

r 1 0

p

2

a 1 2

b

1 1

r 1 0

p

2

a 1 2

b 1

(42)

wstawienie symbolu r 1

r 1 0

p

2

a 1 2

b 1

2

a 1

1

r 1 0

2

b 1

p

3

a 1

1

r 1 0

2

b 1 r

(43)

3

a 1

1

r 1 0

2

b 1 r

3

a 1

1

r 2 0

2

b 1

p

3

a 1

1

r 2 0

2

b 1

p

ponowne wstawienie symbolu r (przywróć własność rodzeństwa)

(44)

3

a 1

1

r 2 0

2

b 1

p

4

r 2

1

a 1 0

2

b 1 p

ponowne wstawienie symbolu r (przywróć własność rodzeństwa)

(45)

4

r 2

1

a 1 0

2

b 1

postać drzewa po przetworzeniu ciągu abrr

(46)

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

(47)

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)

(48)

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 Alfabet

0 .. 4 0 .. 5 0 .. 6 0 .. 7

0 . 0 0 . 0 0 . 0 0 . 0 0 0

1 . 0 1 . 0 1 . 0 1 0 . 0 0 1

2 . 1 0 . 1 0 0 . 0 1 1 . 0 1 0

3 . 1 1 0 . 1 0 1 . 1 0 0 . 0 1 1

4 . 1 1 1 . 1 1 0 . 1 0 1 . 1 0 0

5 . 1 1 1 . 1 1 0 . 1 0 1

6 . 1 1 1 . 1 1 0

7 . 1 1 1

(długość słowa kodowego kodu binarnego dla alfabetu j symboli to  log(j)  )

(49)

◦ 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 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

(50)

◦ 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

(51)
(52)

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

(53)
(54)

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/ 2k zakodowane unarnie (kod α Eliasa) x >> k

sufiks słowa: x mod 2k zakodowane zmodyfikowanym kodem binarnym dla przedziału [0, m – 1]

k najmniej znaczących bitów x

(55)

Dla skończonego alfabetu używamy tylko części nieskończonej rodziny.

Przyjmijmy rozmiar alfabetu 2N

• dla rodziny Golomba kody o m > 2N-1 mają słowa kodowe

wszystkich symboli alfabetu dłuższe od kodu o m = 2 N-1

• sensowne jest używanie początkowych 2 N-1

kodów

• dla kodów Golomba- Rice’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 N kodów (k = 0 .. N – 1 )

(56)
(57)

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ć?

(58)

Algorytm modelowania zastosowany przez Howarda i Vittera w algorytmie bezstratnej kompresji obrazów FELICS.

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 Idea

(59)

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)

(60)

Idea kodowania arytmetycznego

Koncepcja implementacji dla liczb o ograniczonej precyzji

Wybrane algorytmy

◦ MQ-Coder

◦ Range-Coder

◦ Szybki model dla kodera arytmetycznego

Warto się zapoznać

Cytaty

Powiązane dokumenty

za zadania, za które można przyznać więcej niż jeden punkt, przyznaje się tyle punk- tów, ile prawidłowych elementów odpowiedzi (zgodnie z wyszczególnieniem w klu- czu)

Zdający uwzględnił podstawową faktografię; wykazał się rozumowaniem histo- rycznym – podał niektóre przyczyny i skutki; dostrzegł podstawowe etapy, umie- ścił je poprawnie

• Za zadania otwarte, za które można przyznać więcej niż jeden punkt, przyznaje się tyle punktów, ile prawidłowych elementów odpowiedzi, zgodnie z wyszczególnieniem w

Więcej arkuszy znajdziesz na stronie: arkusze.pl.. Schemat oceniania arkusza z poziomu podstawowego. 12.

• Za zadania otwarte, za które można przyznać więcej niż jeden punkt, przyznaje się tyle punktów, ile prawidłowych elementów odpowiedzi, zgodnie z wyszczególnieniem w

• Za zadania otwarte, za które można przyznać więcej niż jeden punkt, przyznaje się tyle punktów, ile prawidłowych elementów odpowiedzi, zgodnie z wyszczególnieniem w

Dalsza droga jest bardzo nudna, idzie się ciężko, robimy krótkie postoje bez zdejmowania plecaków, korzystając z podparcia na drzewach.. Przed dużym szałasem robimy

12, Kawiarnio-Księgarnia „Spółdziel- nia&#34; (Peowiaków 11) - warsztaty haiku prowadzone przez Dariusza Brzóskę-Brzóskiewicza * godz. 13, plac Łokietka - kiermasz książek