Sunteți pe pagina 1din 56

UNIVERSITY POLITEHNICA of BUCHAREST

DEPARTMENT
DEPARTMENT OF
OF COMPUTER
COMPUTER SCIENCE
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>
<Costin.Boiangiu@CS.PUB.RO>

Recapitulare: Coduri Huffman Extinse


Fie sursa:
A = {a, b, c}, P(a) = 0.8, P(b) = 0.02, P(c) = 0.18
H = 0.816 bits/symbol

Codul Huffman este:


a
b
c

0
11
10

l = 1.2 bits/symbol
Redundanta= 0.384 b/sym (47%!)

Se poate mai bine?


2

Recapitulare: Coduri Huffman Extinse


Idee
Se considera codarea secventelor de cate doua caractere, spre deosebire

de codarea individuala a fiecarui caracter

Letter

Probability

Code

aa

0.6400

ab

0.0160

10101

ac

0.1440

11

ba

0.0160

101000

bb

0.0004

10100101

bc

0.0036

1010011

ca

0.1440

100

cb

0.0036

10100100

cc

0.0324

1011

l = 1.7228/2 = 0.8614
Red. = 0.0045

bits/symbol

Recapitulare: Coduri Huffman Extinse


Ideea poate fi extinsa in continuare
Se considera toate secventele de forma mn avand lungimea n
In teorie:
Considerand mai multe secvente se poate inbunatati codificarea
In realitate:
Cresterea exponentiala a alfabetului face acest lucru inpractic
E.g., pentru lungimea 3 se genereaza urmatorul numar de secvente ASCII.: 256 3 =
224 = 16M
Este nevoie sa se genereze coduri pentru toate secventele de lungime m
Majoritatea vor avea frecventa zero
Distributiile 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/symbol
l1 = 1.05, l2 = 0.611,
Performanta algoritmului devine acceptabila doar la n = 8!
dar |alfabetul| = 3 8 = 6561 !!!

Introducere
Scurta 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 1963
Jelinek 1968
Radacini moderne: Pasco/Rissanen 1976

Introducere
Codarea aritmetica elimina necesitatea codarii fiecarui simbol al alfabetului

sursei
In timpul codarii algoritmul genereaza un cod pentru intreg mesajul de intrare, lucru

ce este facut in mod secvential, simbol cu simbol

In 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 memoriei
Folosirea reprezentarii binare pe un numar fix de simboluri este suficienta

pentru toate calculele


Raportul 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.
6

Introducere
La memorarea intervalului se pot memora capetele intervalului sau la fel de

bine numai mijlocul acestuia


Din 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 corecta
Problema este rezolvata prin folosirea scalarii

Salvarea codului aritmetic (in reprezentare zecimala sau binara) intr-un fisier

presupune specificarea sfarsitului reprezentarii


Acest lucru se poate face intr-un fisier prin scrierea unui antet cu lungimea

inregistrarii, pentru a putea fi refacuta la decodare


In 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 minimala
7

Aspecte esentiale
In codarea aritmetica o sursa este reprezentata de un interval intre 0 si 1 pe

axa numerelor reale


Fiecare simbol al ansamblului micsoreaza acest interval
Pe masura ce intervalul devine mai mic, numarul de biti necesar pentru

specificare este mai mare

Codarea 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 ansamblului

Un 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 cod
Metoda incepe cu o lista neordonata a mesajelor sursei si a probabilitatilor
asociate
Numarul liniei este partitionat in subintervale folosind probabilitatile cumulate
8

Cvasi-optimalitatea codarii aritmetice


Dupa teorema codarii a lui Shannon, numarul lungimea medie a

cuvintelor de cod trebuie sa indeplineasca relatia


H (S )
H (S )
l

H (S )
H max ( X ) log( D)
Fie un mesaj ce contine M simboluri; dupa statistica sursei, simbolul

apare de P(si) ori


Latimea intervalului final, dupa considerarea tuturor simbolurilor, este:
M

R f H f L f P ( s j ) P ( s1 ) ... P ( s1 ) .... P ( s N ) ... P ( s N )




j 1

de M P ( s1 ) ori

de M P ( s N ) ori

P ( si ) M P ( s i )
i 1

Cvasi-optimalitatea codarii aritmetice


Numarul de simboluri binare pentru codarea latimii

intervalului final se calculeaza cu relatia


N

k log R f log P ( si )

M P( si )

i 1

M P ( si ) log P ( si ) M H ( S )
i 1

de unde rezulta ca numarul mediu de simboluri binare


pentru reprezentarea mesajului de lungime M este
k

k
H (S )
M

adica limita Shannon


10

Exemplu
Fie, de exemplu, o sursa cu doua simboluri: X si Y, cu

probabilitatile P(X) =2/3 si P(Y) = 1/3


Daca se doreste codarea mesajelor de lungime 2 atunci se
poate organiza urmatoarea imagine pentru codarea tuturor
mesajelor in intervalul [0,1)

11

Exemplu
Secventa 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

Exemplu
Pentru codarea secventelor

de lungime 3 se poate
construi imaginea / tabelul de
codare alaturat:

13

Exemplu
2 2
4
n XX log log
3 3
9
2 1
2
n XY log log
3 3
9
1 2
2
nYX log log
3 3
9
1 1
1
nYY log log
3 3
9

XX
0,25 2 0.5 a 1 0
1,16 n XX 2

XY

2,16 n XY 3
2,16 nYX 3

0.5 2 1,0 a 2 1

code 01 2

0,5 2 1,0 a 1 1

0,0 2 0,0 a 2 0 code 100 2

YX

0,0 2 0,0 a 3 0

0,75 2 1,5 a 1 1

3,16 nYY 4

YY

0,5 2 1,0 a 2 1 code 110 2


0,0 2 0,0 a 3 0

0,9375 2 1,875 a 1 1
0,875 2 1,75 a 2 1
0,75 2 1,5 a 3 1

code 1111 2

0,5 2 1,0 a 4 1

14

Algoritmul de baza
1. Se considera intervalul curent [L,H) initializat cu [0,1)
2. Pentru fiecare simbol, ai, din fisier, se parcurg doi pasi:
1.
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
2.

Se selecteaza subintervalul corespunzator simbolului care apare in fisierul de


comprimat, si se considera ca fiind noul interval curent

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

Algoritmul de baza
Diviziunea

intervalului curent este bazata pe


probabilitatea simbolului de intrare ai, care apare in
fisierul de comprimat:

16

Exemplu
Fie sursa data prin

distributia

a
e
i
o
u

0
.
12
0
.
42
0
.
09
0
.
3
0
.
07

S :

Figura

alaturata
arata
modul de realizare a
partitiilor pentru mesajul
iou

17

Observatii
Lungimea intervalului final este egala cu produsul probabilitatilor simbolurilor individuale

ce apar in fisierul/secventa de comprimat:


(H L)

final

Ns

p( s

k 1

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:

n [ log p ]
2
unde paranteza are semnificatia de parte intreaga, obtinuta prin rotunjire
Numarul 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

Observatii
Trebuie introdus un simbol suplimentar in alfabetul sursei, pentru a indica sfarsitul de

fisier
La pasul 2 al algoritmului se calculeaza in mod efectiv numai subintervalul
corespunzator simbolului care apare in fisier, de exemplu ai i
Sunt necesare probabilitatile cumulative

PC ( i )

pk

k 1

Fie k indicele alfabetului si i indicele simbolurilor mesajului/secventei; relatiile de

calcul ale sub-intervalului nou sunt:

L' L Pc ( i 1 ) H L
H ' L Pc (i ) ( H L)

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

Observatii
Intersectia intervalelor obtinute este vida pentru simboluri diferite,

deci:

I( si ) I( s j ) daca si s j

In mod curent, codarea aritmetica poate fi implementata sub forma a

doua module, care separa modelul sursei de procesul de codare


Modelul sursei este un modul de program si este consultat atat de

codor cat si de decodor, la fiecare pas al procesarii


Posibilitatea 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

Observatii
Pentru 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

21

Exemplu
Se 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
b EOF
a

S :
0.4 0.5 0.1

Se va exemplifica codificarea/comprimarea

mesajului

bbbEOF

22

Exemplu
Simbol
mesaj

Sub-intervale pentru alfabetul sursei


Interval curent

Actiune
a
L

0.000

1.00

initializare

0.000

0.400

0.900

subdivide

0.400

0.600

0.850

subdivide

0.600

0.700

0.700

0.820

subdivide

0.700

0.750

0.812

0.820

codifica

EOF

0.400

0.400

0.900

0.600

0.600

0.850

0.700

0.825

0.750

0.812

0.900

1.000

0.850

0.900

0.825

0.850

0.812

0.825

EOF

23

Exemplu
Probabilitatea mesajului este: 0.5 x 0.5 x 0.5 = 0.125
Numarul de biti = -log 2 (0.125) = 6.3219 -> 7 biti
Intervalul 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 ) 2
Codul mesajului = 1 1 0 1 0 0 0
Marimea initiala a mesajului = 3 * 8 = 24 biti = 3 octeti
Marimea finala = 7 biti = 1 octet.
Raport de compresie > 3
24

Decodarea
Pentru 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

25

Algoritmul de decodare
Se compara media intervalului cu fiecare din intervalele initiale

(asa cum s-a facut la codare) si se determina simbolul caruia ii


apartine intervalul gasit
Se cauta urmatorul simbol prin modificarea probabilitatii partitiei,
asa cum s-a facut si la codare:
L' L Pc ( i 1 ) H L

H ' L Pc (i ) ( H L)

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


L' V H '

deci ai este urmatorul simbol din secventa codata


26

Exemplu

Datele 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
0.00000000000000
0.00000000000000
0.25000000000000
0.25000000000000
0.25000000000000
0.25000000000000
0.26562500000000
0.26562500000000
0.26562500000000
0.27148437500000
0.27148437500000
0.27148437500000
0.27221679687500
0.27221679687500
0.27221679687500
0.27230834960938

1.00000000000000
0.50000000000000
0.50000000000000
0.37500000000000
0.31250000000000
0.28125000000000
0.28125000000000
0.27343750000000
0.27343750000000
0.27343750000000
0.27246093750000
0.27246093750000
0.27246093750000
0.27233886718750
0.27233886718750
0.27233886718750
0.27232360839844

0
1.00000000000000
0
2.00000000000000
1.00000000000000
1.00000000000000
0
2.00000000000000
0
0
3.00000000000000
0
0
4.00000000000000
0
0
4.00000000000000
27

Exemplu (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];

% initializare
L=0; H=1;
history = [ L H 0] ;
ind_mesaj =[];
% decodare
for 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

28

Compresia aritmetica cu scalare


Problema implemenatrii codarii aritmetice este data de precizia finita

a operatiilor cu numere reale


Solutia 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 numerice
Ideea 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 1
Nu este nevoie de un model al sursei, ci numai de alfabetul sursei
Frecventele simbolurile sunt construite dinamic, deci se poate
considera apartenenta metodei la clasa metodelor dinamice(adaptive)
29

Compresia aritmetica cu scalare


Intervalelele 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 comprimat
Fie frecventa simbolului in alfabet
Frecventa cumulata a simbolurilor este

cum _ freq (i)

Ns

freq ( j )

j i 1

unde Ns este numarul de simboluri din alfabetul sursei


Rezulta ca este frecventa cumulata a tuturor simbolurilor
De retinut ca este lungimea prefixului intrarii scanate
Simbolurile sunt mentinute in ordinea descrescatoare a frecventelor lor
30

Compresia aritmetica cu scalare


Cand un simbol este citit din sursa text, intervalul curent

[L,H) este ajustat la


L L

( H L 1) cum _ freq (i )
cum _ freq (0)

H L

( H L 1) cum _ freq (i 1)
1
cum _ freq (0)

La fiecare ajustare a intervalului, se verifica conditia

H L cum _ freq (0)


31

Compresia aritmetica cu scalare


In caz contrar, intervalul este expandat cu relatia

[ H , L) [2 L 2 N 2 , 2 H 2 N 2 1)
Efectuarea acestei transformari este memorata prin incrementarea unui

numarator (waiting_counter)
Operatia se repata atat timp cat intervalul este prea scurt
Dupa salvarea mesajului comprimat, se trimite contunutul
numaratorului
Dupa trimiterea ultimului bit al numaratorului, se transmite bitul
invers de un numar de ori dat de continutul numaratorului de asteptare
32

Algoritm
Codare_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

Procedura de codare se incheie cu scrierea


bitilor de asteptare (daca sunt) conform
codului :

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)
THEN
L = L*(L-2N-2);
H = 2*(H-2N-2) + 1;
Waiting_counter = ++1;
UNTIL (L and H nu au biti comuni in stanga) and (H-L) >=
cum_freq(0).
END.

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

Decompresia
Decodarea este exact inversul procesului de codare
Se utilizeaza o fereastra alunecatoare pe fisierul comprimat, de lungime N
Mai intai, se initializeaza fereastra cu primele N simboluri binare
Se calculeaza valoarea ei zecimala prin conversia succesiunii binare, din baza 2

in baza 10
Intervalul curent este initializat ci L=0 si
Simbolul este produs ca urmare a evaluarii expresiei

cum _ freq (i )

(value L 1) cum _ freq (0) 1


H L 1

unde L si H sunt ajustate cu aceleasi relatii din timpul procesului de codare si i


cea mai mica valoare intreaga
34

Decompresia
Daca reprezentarile binare ale capetelor intervalului au un

prefix comun de lungime p, ele sunt deplasate cu p pozitii


spre stanga
Pozitiile ramase libere se completeaza cu zerouri pentru L si

cu 1 pentru H
Fereastra de citire este deplasata cu (p) pozitii inspre dreapta si
variabila value este ajustata corespunzator

Se actualizeaza tabelele freq si cum_freq astfel incat

simbolurile sa fie mentinute in ordine descrescatoare a


frecventelor, exact ca la procesul de codare
Operatiile se repeta pana cand se produce simbolul END
35

Algoritm
Decodare(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.

36

Concluzii
Codarea aritmetica are ca rezultat un sir de simboluri care permite obtinerea

unor rate de compresie mult mai bune


De obicei este mai performanta decat codarea Huffman din acest punct de
vedere
Codarea 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 conditionate
Lungimea fiecarui sub-interval este egala cu probabilitatea sirului de
simboluri care ii corespunde
Cuvantul 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)
37

Transformarea 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 compresia
Funcioneaz 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 anterior
38

Algoritmul 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) simboluri
pentru fiecare subsir:

se genereaza toate permutarile circulare


se ordoneaza lexicografic
se construieste un sir S' de simboluri format din ultimul simbol al
fiecarei permutari

n final, pentru fiecare subsir, se transmite sirul corespunzator

obtinut mpreuna cu numarul de ordine p al subsirului obtinut


dupa sortare
39

Algoritmul de compresie
Fiind 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 precedent
Rndurile acestei matrice sunt sortate apoi din punct de vedere
lexicografic, obinndu-se astfel o structura de date ordonat
Deoarece 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 intrare
Permutarea L care este selectat de ctre codificator este chiar ultima
coloan din matricea sortat anterior
Singura informaie necesar pentru a reconstrui eventual S pe baza lui L
este indexul irului de caractere iniial din matricea sortat
40

Exemplu (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
azeta_de_informaticg
zeta_de_informaticga
eta_de_informaticgaz
ta_de_informaticgaze
a_de_informaticgazet
_de_informaticgazeta
de_informaticgazeta_
e_informaticgazeta_d
_informaticgazeta_de
informaticgazeta_de_

nformaticgazeta_de_i
formaticgazeta_de_in
ormaticgazeta_de_inf
rmaticgazeta_de_info
maticgazeta_de_infor
aticgazeta_de_inform
ticgazeta_de_informa
icgazeta_de_informat
cgazeta_de_informati
gazeta_de_informatic

43

Exemplu (2)
Sortarea lexicografica:

_de_informaticgazeta
_informaticgazeta_de
a_de_informaticgazet
aticgazeta_de_inform
azeta_de_informaticg
gazeta_de_informatic
cgazeta_de_informati
de_informaticgazeta_
e_informaticgazeta_d
eta_de_informaticgaz
formaticgazeta_de_in

gazeta_de_informatic
icgazeta_de_informat
informaticgazeta_de_
maticgazeta_de_infor
nformaticgazeta_de_i
ormaticgazeta_de_inf
rmaticgazeta_de_info
ta_de_informaticgaze
ticgazeta_de_informa
zeta_de_informaticga

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
0
Sirul S' astfel obtinut se transmite mpreuna cu numarul p = 11
44

Concluzii
Din punct de vedere al timpului de execuie, metoda Burrows-Wheeler

este destul de neperformant, mai ales datorit pasului de sortare


Imbunatatire: 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 sortrii
Contextul considerat este de o singur parte a fiecrui simbol

Aplicatii : Zzip (Debin, 2002) pentru Windows i bzip2 pentru UNIX


45

Concluzii
Capacitatea codurului este limitata de lungimele registrelor ce

calculeaza valorile probabilitatilor


Dezavantajul este inlaturat prin aplicarea unor tehnici de scalare
si rotunjire a capetelor de interval, conform algoritmului lui
Jelinek
In 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 decodarii
46

Compresia 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 culoare
Ca 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.
47

Compresia RLE
De 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 0
Rezoluia imaginii trebuie returnat la nceputul fluxului de
ieire
Dimensiunea compresiei obinute depinde de obicei de
complexitatea imaginii:
cu ct imaginea conine mai multe detalii, cu att compresia va

avea o performan mai redus


48

Algoritmul de compresie
Se initializeaza un contor i cu valoarea 1 si se retine primul simbol generat de

sursa S
Sirul 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 1


altfel, 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 S


49

Exemplu
Pentru sirul de 16 simboluri aabcdeeeeffffgah, se transmite sirul:
a2bcde4f4gah

Lungimea 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 simboluri


La fiecare pas, daca simbolul este un numar, atunci se transmite
simbolul retinut de cte ori indica numarul citit si se retine un nou
simbol
n caz contrar se transmite simbolul retinut si se citeste un nou simbol

Dupa parcurgerea sirului de simboluri se transmite ultimul simbol citit,

daca acesta nu reprezinta un numar


50

Exemplu
n conditiile prezentate anterior, decodificarea sirului

a2bcde4f4gah
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 h
51

RLE pentru imagini in tonuri de gri


Fiecare 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 pixeli
Lungimea unui segment nu poate fi niciodat 0; se poate folosi pentru
codificare lungimeaSegmentului 1, in acest caz putand fi codificate
si poriuni de lungime 256
Valoarea 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!
52

Exemplu
Presupunnd 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 repetiii
Problema 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 pixeli

Astfel secvena de mai sus va deveni:

255, 9, 12, 35, 76, 112, 67, 255, 3, 87, 255, 6, 5, 1,...
53

Concluzii
Ordinul de complexitate al acestui algoritm este O(n), unde n este

numarul simbolurilor generate de o sursa de informatie S


Algoritmul RLE se foloseste de foarte multe ori n cadrul compresiei
imaginilor, n combinatie cu metodele Huffman sau aritmetica
Exceptie: 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
54

Concluzii
Algoritmii 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 sirul
Aplicarea 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

55

Referinte
Alistair 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

S-ar putea să vă placă și