1.33k likes | 1.55k Views
UNIVERSITY POLITEHNICA of BUCHAREST DEPARTMENT OF COMPUTER SCIENCE. Transmisia datelor multimedia in retele de calculatoare Compresia fara pierdere de calitate II. Conf. Dr. Ing . Costin-Anton Boiangiu < Costin.Boiangiu@CS.PUB.RO >. Introducere.
E N D
UNIVERSITY POLITEHNICA of BUCHAREST DEPARTMENT OF COMPUTER SCIENCE Transmisiadatelor multimedia in retele de calculatoare Compresia farapierdere de calitateII Conf. Dr. Ing. Costin-Anton Boiangiu <Costin.Boiangiu@CS.PUB.RO>
Introducere • Panaacuma am considerat ca toatesimbolurile de intraresuntindependente • Acestlucru nu esteadevaratpentrucelemaiuzualetipuri de date • Ex: text, imagini, cod • Ideea de baza • Se voridentifica pattern-urile (modelelr) simbolurilor • Se for codificaacestemodelemaieficient • Restul de simbolurivorficodificatefolosind un algoritmul de baza (maiputineficient) • In celemaimultecazuri se vaobtine o performantamultmaibuna • Nota • Aceastatehnicapoatefifolosite in cazultipurilor de date precumtextul • Evident, nu vaaveasucces in cadruldatelor (aproape) intamplatoare - random
Codificareabazatapediagrame • Dictionar • Toateliterele din alfabet + • Cat maimultediagrame (perechi de litere) • Exemplu: • Marimeadictionarului= 256 intrari • Alfabet: caracterele ASCII printabile= 95 • Digrame: celemaicomune 161 de perechi de caractere • Alt examplu: A = {a, b, c, d, r}, • Dictionar:
Exemplu Input: abracadabra Output: 101
Exemplu Input: --racadabra X Output: 101
Exemplu Input: --racadabra Output: 101100
Exemplu Input: ---acadabra Output: 101100110
Exemplu Input: -----adadabra Output: 101100110111
Exemplu Input: -------abra Output: 101100110111101
Exemplu Input: ---------ra X Output: 101100110111101
Exemplu Input: ---------ra Output: 101100110111101100
Exemplu Input: ----------a Output: 101100110111101100000
Problema: Care diagrame? Sursa#2: Cod C Sursa#1: Capitol dintr-o carte (LaTeX)
Scurtistoric • Mai 1977: apare lucrarea (Ziv and Lempel, 1997) • Desi articolul este intens matematizat, tehnica generala de lucru este de a considera siruri de caractere care se repata si de a le inlocuicu un numar a carui reprezentare sa fie mai mica decat cea a sirului original • Multe instrumente software de compresie se bazeaza pe acest algoritm: ZIP, ZOO, ARC, gzip, LhA, CAB, Arj, RAR • Acest algoritm este denumit LZ77 si nu este foarte raspandit din cauza dificultatilor de implementare • Septembrie 1978: apare lucrarea (Ziv and Lempel, 1998) • Tehnica este deosebita de LZ77 in sensul ca se mentine un dictionar de siruri in loc de considerarea unei ferestre • Algoritmul este foarte popular • Algoritmul se numeste LZ78
Scurtistoric • 20 Iunie 1983: Terry Welch scrie o versiune a lui LZ78 bazandu-se pe simplificari substantiale si un management mai bun al dictionarului • Algoritmul se numeste LZW, dupa numele inventatorilor sai, Lempel-Ziv-Welch • 5 Iulie 1984: Apare UNIX compress, dupa publicarea articolului lui Welch • 15 Junie 1987: Apare formatul grafic numit GIF (Graphics Interchange Format), care foloseste pentru compresie algoritmul LZW
Ideea compresiei bazate pe dictionar • Aceste metode constau dintr-o serie de reguli de identificare a unor grupuri de simboluri si gruparea/depunerea lor intr-un dictionar care se asociaza sursei de informatie • Daca se intalneste un anumit grup de simboluri, se creaza un indicator (pointer) corespunzator locului ocupat de respectivul grup in dictionar • Cu cat se intalneste mai des un anumit grup de simboluri, cu atat este mai mare raportul de compresie • Aceste metode codeaza siruri de simboluri de lungime variabila cu semne individuale, fiecare semn reprezentand un indicator (index) intr-un dictionar • Compresia se obtineatunci cand noile semne sunt de lungime mai mica
Exemplu • Fie conventia reprezentarii unui cuvant dintr-o carte prin doua atribute: (Numarul paginii) / (numarul cuvantului din pagina) • Atunci, mesajul „Titlul acestui capitol este compresia datelor” poate fi inlocuit prin 500/3 1/5 10/2 15/9 10/6 12/1 • Cuvantul „Titlul” este inlocuit prin 500/3, ceea ce reprezinta al treilea cuvant din pagina 500. Cuvantul „compresia” este al 6 cuvant din pagina 10
Ideea compresiei bazate pe dictionar • Marimea mesajului comprimat depinde de marimea dictionarului, deci de numarul de pagini si de numarul de inregistrari pe pagina • Daca aceste doua marimi se noteaza cu NP (numarul de pagini) si NR(numarul de inregistrari pe pagina) atunci numarul de biti pentru reprezentarea (codarea) unui cuvant din dictionar este [log2(NP)] + [log2(NR)], unde parantezele drepte arata rotunjurea la cel mai apropiat intreg • Intrucat trebuie considerat si marimea mesajului de la intrare, exprimat prin numarul de simboluri, NS, rezulta un raport de compresie:
Exemplu numeric • Daca dictionarul contine 2200 pagini, sunt necesari log2(2200) = 11.03 => 12 biti pentru a coda numarul paginii, iar daca fiecare pagina contine cuvinte de lungime 256 sunt necesari un numar de : log2(256) = 8 biti pentru codarea fiecarui cuvant • Ca urmare, un cuvant oarecare din dictionar este codat pe 20 (=11+8) biti sau 2.5 => 3 octeti • Mesajul comprimat va avea lungimea 20 biti * 6 cuvinte = 120 biti /18 octeti • In reprezentarea ASCII, cele 6 cuvinte necesita un total de (6+7+7+4+9+7) = 40 * 8 = 320 biti deci 40 octeti • Raportul de compresie este
Dictionare • Dictionarele pot fi • statice • adaptive • Un dictionar static este construit si transmis odata cu textul comprimat si este folosit ca referintele citate intr-o lucrare stiintifica • Un dictionar static este construit inaintea efectuariii compresiei si ramane neschimbat pe toata durata acesteia • Dictionarul static are avantajul ca poate fi „ales” („acordat”) in vederea codarii, inregistrarile care apar cu cea mai mare frecventa putand fi codate cu numarul cel mai mic de biti, in conformitate cu regulile de codare enrtropica • Dezavantajul folosirii unui dictionar static apare la compresia fisierelor mici, cand, din cauza transmisiei/memorarii atat a dictionarului cat si a fisierului comprimat, raportul de compresie nu este foarte bun, de multe ori chiar subunitar • De aceea, cei mai raspanditi sunt algoritmii de compresie bazati pe dictionare adaptive
Dictionare • Un dictionar adaptiv consta in adaugarea unei abrevieri pe langa anumite grupe de simboluri, cand apar prima oara, si utilizarea in continuare doar a abrevierilor • Cel mai folosit algoritm de compresie bazat pe dictionar este cel propus de Jacob Ziv si Abraham Lempel, in doua variante: • prima din 1977, cunoscuta sub numele de LZ77 • a doua, din 1978, cunoscuta sub numele de LZ78
Algoritmul Lempel-Ziv • Urmatorul exemplu se refera la o versiune simpla a algoritmului Lempel-Ziv • Schema de compresie trebuie sa imparta datele in sub-siruri, sa codeze sub-sirurile, si sa fie posibila si operatia inversa • Fie urmatorul sir de date: 001101100011010101001001001101000001010010110010110 *Preluat din (Princeton, 2004)
Algoritmul Lempel-Ziv • Primul pas consta in impartirea sirului de date in subsiruri, astfel incat la fiecare definitie a unui subsir sa nu existe repetitiii, deci el sa nu fi fost definit anterior • Se va utiliza virgula ca separator de sub-siruri • La inceputul sirului se pune o virgula pentru a evidentia sirul de lungime zero • Se pune apoi o virgula dupa primul zero, intracat nu a mai aparut • Al doilea bit este zero si se considera si al doilea simbol, 1, obtinandu-se sirul 01 • Intrucat acesta este sir nou se pune virgula • Urmeaza simbolul 1, care fiind caracter nou, atrage virgula dupa el • Apoi apare un zero, mai trebuie un zero (deci inca un simbol), ca sa fie un sir nou • Rezultatul consta in urmatoarea lista de siruri ,0,01,1,011,00,0110,10,101,001,0010,01101,000,00101,001011,0010110
Algoritmul Lempel-Ziv • Pasul doi consta in derminarea numarului de biti pentru reprezentarea secventei astfel obtinute • Practic, se numeroteaza sirurile incepand cu primul sir de lungime nenula • Se determina numarul de biti dupa relatia unde N reprezinta numarul de siruri si paranteza are rolul de rontunjire la cel mai mic intreg • Pentru primul exemplu considerat se constata ca sunt 16 simboluri (inclusiv sirul de lungime zero) si sunt necesari 4 biti pentru reprezentarea fiecarui sir
Algoritmul Lempel-Ziv • Pasultreiconstacodificarea sirurilor, astfel obtinute • Se completeaza un tabel in care se definesc: • sirul, numarul ce arata pozitia sirului • prefixul, numarul ce arata pozitia prefixului • codul sirului • Codul sirului este obtinut considerand numarul ce arata pozitia prefixului urmat de ultimul bit al sirului considerat
Algoritmul Lempel-Ziv • Secventa comprimata este formata prin concatenarea tuturor sirulor codate, aflate in ultima coloana a tabelului precedent • Se obtine: 00000-00011-00001-00101-00010-01000-00110-0111101011-10010-01001-01010-10101-11011-11100 • Comparand lungimea secventei comprimate cu lungimea secventei originale se constata ca secventa comprimata are o lungime mai mare • Acest rezultat este explicat prin faptul ca secventa de intrare este de lungime foarte mica • Pentru fisiere cu secventa de lungime de milioane de simboluri se constata cu raport de compresie de pana la 2, depinzand si de continutul fisierului
LZ78 • LZ77 presupunelocalitateagrupurilor de simboluri • LZ78: • Nu exista un buffer de cautare – dictionaruleste explicit • Codificatorul/decodificatorulconstruiescdictionarulintr-un mod sincronizat • Codificare: <i, c> • i = indexul din dictionar • c = codulurmatoruluisimbol • Example: • wabbawabbawabbawabbawoowoowoo
Exemplu LZ78 Input: wabbawabbawabbawabbawoowoowoo Output: Dictionar:
Exemplu LZ78 Input: wabbawabbawabbawabbawoowoowoo Output: <0, C(w)> Dictionar:
Exemplu LZ78 Input: -abbawabbawabbawabbawoowoowoo Output: <0, C(w)> <0, C(a)> Dictionar:
Exemplu LZ78 Input: --bbawabbawabbawabbawoowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> Dictionar:
Exemplu LZ78 Input: ---bawabbawabbawabbawoowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> Dictionar:
Exemplu LZ78 Input: -----wabbawabbawabbawoowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> Dictionar:
Exemplu LZ78 Input: ------wabbawabbawabbawoowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> <1, C(a)> Dictionar:
Exemplu LZ78 Input: --------bbawabbawabbawoowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> <1, C(a)> <3, C(b)> Dictionar:
Exemplu LZ78 Input: ----------awabbawabbawoowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> <1, C(a)> <3, C(b)> <2, C()> Dictionar:
Exemplu LZ78 Input: ------------wabbawabbawoowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> <1, C(a)> <3, C(b)> <2, C()> <6, C(b)> Dictionar:
Exemplu LZ78 Input: ---------------bawabbawoowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> <1, C(a)> <3, C(b)> <2, C()> <6, C(b)> <4, C()> Dictionar:
Exemplu LZ78 Input: ------------------wabbawoowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> <1, C(a)> <3, C(b)> <2, C()> <6, C(b)> <4, C()> <9, C(b)> Dictionar:
Exemplu LZ78 Input: ----------------------awoowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> <1, C(a)> <3, C(b)> <2, C()> <6, C(b)> <4, C()> <9, C(b)> <8, C(w)> Dictionar:
Exemplu LZ78 Input: -------------------------oowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> <1, C(a)> <3, C(b)> <2, C()> <6, C(b)> <4, C()> <9, C(b)> <8, C(w)> <0, C(o)> Dictionar:
Exemplu LZ78 Input: --------------------------owoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> <1, C(a)> <3, C(b)> <2, C()> <6, C(b)> <4, C()> <9, C(b)> <8, C(w)> <0, C(o)> <13, C()> Dictionar:
Exemplu LZ78 Input: ----------------------------woowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> <1, C(a)> <3, C(b)> <2, C()> <6, C(b)> <4, C()> <9, C(b)> <8, C(w)> <0, C(o)> <13, C()> <1, C(o)> Dictionar:
Exemplu LZ78 Input: ------------------------------owoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> <1, C(a)> <3, C(b)> <2, C()> <6, C(b)> <4, C()> <9, C(b)> <8, C(w)> <0, C(o)> <13, C()> <1, C(o)> <14, C(w)> Dictionar:
Exemplu LZ78 Input: ---------------------------------oo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> <1, C(a)> <3, C(b)> <2, C()> <6, C(b)> <4, C()> <9, C(b)> <8, C(w)> <0, C(o)> <13, C()> <1, C(o)> <14, C(w)> <13, C(o)> Dictionar:
LZ78 • Observatie • Dacacontinuamsacodificam, dictionarul continua sacreasca • Solutii practice • Oprireacresteriidictionarului • efectiv ,considerareadictionarului ca unul static • Micsorareadictionarului • Ex: pebazastatisticilor de utilizare • Resetareadictionarului • Fara a cunoasteinformatiispecificereferitoare la sursa, tehnicile de maisus nu garanteazasuccesul
Algoritmul Lempel-Ziv-Welch • Idea de baza este de a imparti (parse-in limba engleza) secventa de intrare in blocuri (siruri) diferite de lungime diferita • Multimea blocurilor diferite defineste un dictionar • Indexul cuvintelor din dictionar este salvat in fisierul comprimat
Algoritmul Lempel-Ziv-Welch Algoritm de codare LZW: Date intiale: Alfabetul A; secventa de intrare in; #1. Initializeaza dictionarul cu simbolurile alfabetului; #2. Initializeaza secventa comprimata: code =’’; #3. Citeste primul caracter de intrare, sirul prefix S: S = in(1); #4. Cat Timp nu s-a parcurs toata secventa de intrare EXECUTA: #4.1.Citeste urmatorul caracter de intrare: K = in(i+1). #4.2. Daca sirul SK este in tabel ATUNCI #4.2.1. Asigneaza: S = SK; ALTFEL #4.2.2. Memoreaza SK in dictionar; #4.2.3. Asigneaza: S = K; #4.2.4. Scrie: code = code + code(S) End #4.2; End #5; END.
Exemplu (1) • Fie mesajul „abba_baba_buba” si dictionarul initializat cu alfabetul sursei, adica D={a,_,b,u}. • Initializare: • code={}, S=’’ • D={a,_,b,u} • Citeste primul caracter: „abba_baba_buba”