Ćwiczenie 3 – Kompresja danych
Transkrypt
Ćwiczenie 3 – Kompresja danych
Systemy teleinformatyczne Ćwiczenie 3 – Kompresja danych Przykład prostego algorytmu LZW Kompresja danych – często stosowana , w celu zmniejszenia porcji przesyłanych (składowanych) danych bez istotnej utraty informacji. Daje oszczędność miejsca, czasu transmisji, zmniejsza koszty. Sposoby kompresji: - ilościowa (bezstratna) - jakościowa (stratna) Kompresja ilościowa - wykorzystuje redundancję źródła informacji. Kompresja jakościowa - wykorzystuje ułomność zmysłów człowieka (niezauważalna utratę ilości informacji). Kompresja LZW Algorytm opracowany w 1977 r przez Ziv’a i Lempela. Jego poprzednicy to algorytmy LZ77, LZ78. Algorytm LZW jest chroniony patentem. Właścicielem patentu jest firma Unisys Corporation.W algorytmie LZW analizowane są ciągi w uporządkowanym zbiorze. Znane są elementarne cząstki tego zbioru, nazywane dalej elementami podstawowymi oraz uporządkowanie zbioru polegające na tym, że każdy element podstawowy ma ustalonego swojego poprzednika i następnika. Szeregowo napływają kolejne elementy zbioru począwszy od elementu pierwszego. Produktem wyjściowym algorytmu kodującego jest szeregowo wyprowadzany zbiór liczb z właściwością podobnego uporządkowania jak w zbiorze wejściowym. Wyprodukowane liczby to numery nadane ciągom elementów podstawowych napływających ze zbioru wejściowego. Cechą charakterystyczną algorytmu jest to, że na wyjście jest wyprowadzany numer nadany ciągowi, który w procesie kodowania występował jako poprzedni, ale wtedy, gdy na wejściu pojawił się nowy nieznany ciąg, któremu właśnie trzeba nadać nowy numer. Z tej właściwości wynika, że algorytm może wyprodukować mniejszą ilość danych niż otrzymał. Dane opisujące obraz, to opis punktów - ciągów punktów zdarza się w obrazie bardzo dużo, stąd też użycie tego algorytmu do kompresji opisu obrazu jest jak najbardziej uzasadnione. LZW – opis ogólny 1. W słowniku umieszczamy wszystkie symbole alfabetu. 2. Kodujemy pozycję w słowniku znalezionego w nim najdłuższego prefiksu niezakodowanej części tekstu, 3. Do słownika dodajemy konkatenację (połączenie) odkodowanego elementu słownika i występującego za nim znaku. Algorytm LZW 1) Umieść w słowniku wszystkie możliwe ciągi jednoliterowe (czyli litery alfabetu). 2) Dopóki niezakodowany tekst nie jest pusty: a) znajdź najdłuższy prefiks x niezakodowanej części tekstu, który występuje w słowniku; b) zakoduj x poprzez n, jego pozycję w słowniku c) dodaj do słownika xa, gdzie a jest symbolem występującym za prefiksem x w niezakodowanej części tekstu. d) obetnij znaleziony prefiks z tekstu niezakodowanego. Przykład kodowania LZW Tekst niezakodowany (źródłowy): tatarak Zakodowana postać tekstu (szyfrogram): Słownik 125324 1) t 2) a 3) r 4) k 5) ta 6) at 7) tar 8) ra 9) ak UWAGI: 1) Jak widać niekoniecznie wykorzystywane są wszystkie elementy słownika. 2) Można ograniczyć wielkość słownika, przyjmując na przykład., że jego składowe nie mogą być dłuższe niż 3 znaki. W przypadku braku takiego ograniczenia wzrost rozmiaru słownika jest rekompensowany mniejszym rozmiarem szyfrogramu. Zadania 1. Skompresować algorytmem LZW tekst "AABCABBCAA". 2. Wprowadzić ograniczenie słownika do 2 znaków i porównać wielkość słownika i postaci zakodowanej. 3. Sprawdzić przy pomocy aplikacji „LZW-alfa” symulującej kompresję LZW poprawność wykonanych zadań. 4. Podać zakodowaną postać tekstu: „tatarak” stosując słownik max. 2-znakowy i wykorzystując konwersję kodu ASCII znaków na reprezentację binarną (np. litera a to kod 61 – reprezentacja binarna 01100001, można to przeliczyć na kalkulatorze Windows – inne kody znaków znaleźć w internecie). 5. Wykonać kodowanie prostego obrazka: