1 / 130

Conf. Dr. Ing . Costin-Anton Boiangiu < Costin.Boiangiu@CS.PUB.RO >

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.

onofre
Download Presentation

Conf. Dr. Ing . Costin-Anton Boiangiu < Costin.Boiangiu@CS.PUB.RO >

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

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

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

  4. Exemplu Input: abracadabra Output: 101

  5. Exemplu Input: --racadabra X Output: 101

  6. Exemplu Input: --racadabra Output: 101100

  7. Exemplu Input: ---acadabra Output: 101100110

  8. Exemplu Input: -----adadabra Output: 101100110111

  9. Exemplu Input: -------abra Output: 101100110111101

  10. Exemplu Input: ---------ra X Output: 101100110111101

  11. Exemplu Input: ---------ra Output: 101100110111101100

  12. Exemplu Input: ----------a Output: 101100110111101100000

  13. Problema: Care diagrame? Sursa#2: Cod C Sursa#1: Capitol dintr-o carte (LaTeX)

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

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

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

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

  18. 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:

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

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

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

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

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

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

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

  26. Algoritmul Lempel-Ziv

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

  28. 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: • wabbawabbawabbawabbawoowoowoo

  29. Exemplu LZ78 Input: wabbawabbawabbawabbawoowoowoo Output: Dictionar:

  30. Exemplu LZ78 Input: wabbawabbawabbawabbawoowoowoo Output: <0, C(w)> Dictionar:

  31. Exemplu LZ78 Input: -abbawabbawabbawabbawoowoowoo Output: <0, C(w)> <0, C(a)> Dictionar:

  32. Exemplu LZ78 Input: --bbawabbawabbawabbawoowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> Dictionar:

  33. Exemplu LZ78 Input: ---bawabbawabbawabbawoowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> Dictionar:

  34. Exemplu LZ78 Input: -----wabbawabbawabbawoowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> Dictionar:

  35. Exemplu LZ78 Input: ------wabbawabbawabbawoowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> <1, C(a)> Dictionar:

  36. Exemplu LZ78 Input: --------bbawabbawabbawoowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> <1, C(a)> <3, C(b)> Dictionar:

  37. Exemplu LZ78 Input: ----------awabbawabbawoowoowoo Output: <0, C(w)> <0, C(a)> <0, C(b)> <3, C(a)> <0, C()> <1, C(a)> <3, C(b)> <2, C()> Dictionar:

  38. Exemplu LZ78 Input: ------------wabbawabbawoowoowoo 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:

  39. Exemplu LZ78 Input: ---------------bawabbawoowoowoo 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:

  40. Exemplu LZ78 Input: ------------------wabbawoowoowoo 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:

  41. Exemplu LZ78 Input: ----------------------awoowoowoo 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:

  42. Exemplu LZ78 Input: -------------------------oowoowoo 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:

  43. Exemplu LZ78 Input: --------------------------owoowoo 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:

  44. Exemplu LZ78 Input: ----------------------------woowoo 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:

  45. Exemplu LZ78 Input: ------------------------------owoo 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:

  46. 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:

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

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

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

  50. 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”

More Related