4 - Compresia Fara Pierdere de Calitate - II

56
Transmisia datelor multimedia in retele de calculatoare Compresia fara pierdere de calitate II Conf. Dr. Ing. Costin-Anton Boiangiu <[email protected]> UNIVERSITY POLITEHNICA of BUCHAREST DEPARTMENT OF COMPUTER SCIENCE

description

4 - Compresia Fara Pierdere de Calitate - II

Transcript of 4 - Compresia Fara Pierdere de Calitate - II

Transmisia datelor multimedia in retele de calculatoare Compresia fara pierdere de calitate II

Transmisia datelor multimedia in retele de calculatoareCompresia fara pierdere de calitateIIConf. Dr. Ing. Costin-Anton Boiangiu

UNIVERSITY POLITEHNICA of BUCHARESTDEPARTMENT OF COMPUTER SCIENCE2Recapitulare: Coduri Huffman ExtinseFie sursa:A = {a, b, c}, P(a) = 0.8, P(b) = 0.02, P(c) = 0.18H = 0.816 bits/symbolCodul Huffman este:a0b11c10l = 1.2 bits/symbolRedundanta= 0.384 b/sym (47%!)

Se poate mai bine?3Recapitulare: Coduri Huffman ExtinseIdeeSe considera codarea secventelor de cate doua caractere, spre deosebire de codarea individuala a fiecarui caracterLetterProbabilityCodeaa0.64000ab0.016010101ac0.144011ba0.0160101000bb0.000410100101bc0.00361010011ca0.1440100cb0.003610100100cc0.03241011l = 1.7228/2 = 0.8614Red. = 0.0045 bits/symbol4Recapitulare: Coduri Huffman ExtinseIdeea poate fi extinsa in continuareSe considera toate secventele de forma mn avand lungimea nIn teorie: Considerand mai multe secvente se poate inbunatati codificareaIn realitate: Cresterea exponentiala a alfabetului face acest lucru inpracticE.g., pentru lungimea 3 se genereaza urmatorul numar de secvente ASCII.: 2563 = 224 = 16MEste nevoie sa se genereze coduri pentru toate secventele de lungime mMajoritatea vor avea frecventa zeroDistributiile complet nebalansate reprezinta o problema majora; fie exemplul:A = {a, b, c}, P(a) = 0.95, P(b) = 0.02, P(c) = 0.03 H = 0.335 bits/symboll1 = 1.05, l2 = 0.611, Performanta algoritmului devine acceptabila doar la n = 8!dar |alfabetul| = 38 = 6561 !!!IntroducereScurta istorie

Shannon a mentionat pentru prima data folosirea cdf (Cumulative Density Function)Peter Elias (coleg al lui Huffman)a dezvoltat un algoritm recursiv facut public abia in 1963Jelinek 1968Radacini moderne: Pasco/Rissanen 1976

5IntroducereCodarea aritmetica elimina necesitatea codarii fiecarui simbol al alfabetului surseiIn timpul codarii algoritmul genereaza un cod pentru intreg mesajul de intrare, lucru ce este facut in mod secvential, simbol cu simbolIn comparatie cu alte campuri din sfera codarii, codarea aritmetica este foarte tanara (1970), matura si completa si eficienta in compresia fara pierdere de informatie

Codarea aritmetica lucreaza in timp liniar ci o folosire constanta a memorieiFolosirea reprezentarii binare pe un numar fix de simboluri este suficienta pentru toate calculeleRaportul de compresie obtinut este mai bun decat in cazul folosirii codului Huffman si exista implementari hardware ale algoritmului de compresie, cum sunt cele din protocoalele G3 si G4 din Fax. 6IntroducereLa memorarea intervalului se pot memora capetele intervalului sau la fel de bine numai mijlocul acestuiaDin cauza ca mesajele foarte mari vor conduce la intervale din ce in ce mai mici, apare problema reprezentarii intervalelor foarte mici pentru a asigura unicitatea codarii, si deci o decodare corectaProblema este rezolvata prin folosirea scalariiSalvarea codului aritmetic (in reprezentare zecimala sau binara) intr-un fisier presupune specificarea sfarsitului reprezentariiAcest lucru se poate face intr-un fisier prin scrierea unui antet cu lungimea inregistrarii, pentru a putea fi refacuta la decodareIn cazul transmisiilor continue, cum este cazul fax-ului, se folosesc simboluri speciale si atunci in secventa de codat trebuie adaugat un simbol marcator sfarsit de secventa El trebuie sa aiba probabilitatea minimala7Aspecte esentialeIn codarea aritmetica o sursa este reprezentata de un interval intre 0 si 1 pe axa numerelor realeFiecare simbol al ansamblului micsoreaza acest intervalPe masura ce intervalul devine mai mic, numarul de biti necesar pentru specificare este mai mareCodarea aritmetica presupune in mod explicit un model probabilistic al sursei Este o schema bazata pe cuvinte de cod ce utilizeaza probabilitatile mesajelor sursei pentru a ingusta intervalul utilizat in reprezentarea ansambluluiUn mesaj cu probabilitate mare ingusteaza intervalul mai putin decat un mesaj cu probabilitate mica, astfel incat probabilitatile mari contribuie mai putin la cresterea lungimii cuvintelor de codMetoda incepe cu o lista neordonata a mesajelor sursei si a probabilitatilor asociateNumarul liniei este partitionat in subintervale folosind probabilitatile cumulate

8Cvasi-optimalitatea codarii aritmeticeDupa teorema codarii a lui Shannon, numarul lungimea medie a cuvintelor de cod trebuie sa indeplineasca relatia

Fie un mesaj ce contine M simboluri; dupa statistica sursei, simbolul apare de P(si) oriLatimea intervalului final, dupa considerarea tuturor simbolurilor, este:

9

Cvasi-optimalitatea codarii aritmeticeNumarul de simboluri binare pentru codarea latimii intervalului final se calculeaza cu relatia

de unde rezulta ca numarul mediu de simboluri binare pentru reprezentarea mesajului de lungime M este

adica limita Shannon10

ExempluFie, de exemplu, o sursa cu doua simboluri: X si Y, cu probabilitatile P(X) =2/3 si P(Y) = 1/3Daca se doreste codarea mesajelor de lungime 2 atunci se poate organiza urmatoarea imagine pentru codarea tuturor mesajelor in intervalul [0,1)11

ExempluSecventa XX este codata cu intervalul [0,4/9) si secventa YY este codata cu intervalul [8/9,1)Pentru codarea intervalului poate fi transmis orice numar din intervalul considerat, evident pe un numar de biti corespunzator, ce este dat de marimea intervalului

12

ExempluPentru codarea secventelor de lungime 3 se poate construi imaginea / tabelul de codare alaturat:13

ExempluXX

XY

YX

YY

14

Algoritmul de bazaSe considera intervalul curent [L,H) initializat cu [0,1)

Pentru fiecare simbol, ai, din fisier, se parcurg doi pasi:Se imparte intervalul curent in subintervale, cate unul pentru fiecare simbol din alfabetul sursei; marimea subintervalului unui simbol din alfabet este proportional cu probabilitatea estimata, considerata in cadrul modelului

Se selecteaza subintervalul corespunzator simbolului care apare in fisierul de comprimat, si se considera ca fiind noul interval curent

Se scriu in fisierul comprimat suficiente simbolui binare pentru a putea identifica (reconstitui) intervalul curent final din multimea tuturor intervalelor finale, posibil a fi considerate

15Algoritmul de bazaDiviziunea intervalului curent este bazata pe probabilitatea simbolului de intrare ai, care apare in fisierul de comprimat:16

ExempluFie sursa data prin distributia

Figura alaturata arata modul de realizare a partitiilor pentru mesajul iou

17

ObservatiiLungimea intervalului final este egala cu produsul probabilitatilor simbolurilor individuale ce apar in fisierul/secventa de comprimat:

unde Ns este numarul de simboluri din fisierul de intrare (cel care trebuie comprimat)Se calculeaza numarul de biti care trebuie memorati in fisierul comprimat (cel de iesire) dupa relatia:

unde paranteza are semnificatia de parte intreaga, obtinuta prin rotunjireNumarul de biti generati de codarea aritmetica este egal cu entropia, H (evident, daca nu se considera rotunjirea)Codarea aritmetica atinge compresia care este indicata de entropia sursei, de aceea este optimala

18

ObservatiiTrebuie introdus un simbol suplimentar in alfabetul sursei, pentru a indica sfarsitul de fisierLa pasul 2 al algoritmului se calculeaza in mod efectiv numai subintervalul corespunzator simbolului care apare in fisier, de exemplu aiSunt necesare probabilitatile cumulative

Fie k indicele alfabetului si i indicele simbolurilor mesajului/secventei; relatiile de calcul ale sub-intervalului nou sunt:

unde L si H sunt limitele intervalului curent - pentru primul pas se considera L=0 si H=1

19

ObservatiiIntersectia intervalelor obtinute este vida pentru simboluri diferite, deci:

In mod curent, codarea aritmetica poate fi implementata sub forma a doua module, care separa modelul sursei de procesul de codareModelul sursei este un modul de program si este consultat atat de codor cat si de decodor, la fiecare pas al procesariiPosibilitatea separarii modelului in doua sub-modele, unul pentru estimarea probabilitatilor si unul pentru codare, permite cuplarea codarii aritmetice cu orice metoda statica sau dinamica de estimare a probabilitatilor (sau frecventelor) mesajelor sursei

20

ObservatiiPentru realizarea decodarii trebuie sa se cunoasca modelul sursei utilizate de codor (mesajele si intervalele asociate) si un singur numar din intervalul determinat de codor

Decodarea consta intr-o serie de comparatii a numarului i cu valorile reprezentand mesajele sursei

21ExempluSe considera o sursa cu doua simboluri, cu distributia de mai jos, in care se recunoaste introducerea unui simbol suplimentar EOF si normalizarea probabilitatilor la 1

Se va exemplifica codificarea/comprimarea mesajului bbbEOF

22

ExempluInterval curentActiuneSub-intervale pentru alfabetul surseiSimbol mesajabEOFLHLHLHLH0.0001.00initializare0.0000.400 0.400 0.900 0.900 1.000b0.4000.900subdivide0.4000.600 0.600 0.850 0.850 0.900b0.6000.850subdivide0.6000.700 0.700 0.825 0.825 0.850b0.7000.820subdivide0.7000.750 0.750 0.812 0.812 0.825EOF0.8120.820codifica23ExempluProbabilitatea mesajului este: 0.5 x 0.5 x 0.5 = 0.125Numarul de biti = -log 2 (0.125) = 6.3219 -> 7 bitiIntervalul final = [0.81250000000000 0.82500000000000] Mijlocul intervalului x = (0.8125 + 0.8250) / 2 = 0.8187 (0.8187)10 = (1 1 0 1 0 0 0 )2Codul mesajului = 1 1 0 1 0 0 0 Marimea initiala a mesajului = 3 * 8 = 24 biti = 3 octetiMarimea finala = 7 biti = 1 octet.Raport de compresie > 3

24DecodareaPentru a decoda o secventa, trebuie aplicate operatiile efectuate la codare insa in ordine inversa

Se cunosc:modelul sursei, prin alfabet si probabilitati;secventa/mesajul codat sub forma de interval sau sub forma mediei intervalului, V;numarul de simboluri primare din secventa codata

25Algoritmul de decodareSe compara media intervalului cu fiecare din intervalele initiale (asa cum s-a facut la codare) si se determina simbolul caruia ii apartine intervalul gasitSe cauta urmatorul simbol prin modificarea probabilitatii partitiei, asa cum s-a facut si la codare:

unde i trebuie sa fie ales astfel incat sa fie indeplinita inegalitatea:

deci ai este urmatorul simbol din secventa codata

26

ExempluDatele de intrare sunt:S=['a','b','c','d'];P=[0.5, 0.25, 0.125, 0.125];interval = 0.27236938480000;n_mesaj = 8.

Rezultatele: decode = abaabcdd ????

Istoric (history) =

0.00000000000000 1.00000000000000 0 0.00000000000000 0.50000000000000 1.00000000000000 0.00000000000000 0.50000000000000 0 0.25000000000000 0.37500000000000 2.00000000000000 0.25000000000000 0.31250000000000 1.00000000000000 0.25000000000000 0.28125000000000 1.00000000000000 0.25000000000000 0.28125000000000 0 0.26562500000000 0.27343750000000 2.00000000000000 0.26562500000000 0.27343750000000 0 0.26562500000000 0.27343750000000 0 0.27148437500000 0.27246093750000 3.00000000000000 0.27148437500000 0.27246093750000 0 0.27148437500000 0.27246093750000 0 0.27221679687500 0.27233886718750 4.00000000000000 0.27221679687500 0.27233886718750 0 0.27221679687500 0.27233886718750 0 0.27230834960938 0.27232360839844 4.00000000000000

27Exemplu (codul matlab)% decodare aritmetica% se presupun cunoscute:% - numarul de simboluri din mesaj/secventa;% - modelul sursei;% - intervalul (sau mijlocul) intervalului;

clc, clear;ver = 1;if ver, % 1 2 3 4 S=['a','b','c','d'];P=[0.5, 0.25, 0.125, 0.125];%mesaj=['a','b','a','a','b','c','d','a'];%ind_mesaj = [1 2 1 1 2 3 4 1];interval = 0.27236938480000;n_mesaj = 8;else% 1 2 3 4 5 6 7 S=['a','n','_','r','e','m','i']; P=[4/17, 1/17, 3/17, 3/17, 3/17, 2/17, 1/17]; %mesaj=['a','n','a','_','a','r','e','_','m','e','r','e','_','m','a','r','i']; %ind_mesaj = [1 2 1 3 1 4 5 3 6 5 4 5 3 6 1 4 7]; interval = 0.05640215726457;n_mesaj = 17; end;PC=cumsum(P); PC = [0 PC]; % initializareL=0; H=1;history = [ L H 0] ;ind_mesaj =[];% decodarefor k=1:n_mesaj, % indicele simbolului din secventa; i=1; % indicele simbolului din alfabet; L_new = L + PC(i) * (H-L); H_new = L + PC(i+1) * (H-L); while ~[(interval > L_new) & (interval < H_new)], i = i + 1; if i >= length(S), break; end; L_new = L + PC(i)*(H-L); H_new = L + PC(i+1)*(H-L); history = [history; L H 0]; end; L = L_new; H = H_new; ind_mesaj = [ind_mesaj i]; history = [history; L H i];end% rezultate:decode = S(ind_mesaj)history

28Compresia aritmetica cu scalareProblema implemenatrii codarii aritmetice este data de precizia finita a operatiilor cu numere realeSolutia consta in inlocuirea intervalului [0,1) al numerelor reale cu intervalul numerelor intregi, unde N este un numar intreg, cu semnificatie de numarul de cifre binare al registrelor numericeIdeea consta in selectarea prefixului comun la capetelor intervalelor, L si H, si apoi completarea capatului din stanga, L, cu simboluri 0 si al capatului dreapta, H, cu 1Nu este nevoie de un model al sursei, ci numai de alfabetul surseiFrecventele simbolurile sunt construite dinamic, deci se poate considera apartenenta metodei la clasa metodelor dinamice(adaptive)

29Compresia aritmetica cu scalareIntervalelele asociate simbolurilor alfabetului se calculeaza cu ajutorul frecventelor simbolurilor, in mod dinamic; fiecare frecventa a unui caracter este initializata cu 1 si este incrementata de fiecare data cand apare simbolul in mesajul de comprimatFie frecventa simbolului in alfabetFrecventa cumulata a simbolurilor este

unde Ns este numarul de simboluri din alfabetul surseiRezulta ca este frecventa cumulata a tuturor simbolurilorDe retinut ca este lungimea prefixului intrarii scanateSimbolurile sunt mentinute in ordinea descrescatoare a frecventelor lor30

Compresia aritmetica cu scalareCand un simbol este citit din sursa text, intervalul curent [L,H) este ajustat la

La fiecare ajustare a intervalului, se verifica conditia

31

Compresia aritmetica cu scalareIn caz contrar, intervalul este expandat cu relatia

Efectuarea acestei transformari este memorata prin incrementarea unui numarator (waiting_counter)Operatia se repata atat timp cat intervalul este prea scurtDupa salvarea mesajului comprimat, se trimite contunutul numaratoruluiDupa trimiterea ultimului bit al numaratorului, se transmite bitul invers de un numar de ori dat de continutul numaratorului de asteptare

32

AlgoritmCodare_simbol(ai) L=L+(H-L+1)*cum_freq(i)/cum_freq(0); H=L+(H-L+1)*cum_freq(i-1)/cum_freq(0)-1; WC =0; // waiting_counter REPEAT IF (L and H au bit comun in stanga) THEN code = code + bit_comun; L=L*2; H=2*H+1; ELSE IF (H-L)= cum_freq(0).END.Procedura de codare se incheie cu scrierea bitilor de asteptare (daca sunt) conform codului :Write(bit,fout); WHILE (waiting_counter>0) DO IF bit >0, THEN Write 1 in fout; Write 0 in fout; Waiting_counter = --1; End while;END.

33DecompresiaDecodarea este exact inversul procesului de codareSe utilizeaza o fereastra alunecatoare pe fisierul comprimat, de lungime NMai intai, se initializeaza fereastra cu primele N simboluri binareSe calculeaza valoarea ei zecimala prin conversia succesiunii binare, din baza 2 in baza 10Intervalul curent este initializat ci l=0 si Simbolul este produs ca urmare a evaluarii expresiei

unde l si h sunt ajustate cu aceleasi relatii din timpul procesului de codare si i cea mai mica valoare intreaga34

DecompresiaDaca reprezentarile binare ale capetelor intervalului au un prefix comun de lungime p, ele sunt deplasate cu p pozitii spre stangaPozitiile ramase libere se completeaza cu zerouri pentru l si cu 1 pentru hFereastra de citire este deplasata cu (p) pozitii inspre dreapta si variabila value este ajustata corespunzatorSe actualizeaza tabelele freq si cum_freq astfel incat simbolurile sa fie mentinute in ordine descrescatoare a frecventelor, exact ca la procesul de codareOperatiile se repeta pana cand se produce simbolul END

35AlgoritmDecodare(fin) cum_freq = ((value-l+1)*cum_freq(0)-1) / (h-l+1); Define i=; While cum_freq(i)>cum_freq DO i =i++; l = l + (h-l+1)*cum_freq(i)/cum_freq(0); h = l + (h-l+1)*cum_freq(i-1)/cum_freq(0) - 1; REPEAT IF common_left_bits(l,h), THEN l = 2*l; h = 2*h +1; Read_bit(fin); value = 2*value + b; ELSE IF (h-l) < cum_freq(0), THEN l = 2*(l-2N-2) H = 2*(h-2N-2) + 1 Read_bit(fin); value = 2*(value 2N-2) + b; UNTIL no common_left_bits(l,h) and (H-L) >= cum_freq(0);END.

36ConcluziiCodarea aritmetica are ca rezultat un sir de simboluri care permite obtinerea unor rate de compresie mult mai buneDe obicei este mai performanta decat codarea Huffman din acest punct de vedereCodarea aritmetica a unui sir de simboluri de lungime l, S={s1, s2,, sl} este obtinuta prin l impartiri iterative in sub-intervale, partitionari facute pe baza proprietatilor statistice ale setului de simboluri considerat, adica distributia de probabilitate si probabilitatile conditionateLungimea fiecarui sub-interval este egala cu probabilitatea sirului de simboluri care ii corespundeCuvantul de cod aritmetic pentru un sir de simboluri S este format din primii W biti din reprezentarea binara a valorii de mijloc a sub-intervalului corespunzator, I(S), unde W=[log21/|I(S)|]+1, iar |I(S)| este lungimea intervalului I(S)37Transformarea Burrows-Wheeler Transformarea Burrows-Wheeler a fost introdus n 1994 de ctre cei doi autori care i dau i numele, i extins de ctre Nelson n 1996

Foloseste repetiiile de secvene de cuvinte pentru a mbunti compresiaFuncioneaz similar cu metodele bazate pe dicionare Este o metod de compresie fr pierderi de date

Avantaje: de obicei, transformarea Burrows-Wheeler confer rezultate mult mai bune dect tehnicile tradiionale de compresie bazate pe dicionare: (Lempel Ziv, WinZip, gzip, etc)Dezavataje: timpul de execuie este mult mai lung dect n cazul algoritmilor enunai anterior38Algoritmul de compresie Transformarea BWT consta din urmatoarele:sirul de simboluri generate de o sursa de informatie S se mparte n subsiruri care au k simboluri fiecare, ultimul segment avnd (k modulo n) simboluripentru fiecare subsir: se genereaza toate permutarile circulare se ordoneaza lexicografic se construieste un sir S' de simboluri format din ultimul simbol al fiecarei permutarin final, pentru fiecare subsir, se transmite sirul corespunzator obtinut mpreuna cu numarul de ordine p al subsirului obtinut dupa sortare39Algoritmul de compresieFiind dat un ir de caractere de intrare S, de lungime n, codificatorul construiete o matrice n x n n care este pstrat pe primul rnd irul S, urmat pe celelalte rnduri de n 1 copii ale sale, fiecare dintre ele rotit circular cu un caracter fa de irul precedentRndurile acestei matrice sunt sortate apoi din punct de vedere lexicografic, obinndu-se astfel o structura de date ordonatDeoarece fiecare rnd i fiecare coloan a matricei astfel obinute este de fapt o permutare a lui S, acesta va conine toate cele n simboluri din irul de intrarePermutarea L care este selectat de ctre codificator este chiar ultima coloan din matricea sortat anteriorSingura informaie necesar pentru a reconstrui eventual S pe baza lui L este indexul irului de caractere iniial din matricea sortat40Exemplu (1) irul de caractere de intrare: this is the 41

Exemplu (1)Rezultatul final: this-is-the == (sshtth-ii-e, I = 10) 42

Exemplu (2)irul de caractere de intrare: gazeta_de_informatic Permutarile circulare:

gazeta_de_informatic nformaticgazeta_de_iazeta_de_informaticg formaticgazeta_de_inzeta_de_informaticga ormaticgazeta_de_infeta_de_informaticgaz rmaticgazeta_de_infota_de_informaticgaze maticgazeta_de_infora_de_informaticgazet aticgazeta_de_inform_de_informaticgazeta ticgazeta_de_informade_informaticgazeta_ icgazeta_de_informate_informaticgazeta_d cgazeta_de_informati_informaticgazeta_de gazeta_de_informatic informaticgazeta_de_43Exemplu (2)Sortarea lexicografica:

_de_informaticgazeta gazeta_de_informatic_informaticgazeta_deicgazeta_de_informata_de_informaticgazetinformaticgazeta_de_aticgazeta_de_informmaticgazeta_de_inforazeta_de_informaticg nformaticgazeta_de_igazeta_de_informaticormaticgazeta_de_infcgazeta_de_informati rmaticgazeta_de_infode_informaticgazeta_ta_de_informaticgazee_informaticgazeta_d ticgazeta_de_informaeta_de_informaticgaz zeta_de_informaticga formaticgazeta_de_in

Daca luam ultimul simbol al fiecarei permutari dupa sortare se obtine sirul S' = "aetmgci_dznt_rifoeaa, iar numarul de ordine al sirului S este 11, primul sir avnd numarul de ordine 0Sirul S' astfel obtinut se transmite mpreuna cu numarul p = 1144ConcluziiDin punct de vedere al timpului de execuie, metoda Burrows-Wheeler este destul de neperformant, mai ales datorit pasului de sortareImbunatatire: fiierul de intrare poate fi mprit n mai multe buci pentru a eficientiza execuia (compresia va fi insa afectat de cele mai multe ori datorit faptului c utilizarea unei bucti de fiier mai mic va duce la apariia mai puinor repetiii de iruri de caractere)Transformarea Burrows-Wheeler elimin corelarea temporal deoarece cu ct sunt mai puine iruri de caractere intr-o parte dintr-un fiier, cu att este mai greu s se detecteze corelarea. Simbolurile sunt grupate impreuna n funcie de contextul n care ele apar prin intermediul sortriiContextul considerat este de o singur parte a fiecrui simbol Aplicatii : Zzip (Debin, 2002) pentru Windows i bzip2 pentru UNIX45ConcluziiCapacitatea codurului este limitata de lungimele registrelor ce calculeaza valorile probabilitatilorDezavantajul este inlaturat prin aplicarea unor tehnici de scalare si rotunjire a capetelor de interval, conform algoritmului lui JelinekIn vederea efectuarii operatiei de decodare sunt posibile doua solutii:sa se cunoasca numarul de simboluri din mesajul initial, deci sa se scrie intr-un antet acest numar;inserarea unui caracter EOF in mesajul de codat; in momentul in care, la decodare, se ajunge in intervalul aferent lui EOF se decide oprirea decodarii46Compresia RLE (run-length encoding)Se bazeaz pe presupunerea conform creia dac selectm un pixel din imagine la ntmplare, exist o ans destul de mare ca vecinii acestuia s aib aceeai culoareCa urmare, codificatorul funcioneaz prin parcurgerea imaginii rnd cu rnd, cutnd serii consecutive de pixeli de aceeai culoare

Exemplu: daca imaginea este alb-negru i conine pe un rnd 17 pixeli albi, urmai de 1 pixel negru, urmat de 55 pixeli albi, etc. se va reine la ieire doar seria de numere 17, 1, 55, etc.

47Compresia RLEDe obicei, codificatorul presupune c imaginea de intrare ncepe cu un pixel alb (ceea ce este adevrat in marea majoritate a cazurilor)Dac aceast condiie nu este ndeplinit, fluxul de numere de la ieire ar trebui s nceap cu un segment de lungime 0Rezoluia imaginii trebuie returnat la nceputul fluxului de ieireDimensiunea compresiei obinute depinde de obicei de complexitatea imaginii:cu ct imaginea conine mai multe detalii, cu att compresia va avea o performan mai redus

48Algoritmul de compresieSe initializeaza un contor i cu valoarea 1 si se retine primul simbol generat de sursa SSirul generat de sursa de informatie se parcurge simbol cu simbol;La fiecare pas, daca simbolul curent este identic cu cel retinut la pasul anterior:atunci daca i este mai mic dect m':atunci incrementeaza valoarea contorului i si se trece la pasul urmator;altfel transmite la iesire simbolul retinut mpreuna cu valoarea i si initializeaza i cu 1altfel, daca valoarea i este egala cu 1:atunci transmite simbolul retinut si retine simbolul nou citit;altfel transmite la iesire simbolul retinut si valoarea i, retine noul simbol citit si initializeaza pe i cu valoarea 1

m' este cea mai mica putere a lui 2 mai mare sau egala cu numarul total de simboluri pe care le poate genera o sursa de informatie S49ExempluPentru sirul de 16 simboluri aabcdeeeeffffgah, se transmite sirul: a 2 b c d e 4 f 4 g a hLungimea noului sir este 12, fata de 16 ct are sirul initial

Pentru a decodifica acest sir, se citeste primul simbol si se retine, iar apoi se parcurge secvential sirul de simboluriLa fiecare pas, daca simbolul este un numar, atunci se transmite simbolul retinut de cte ori indica numarul citit si se retine un nou simboln caz contrar se transmite simbolul retinut si se citeste un nou simbolDupa parcurgerea sirului de simboluri se transmite ultimul simbol citit, daca acesta nu reprezinta un numar50Exemplun conditiile prezentate anterior, decodificarea siruluia 2 b c d e 4 f 4 g a h are loc astfel:

retine a;transmite a de 2 ori si retine b;transmite b si retine c;transmite c si retine d;transmite d si retine e;transmite e de 4 ori si retine f;transmite f de 4 ori si retine g;transmite g si retine a;transmite a si retine h;transmite h51RLE pentru imagini in tonuri de griFiecare segment de pixeli avnd aceeai nuan este codificat sub forma unei perechi:(lungimeSegment, valoareIntensitate)De obicei lungimea segmentului ocup un byte de memorie, ceea ce permite codificarea segmentelor de lungime pn la 255 de pixeliLungimea unui segment nu poate fi niciodat 0; se poate folosi pentru codificare lungimeaSegmentului 1, in acest caz putand fi codificate si poriuni de lungime 256Valoarea intensitii este reprezentat pe civa bii, n funcie de numrul de nuane de gri din imagine (de obicei undeva ntre 4 si 8 bii)Problema poate fi extins asemntor si la imaginile color!52ExempluPresupunnd c avem o imagine n tonuri de gri care ncepe cu seria de pixeli avnd valorile: 12, 12, 12, 12, 12, 12, 12, 12, 12, 35, 76, 112, 67, 87, 87, 87, 5, 5, 5, 5, 5, 5, 1,... Codificarea obinut va fi urmtoarea: 9, 12, 35, 76, 112, 67, 3, 87, 6, 5, 1, unde valorile subliniate reprezint numrul de repetiiiProblema care apare este aceea a diferenierii dintre valorile de pixeli (de exemplu 12) i valorile care reprezint numrul de repetiii (9)Printre soluiile posibile se numr i urmtoarele: dac imaginea este limitat la doar 128 de nuane de gri, putem folosi un bit din fiecare byte pentru a indica dac valoarea respectiv este o intensitatea sau un numr de repetiii; putem rezerva o valoare (spre exemplu 255) din cele de la 0 la 255 pentru a o folosi pentru semnalizarea unei serii de pixeliAstfel secvena de mai sus va deveni: 255, 9, 12, 35, 76, 112, 67, 255, 3, 87, 255, 6, 5, 1,...

53ConcluziiOrdinul de complexitate al acestui algoritm este O(n), unde n este numarul simbolurilor generate de o sursa de informatie SAlgoritmul RLE se foloseste de foarte multe ori n cadrul compresiei imaginilor, n combinatie cu metodele Huffman sau aritmeticaExceptie: in cazul fisierelor de tipul BMP, algoritmul RLE se foloseste singur

n practica, daca numarul maxim de simboluri ale unui subsir se considera a fi m', atunci n cel mai rau caz (cnd sirul de simboluri care trebuie comprimat este format numai din subsiruri formate din simboluri identice care au lungimea 2) dimensiunea sirului de simboluri transmis este cu 50% mai mare dect dimensiunea sirului original

54ConcluziiAlgoritmii entropici de compresie nu pot comprima siruri de simboluri a caror entropie este egala cu log2m, unde m este numarul de simboluri ale alfabetului sursei care a generat sirulAplicarea algoritmului RLE naintea unui algoritm entropic asupra unui sir de simboluri, duce, de cele mai multe ori, la micsorarea entropiei sirului, de unde reiese concluzia ca sirul de simboluri a devenit mai comprimabil

55ReferinteAlistair Moffat and Andrew Turpin, Compression and Coding Algorithms, Kluwer Academic Publishers, Boston, March 2002.

Ian H.Witten, Alistair Moffat, and Timothy C.Bell, Managing Gigabytes: Compressing and Indexing Documents and Images, Morgan Kaufmann, San Francisco, 1999

Eric Bodden, Malte Clasen, Joachim Kneis, Arithmetic Coding revealed, A guided tour from theory to praxis, Seminar Data Compression WS 2001/2002, RWTH Aachen University, May 2004.Paul G. Howard and Je_rey Scott Vitter, Analysis of Arithmetic Coding for Data Compression, Brown University, Department of Computer Science, Appears in Information Processing and Management, Volume 28, Number 6, November 1992, pages 749-763.

56