Sunteți pe pagina 1din 51

Formats de Documents

Roberto Mantaci
13 mars 2012

Chapitre 1

Introduction

CHAPITRE 1. INTRODUCTION

Chapitre 2

Gnralits
2.1

Prsentation et Principes de la Compression de Donnes

Compression de Donnes = convertir un stream (= source, plus appropri que fichier) de


donnes en entre en une autre de taille plus petite.
Raisons :
stockage
vitesse de transfert
La notion de compression de donnes est lie la notion de codage. En fait on parle de codage
de la source.
Il existent plusieurs mthodes trs diverses pour cela, mais elles sont toutes bases sur un
mme principe : rduire la redondance.
Exemple 1 Redondance alphabtique : E plus frquent que Z donc il faut donner E un mot
de code plus court. Un code uniforme (tous les caractres sont cods avec des mots de code de la
mme longueur) a plus de redondance quun code de taille variable, mme si il a son utilit.
Exemple 2 Redondance Contextuelle : aprs Q toujours U.
Exemple 3 Redondance Contextuelle dans images : plusieurs pixels tendent avoir la mme
couleur que leurs voisins.
Principe de Base de la Compression de Donnes : attibuer codes de
petite longueur vnements plus frquents et codes plus longs aux
vnements plus rares.
La compression de donnes est possible car souvent les donnes sont reprsentes de manire
redondante (P. ex. ASCII)
Cela explique aussi pourquoi un fichier dj compress ne peut pas tre compress ultrieurement : toute la redondance a t limine (ou presque). Sinon on pourrait continuer linfini.
Il y a un niveau dinformation "essentielle" au dessous de la quelle on ne peut pas descendre. Il
faudra parler de comment mesurer linformation.
La plupart des fichiers de donnes ne peuvent pas tre compresss
(en fait, tous ceux qui sont random, sans structure, sans regularit
et donc sans redondance).
1

CHAPITRE 2. GNRALITS

La plupart des fichiers de donnes ne peuvent pas tre compresss (en fait, tous ceux qui sont
random, sans structure, sans regularit et donc sans redondance ne peuvent pas ltre).
Si A, B files, A 6= B, C compress de A et D de B. Alors C 6= D sinon on ne pourrait pas
reconstruire.
Supposons que nous sommes satisfaits de compresser de 50% un fichier. Il y a 2n fichiers de
n bits que nous voudrions compresser en fichiers de n/2 bits ou moins. Il y a
N = 1 + 2 + 22 + . . . + 2n/2 = 2n/2+1 1
de tels fichiers. Donc seulement N des 2n fichiers peuvent tre efficacement compresss. Mais
N << 2n ! Si n = 100 seulement une fraction 249 1, 78 1035 des fichiers peuvent tre
compresss.
Si on change 50% avec 90%, cela ne change pas grand chose.
Il nexiste pas dalgorithme de compression universel et efficace.
Les mthodes doivent tre adaptes au type spcifique de donnes
(texte, images, son, ...)

2.2

Vocabulaire

Compresseur, encodeur, encoder : le programme qui compresse les donnes.


Dcompresseur, dcodeur, decoder : qui convertit dans le sens inverse.
Codec : lensemble des deux prcdents.
Mthodes de compression non-adaptatives : qui ne modifient pas les oprations effectues en focntion du type particulier de donnes compresser (P. ex. le fax) ;
Mthodes de compression adaptatives : examinent les donnes et en suite modifient
certains de leurs paramtres, oprations, etc en fonction des informations collectes sur les
donnes. Parfois ces mthodes arrivent faire cela avec une seule passe (une seule lecture
ou coute de la source) mais souvent elles ont besoin de deux passes. une pour avoir linfo
(stats) et lautre pour compresser. Dans ce cas elles sont dites semi-adaptatives.
Compression avec/sans perte : On a compression avec perte quand le fichier rsultant de
la dcompression nest pas identique loriginal qui avait t envoy (il y a eu perte dinformation). Cest le cas pour images, films, son. Si la perte dinfo est ptite, nous ne verrons
(ou entendrons) pas la diffrence. Au contraire, les fichiers texte peuvent devenir inutiles
si un seul bit est perdu ou modifi, il faut une compression sans perte (sauf exception, p.
ex. et dans un code peuvent tous tre ngligs).

Compression en cascade : Possible seulement avec compression sans perte sinon on ne


pourra peut-tre pas revenir en arrire.
Compression perceptive : Cela veut dire que le taux de compression choisi (mme localement, par endroits ou par moments) dpene de ce que nous sommes prts perdre comme
information sans que notre perception en soit affecte.

2.2. VOCABULAIRE

Compression symtrique : Encodeur et dcodeur utilisent le mme algorithme en directions opposes. Ils font donc "le mme travail". Dans le cas contraires, lun des deux doit
travailler davantage. Par exemple, dans un cas o lencodeur va stocker un fichier compress
dans une archive (opration effectue une fois) et le fichier sera ensuite tlcharg pour tre
dcompress par plusieurs utilisateurs (dcodeurs), on prfrera une mthode asymtrique
o la dcompression est moins complexe que la compression.
Performances de compression : Plusieurs grandeurs et quantits :
taille stream de output (compress)
taille stream de input (original)
Aussi dit bpb (bit per bit) parce quil exprime le nombre de bit ncssaires en moyenne
pour reprsenter dans le stream cod un bit du stream dorigine.
Pour les images on parle de bpp (bit per pixel).
Pour le texte on parle de bpc (bit par caractre).
Bitrate est un terme gnral pour bpb ou bpc.

- le rapport (ratio) de compression : =

- le facteur (factor) de compression : =


du prcdent)

taille stream de input (original)


(linverse
taille stream de output (compress)

taille stream de rfrence (original)


- le gain de compression : = 100 log
taille stream compress
o le strem de rfrence et soit le stream dorigine soit un stream obtenu par une mthode
sans perte.
Modles probabilistes : Le modle doit tre construit avant de pouvoir comprimer. Par
exemple on lit une fois, on compte les occurrences de chaque caractre, on calcule probabilits ensuite on encode la 2e passe.

CHAPITRE 2. GNRALITS

Chapitre 3

Techniques de base (mthodes


intuitives ou du pass
3.1

Brailles

Groupes de 3 2 points quivalents 6 bits, on peut donc reprsenter 26 = 64 symboles :


typiquement les lettres, chiffres, ponctuation et les strings les plus communes (P. ex en anglais
ound, ation, th). Compression limite (les livres en brailles sont trs voluminuex) mais
importante.

3.2

Compression de texte irreversible

Seulement pour cas trs spciaux quand jeter la poubelle de linformation reste acceptable.
On laissse simplement tomber de linfo (P. ex plusieurs
sont cods par un seul ou bien cas
extrme tous les caractres sauf les lettres et les sont limins et toutes les lettres majuscules
sont transformes en minuscules = 27 symboles en tout = 5 bits suffisent, plutt que les 8 de
ASCII. Le rapport de compression est donc 5/8 = 0, 625 mais il y a beaucoup de perte. Puisque
25 = 32, il reste mme 32 27 = 5 mots de code de longueur 5 utiliser pour codes les chanes
plus frquentes.

3.3

Compression de texte reversible ad hoc

Voici quelques ides quand la compression doit tre rversible.


texte avec beaucoup de parpills. On les limine et on ajoute une bitstring {0, 1} o
i-me lettre bitstring = 1 i-me lettre stream = .
voici un petit exemple devient voiciunpetitexemple + 000001001000001000000
On verra que ce dernier bitstring est facilement et fortement compressible.

ASCII est dhabitude sur 8 bit dont 1 pas ncessaire pour 128 = 27 symboles. Peut tre
compress en lcrivant sur 7(Packing). Rapport de compression 7/8 = 0, 875.
Un exemple qui peut tre appliqu en cas dalphabets de petite taille. Supposons 40 caractres (p. ex 26 lettres, 10 chifffres, , 3 symboles de ponctuation). Si on les regroupe par

CHAPITRE 3. TECHNIQUES DE BASE (MTHODES INTUITIVES OU DU PASS

triplets on 403 = 64000 triplets. Puisque 216 = 65536 > 403 , chaque triplet peut tre cod
avec 16 bits (2 octets). Sans compression, chacun des 40 caractres a besoin d1 octet (en
ASCII) donc chaque triplet fait 2 octets au lieu de 3. Rapport de compression 2/3 = 0, 666
(lun des rares cas o il est constant et connu).
Code Baudot (1880, tlgraphe) 5 bits (32 combinations) mais on reprsente plus de 32
symboles. Chaque quintuplet de bits code soit une lettre, soit une figure. Deux caractres
spciaux (meta-caractres ou caractres dchappement) permettant de passer dune reprsentation lautre. Au total 32 2 2 = 62 caractres. Pas trs sr, car il ny a pas de bit
de parit ou contrle (parler de la question de la correction derreur de transmission).
Codage de Dictionnaires (ou donnes stockes en ordre alphabtique). Deux mots adjacents
partagent souvent un prfixe commun (disons de longueur n), alors un mot peut tre
reprsent par le nombre n suivi du suffixe diffrent.
Mot du dictionnaire Mot cod
a
a
aardvark
1ardvark
aback
1back
abaft
3ft
abandon
3ndon
abandoning
7ing

3.4

Run Length Encoding (RLE)

Un run est une suite de valeurs toutes gales entre elles.


Principe : Si une donne d apparat n fois conscutives, alors remplacer d
. . d} par n d.
| .{z
n fois
Appliqu texte et image.

3.4.1

Compression de texte par RLE

La chane :
"attendre 2 secondes avant de passer"
devient
"a2tendre 2 secondes avant de pa2ser" (ambigu, pas de gain)
donc avec un meta-symbole @ :
"a@2tendre 2 secondes avant de pa@2ser" (pas ambigu, mais perte)
Donc il convient de remplacer seulement les occurrences de 3 rptitions, ou plus.
Exercice : Ecrire lalgorithme dun compresseur et dun dcompresseur RLE.
Problmes :
1. Dans les langages natures il existes beaucoup de doubles mais trs trs peu de triplets.
2. Si @ est un caractre du texte, un autre meta-caractre doit tre choisi
3. Si le compteur de rptitions est reprsent par un octet, il pourra compter au plus 255
rptitions.

3.4. RUN LENGTH ENCODING (RLE)

On peut calculer le facteur de compression dun RLE pour un stream de N caractres ayant
M rptitions de longueur moyenne L. Chaque rptition (run) est remplace par un triplet
(escape, compteur, donne) :
N
N
=
N (M L) + (3 M )
N M (L 3)
pour N = 1000, M = 10, L = 3 = facteur de compression = 1.01
pour N = 1000, M = 50, L = 10 = facteur de compression = 1.538

3.4.2

Variante 1

Pour alphabets de petite taille qui nutilisent pas tous les symboles disponibles (P. ex. lettres,
chiffres, caractres de ponctuation, par rapport tous les ASCII) : codage par digramme (couples
de lettres). On identifie les digrammes les plus communs et on les remplace par un caractre (les
codes non utiliss) de ceux qui napparaissent pas dans le texte (p. ex. en anglais "E ", " T",
"TH", " A".)

3.4.3

Variante 2

Substitution de motifs. Bon pour programmes (codes source) o certains mots (P. ex les mots
cl du langage de programmation) sont recourants = ces mots peuvent tre cods par un seul
caractre, ou bien par @ et un caractre. Par exemple si "a" correspond "print" alors "print(a)"
devient "@a(a)".

3.4.4

Relative Encoding

Suites de donnes (P. ex. numriques, comme une longue suite de tempratures releves
intervalles rguliers, ou une suite de strings qui ne diffrent pas beaucoup lune de lautre p.
ex. les lignes conscutives dun fax) qui ne diffrent pas beaucoup = on a intrt coder les
diffrences avec la donne prcdente. Si les diffrences deviennent trop importantes, alors on
peut envoyer la donne brute = il faut une flag (1 bit de plus) pour distinguer donns brutes
et diffrences. En gnral, quand on doit envoyer des flags, on attends den avoir 8 avant de
les envoyer pour quils forment un octet (le dcodeur devra attendre aprs 8 donnes (un octet
chacune, par exemple) de recevoir loctet de flags pour dcoder les 8 donnes prcdentes (codes
dlai born).
Une autre pratique : envoyer des couples doctets (16 bits) chaque couple est soit une valeur
absolue (dans [0, 216 1] = [0, 65535] ou dans [215 , 215 1] = [32768, 32767]), ou bien deux
diffrences sur huit bits chacune (donc dans [28 , 28 1] = [256, 255]). Pour chaque couple, un
flag est mis : 0 pour les valeurs absolues et 1 pour les diffrences. Aprs 16 couples doctets, on
envoie leurs 16 flags (un autre couple doctets).
Exemple 4 Par exemple :
valeurs
codes
flags

51110
51110
0

51115 51121
(5, 6)
1

51119
(2, 1)
1

8200
8200
0

8202 8205
(5, 6)
1

8207
(2, 1)
1

8206
(1, 1)
1

...
...
...

CHAPITRE 3. TECHNIQUES DE BASE (MTHODES INTUITIVES OU DU PASS

3.5

RLE pour images

Une image digitale est une ensemble de petits points dits pixels. Un pixel est reprsent soit
par un bit (pour images en N/B), soit par plusieurs bits (pour images niveaux de gris et en
couleur). Les pixels sont stocks dans un tableau en mmoire (bitmap), dhabitude ligne par
ligne.
Un pixels choisi au hasard a de grandes chances davoir la mme valeur (ou une valeur trs
proche) que ses voisins. On peut donc balayer limage ligne par ligne la recherche de runs.
Si une ligne commence par 17B, 1N, 55B, 31N, .... et si on prend la convention quune ligne
commence toujours avec un run de blancs (ventuellement de taille 0), seuls les 17, 1, 55, 31
doivent tre crit dans le compress. La rsolution de la bitmap (c.a.d. son nombre de colonne et
ventuellement de lignes) doit aussi tre insr au dbut de loutput. En connaissant le nombre
total de colonnes par ligne on ne doit pas envoyer le dernier run (on lobtient par diffrence).
La taille de limage compresse dpend de sa complexit. Mais dans le cas dune image
horizontalement connexe (1 seul morceau) le taux de compression est :
primtre
2 demi-primtre
=
.
nombre total de pixels de la figure
surface (en pixels)
RLE marche aussi pour des images plusieurs niveaux de gris. Chaque run de pixels est
cod toujours par le couple (longueur du run, valeur commune des pixels du run). La valeurs est
stocke sur plusieurs bits (4 8, selon le nombre de niveaux de gris)
Exemple 5 .
12, 12, 12, 12, 12, 12, 12, 12, 12, 35, 76, 112, 67, 87, 87, 87, 5, 5, 5, 5, 5, 5, 1
devient
9 , 12, 35, 76, 112, 67, 3 , 87, 6 , 5, 1
= compteurs.
Solutions pour distinguer compteurs et valeurs :
Si on nutilise que 128 niveaux de gris (ou moins), le bit restant de loctet peut tre utilis
pour signaler sil sagit dune valeur ou dun compteur.
Si on utilise 256 niveaux de gris on peut renoncer un (P. ex le niveau 255) qui sera utilis
comm flag signalant que le prochain octet est un compteur.
255, 9, 12, 35, 76, 112, 67, 255, 3, 87, 255, 6, 5, 1
On associe chaque nombre (valeur ou compteur) un flag (0 si valeur, 1 si compteur). Ces
flags sont associs par groupes de huit pour former un octet supplmentaire qui sera envoy
avant ou aprs les 8 donnes auxquelles il fait rfrence. On ajoute donc 1/8 la taille, qui
augmente de 12, 5%.
100000102 = 130, 9 , 12, 35, 76, 112, 67, 3 , 87, 100....., 6 , 5, 1
si on a m pixels tous diffrents entre eux (aucune rptition de valeurs), on les fait prcder
par m. Note : pour pouvoir reprsenter des nombres ngatifs on devra renoncer un
bit (de signe) pour les donnes. Si on a un octet disposition pour les donnes, il faudra
utiliser seulement 7 bits.

3.5. RLE POUR IMAGES

9, 12, 4, 35, 76, 112, 67, 3, 87, 6, 5, ?, 1, . . .


{z
}
|
4 valeurs

Si aprs le dernier 1 on a un autre 1, alors ? sera un compteur (longueur du run de


1), sinon il sera une valeur ngative m o m est le nombre de valeur diffrentes de la
prcdente que lon trouve partir de 1. Cas le pire :
p1 , p2 , p2 , p1 , p2 , p2 , p1 , p2 , p2 , . . .
devient
1, p1 , 2, p2 , 1, p1 , 2, p2 , 1, p1, 2, p2 , . . .
Expansion de 33% !

3.5.1

Remarques

.
Puisque un run na pas longueur 0, on peut envoyer l 1 au lieu de l
Pour images couleur, un pixel est stock sur 3 octets, le trois valeurs RGB (Rouge, Vert,
Bleu) comprises entre 0 et 255. On code sparment chaque suite relative une couleur .
(171, 85, 34)(172, 85, 35)(172, 85, 30)(173, 85, 33) . . .
se casse en trois :
(171, 172, 172, 173, . . .); (85, 85, 85, 85, . . .); (34, 35, 30, 33 . . .)
Comme pour niveaux de gris, RLE et relative encoding peuvent tre utiliss.
Il est prfrable de coder chaque ligne sparment, mme si cela fait briser des runs. P. ex. si
une ligne termine par 4 pixels de valeurs 87 et la suivante commence avec 9 pixels de valeur
87. IL convient de couper (4, 87), (9, 87) plutt que (13, 87). Mieux : (4, 87), eol, (9, 87).
(code spcial pour eol).
Raisons : Si chaque ligne est code individuellement, le dcodeur pourra dcoder les lignes
intervalles rguliers (p. ex par pas de 5 : la 1e , la 6e , la 11e , la 16e , . . . Ensuite la 2e , la 7e ,
la 12e , la 17e , . . .). Ainsi limage est construite graduellement sur lcran et on pourra plus
vite comprendre sa nature et dcider par exemple si terminer ou pas son tlchargement,
si la garder ou pas...
Aussi, si chaque ligne est code individuellement, il est plus facile extraire une partie de
limage (p. ex de la ligne l la ligne h) ou de fusionner deux images sans devoir les dcoder.
Dans ce cas, il faut un marquer de la fin de chaque ligne. De plus on fait prcder le fichier
compress avec un groupe de paquets de 4 octets (32 bits), un paquet de 4 octets pour
chaque ligne de limage. Le k-me paquet de 4 octets contient loffset (mesur en octets)
du dbut du fichier au dbut de la ligne k. Taille plus importante mais on gagne du temps.

CHAPITRE 3. TECHNIQUES DE BASE (MTHODES INTUITIVES OU DU PASS

10

3.5.2

Dsavantages de la mthode RLE pour images.

Si limage est modifie, les longueurs des runs doivent tre recalcules entirement.
RLE peut produir des fichiers plus gros (expansion). P. ex. une iages de lignes noires
verticales sur fond blanc qui serait scannerise horizontalement. Idalement, un compresseur
RLE devrait scanneriser une image horizontalement, verticalement et en diagonal et choisir
le meilleur.
EXO 1.2. Page 29.

3.5.3

Mthode de compression dimages avec perte

On amliore le taux de compression en ignorant les runs trop courts. La perte peut (ou pas)
tre acceptable (p.ex ; non adapt pour imagerie mdicale) On demande lutilisateur la longueur
maximale des runs ignorer (p. ex ; 3). Le programme fusionne tous les runs de longueur 1,2, ou
3 avec leurs voisins.

3.5.4

Une autre application : Images BMP

Si un pixel est reprsente par p bits on dit que limages possde p bitplans. Le k-me bitplan
est la suite de tous les k-mes bits.
Pour images 1, 2, 4, 8, 16, 24 bitplans (ces dernires sont les images couleurs).
Format (simplifi) :
En tte du fichier : 2 octets BM, et la taille du fichier.
En tte de limage : largeur, hauteur, nombre de bitplans.
Palette de couleurs (3 formats possibles, pas prsents ici).
Les pixels (soit en format brut, ou bien compacts par RLE).
Supposons 8 bitplans (un pixel = 8 bits = 1 octet = 1 un hexadcimal 2 chiffres).
Le fichier compress est organis par couple doctets (couples dhexadcimaux 2 chiffres). En
gnral, dans chaque couple (C16 , P16 ), le 1er octet est un compteur et le second une valeur de
pixel P .
P. ex. : 0416 , 0216 est le compress de 0216 , 0216 , 0216 , 0216 .
Toutefois, si C = 0016 , alors la smantique du couple (0016 , P )dpend du caractre P aprs
le 0016 :
Si P = 0016 , le dcodeur interprte le couple (0016 , 0016 ) comme end of line (et remplit
le restant de la ligne de 0).
Si P = 0116 , le dcodeur interprte le couple (0016 , 0116 ) comme end of image (le reste
de limage est rempli de 0).
Si P = 0216 , le dcodeur interprte le couple (0016 , 0216 ) comme linformation que ce qui
suit est un run de 0s qui dpasse la fin de la ligne courante, et il faut donc effectuer un saut
une autre position de limage plus en bas pour trouver le prochain pixel non nul. Dans
ce cas, le couple doctets qui suivent dit de combien de colonnes droite et de combien de
lignes vers le bas se trouve le prochain pixel non nul (par rapport au dernier pixel non nul).
Si P = k > 0216 , le dcodeur interprte le couple (0016 , k16 ) comme le fait que les k octets
qui suivent sont des donnes brutes (utilis pour les suites de caractres tous diffrents).
P. ex dans le cas dune image 4 8 avec 8 bitplans.
0416 , 0216 , 0016 , 0416 , a35b124716, 0116 , f 516 , 0216 , e716 , 0016 , 0216 , 000116,
0116 , 9916 , 0316 , c116 , 0016 , 0016 , 0016 , 0416 , 08926bd716, 0016 , 0116
est le code de limage :

3.6. CODAGE MOVE-TO-FRONT (MTF)

11

02 02 02 02 a3
f 5 e7 e7 00 00
00 00 99 c1 c1
08 92 6b d7 00

3.6

5b
00
c1
00

12
00
00
00

47
00
00
00

Codage Move-to-Front (MTF)

Premier exemple de code adaptatif (cad, qui modifie le codage bas sur des proprits du
texte coder.
Ide de base : Lalphabet des symboles est maintenu comme une liste ordonne. Le 1er symbole de la liste est cod par 0, le 2e par 1, le 3e par 2, etc. Lordre de cette liste est modifi en
cours de codage. chaque fois quon traite (cad, quon code pour lencodeur, quon dcode
pour le dcodeur) un symbole, on le dplace en dbut de liste (son code devient donc 0) alors
que tous les autres symboles sont dcals.
P.ex. Alphabet initial (liste) : A = {a, b, c, d, m, n, o, p}, code initiaux :
symbole
code

a b
0 1

c
2

d m
3 4

n o
5 6

p
7

Soit le stream abcddcbamnoppnnm. Sans move to front (liste fixe et donc codage fixe)
symbole coder
a
b
c
d
d
c
b
a
m
n
o
p
p
o
n
m

sans MTF
liste (fixe)
code
a, b, c, d, m, n, o, p
0
a, b, c, d, m, n, o, p
1
a, b, c, d, m, n, o, p
2
a, b, c, d, m, n, o, p
3
a, b, c, d, m, n, o, p
3
a, b, c, d, m, n, o, p
2
a, b, c, d, m, n, o, p
1
a, b, c, d, m, n, o, p
0
a, b, c, d, m, n, o, p
4
a, b, c, d, m, n, o, p
5
a, b, c, d, m, n, o, p
6
a, b, c, d, m, n, o, p
7
a, b, c, d, m, n, o, p
7
a, b, c, d, m, n, o, p
6
a, b, c, d, m, n, o, p
5
a, b, c, d, m, n, o, p
4

avec MTF
liste (variable) code
a, b, c, d, m, n, o, p
0
a, b, c, d, m, n, o, p
1
b, a, c, d, m, n, o, p
2
c, b, a, d, m, n, o, p
3
d, c, b, a, m, n, o, p
0
d, c, b, a, m, n, o, p
1
c, d, b, a, m, n, o, p
2
b, d, c, a, m, n, o, p
3
a, b, c, d, m, n, o, p
4
m, a, b, c, d, n, o, p
5
n, m, a, b, c, d, o, p
6
o, n, m, a, b, c, d, p
7
p, o, n, m, a, b, c, d
0
p, o, n, m, a, b, c, d
1
o, p, n, m, a, b, c, d
2
n, o, p, m, a, b, c, d
3

Note : la moyenne des codes sans MTF est 3.5 alors que avec MTF est 2.5 (on a utilis des
plus petits nombres).
Mais cela ne marche pas toujours. Essayer avec abcdmnopabcdmnop. La moyenne augmente
avec MTF.
MTF marche bien dans lhypothse que si un symbole s a t rencontr, alors il sera rencontr
frquemment au moins pour un moment. Autrement dit, le stream prsente des concentrations

12

CHAPITRE 3. TECHNIQUES DE BASE (MTHODES INTUITIVES OU DU PASS

de symboles identiques dans des rgions du stream (on appelle cela proprit de concentration).
Le stream du premier exemple satisfait cette proprit, le second non.
En gnral, les performances de MTF sont lgrement pire que celles du codage de Huffman
dans le pire des cas et bien meilleures dans le meilleur cas.

3.6.1

De lintrt manipuler des valeurs plus petites

Une fois transformes les donnes numriques en valeurs plus petites (comme le fait relative
encoding) les nombres valeurs plus petites apparatront plus frquemment dans le stream cod,
on peut donc ensuite coder ces donnes plus petites avec des codes longueur variable o aux
nombres plus petits sont affects des codes plus courts, tandis quaux nombres plus grands sont
affect des codes plus courts (aprs avoir limin la redondance contextuelle on sattaque la
redondance alphabtique). Il y a plusieurs manires de raliser cela :
Assigner des codes dHuffman (ce sera vu plus tard) aux entiers dans [0, n] de manire que
les entiers plus petit aient des codes plus courts. P ex 0 0, 1 10, 2 110, 3 1110,
4 11110, 5 111110, 6 1111110, 7 1111111
Coder un entier i 1 par son code binaire prcd de log2 i zros.
i
1
2
3
4
5
6
7
8
9
..
.

Code
1
010
011
00100
00101
00110
00111
0001000
0001001
..
.

15 0001111
16 000010000

3.6.2

Taille
1
3
3
5
5
5
5
7
7
..
.
7
9

Variantes de MTF

Avance-de-k.
Le symbole lu nest pas mis au dbut de lista mais avanc de k positions (le paramtre k
peut tre choisi par lutilisateur). En gnral cela rduit les performances (moyenne de codes plus
leve) pour des streams qui satisfont la proprit de concentration, mais les amliore pour les
autres. Si k = n (taille de lalphabet), on retrouve MTF classic. Si k = 1 on change simplement
le symbole avec son prdcesseur dans la liste.
Attend-c-et-bouge.
Un symbole et dplac au dbut de la liste seulement aprs lavoir rencontr c fois (non
ncessairement conscutives). Il faut un compteur par symbole. Utile si le rarrangement de A
est couteux.

3.7. QUANTIZATION NUMRIQUE (NUMERICAL QUANTISATION)

13

MTF appliqu aux mots.


Normalement un symbole est un caractre (un octet). Mais si le stream contient du texte, on
peut traiter chaque mot comme un symbole. On considre un mot toute chane de caractres
comprise entre deux espaces ou entre un espace et le symbole de fin de stream (pour simplicit,
on suppose que le stream contient que des lettres minuscules, lespace et le caractre de fin de
stream). Puisque on peut rencontrer nimporte quel mot, lalphabet A nest pas fix au dbut. En
fait, au dbut lalphabet est vide, et on y ajoute des mots au fur et mesure quil sont rencontrs
et traits.
Exemple 6 Soit le stream theboyonmyrightistherightboy.
Premier mot : the. Pas encore dans A donc on lajoute A. On met le mot the (brut)
prcd du nombre de symboles qui le prcdent dans lalphabet prsent, qui est 0. Le dcodeur
commence aussi avec un alphabet vide. Quand il recoit 0 il sait quil doit prendre le premier
mot de A, mais puisque A est vide, il sait que 0 sera suivi dun mot brut quil faudra ajouter
lalphabet.
Deuxime mot : boy. Pas encore dans A donc on lajoute A qui devient {the, boy}. On
met le mot boy (brut) prcd du nombre de symboles qui le prcdent dans lalphabet prsent,
qui est 1. PUIS, on avance le mot quon vient de coder en tte de liste : A = {boy, the}. Le
dcodeur reoit un 1, il devrait donc prendre le 2e mot de lalphabet, mais celui-ci na quun
symbole ( the) en ce moment, donc il sait quil va recevoir un mot brut quil devra ajouter (en
tte !) son alphabet.
On continue selon la table (pour lencodeur) :
Mot
Alphabet (avant MAJ)
Code
Alphabet (aprs MAJ)
the
{}
0the
{the}
boy
{the}
1boy
{boy, the}
on
{boy, the}
2on
{on, boy, the}
my
{on, boy, the}
3my
{my, on, boy, the}
right
{my, on, boy, the}
4right
{right, my, on, boy, the}
is
{right, my, on, boy, the}
5is
{is, right, my, on, boy, the}
the
{is, right, my, on, boy, the}
5
{the, is, right, my, on, boy}
right {the, is, right, my, on, boy}
2
{right, the, is, my, on, boy}
boy
{right, the, is, my, on, boy}
5
{boy, right, the, is, my, on}

3.7

Quantization Numrique (Numerical Quantisation)

14

CHAPITRE 3. TECHNIQUES DE BASE (MTHODES INTUITIVES OU DU PASS

Chapitre 4

Mthodes Statistiques (Codes


taille variables)
4.1

Introduction
Principe : codes plus courts pour symboles plus frquents.

Deux problmes rsoudre :


1. Choisir des mots qui forment un vrai code, cad qui peuvent tre dcods sans ambiguit
(P. ex. {0, 10, 01} nest pas un code, 010 a deux dcodages possibles).
2. Choisir des codes avec taille (longueur des mots de code) moyenne la plus petite possible.

4.2

Quelques Concepts de Thorie de lInformation

Quest ce que linformation ? Comment peut-on la mesurer ?


La Thorie de lInformation soccupe prcisment de rpondre la demande : "Combien dinformation est contenue dans une donne" ? Base sur lobservation que linfo contenue dans une
donne est quivalente la quantit de "surprise" contenue dans le message quelle convoie.
Exemple 1. Le rsultat de lopration de lancer une pice de monnaie peut tre exprime par
P/F ou O/N ou 0/1. Le nombre minimal de questions ( rponse binaire) poser pour deviner
le rsultat est 1. Autrement dit, 1 bit dinformation suffit pour rsoudre lincertitude.
Exemple 2. Deviner une carte parmi 64 numrotes de 1 64. Le nombre minimal de question poser ( rponse oui/non) pour deviner le rsultat en tout cas est 6 = log2 64. Autrement
dit, 6 = log2 64 bits dinformation suffisent toujours pour rsoudre lincertitude.
Exemple 3. (Autre approche de la mme question) Quelle information faut il donner pour
identifier un nombre entier N 0 ? Rponse : les chiffres qui le composent qui sont en nombre
de logb N , o b est la base choisie. Linfo contenue dans le nombre N est proportionnelle au
nombre de chiffres de N = logb N .
Le logarithme est la fonction mathmatique qui quantifie linfo.
15

CHAPITRE 4. MTHODES STATISTIQUES (CODES TAILLE VARIABLES)

16

4.2.1

Relation entre information et probabilit.

On a dj observ que la quantit dinformation relie un vnement est dautant plu grande
que la quantit de "surprise" apporte par lvnement est rande. Autrement dit, la quantit dinformation I est dautant plus grande que la probabilit P que lvnement se ralise est petite.
Les Exemples 1 et 2 prcdents mettent en vidence cette relation entre information et probabilit dans le cas dvnements quiprobables (tels que le rsultat du lancement dune pice
ou de lextraction dune carte parmi 64).
Dans lExemple 1, le rsultat du lancement dune pice porte une information de 1 bit alors
que la probabilit quelle se ralise est P = 1/2. On a 1 = log2 (2) = log2 (1/2).
Dans lExemple 2, le rsultat de lextraction dune carte parmi 64 cartes numrotes, porte
une information de 6 bit alors que la probabilit quelle se ralise est P = 1/64 = 1/26 . On a
6 = log2 (26 ) = log2 (1/26 ).
Dans le cas dun vnements parmi plusieurs quiprobables quiprobables on a en effet
I = log2 (P )
Que se passe-t-il en cas dune suite dvenements ayant en principe probabilits diffrentes ?
Exemple 4. On a vu que pour gagner toujours un jeu o il faut deviner correctement un
nombre entre 1 et n il nous faut I = log2 (n) bits dinformation.
Soit un jeu qui consiste deviner deux bons numros en suite, dabord lun compris entre
1 et n et ensuite un autre, compris entre 1 et m. Ce jeu est quivalent celui o il faudrait
deviner correctement un couple de bons numros, lun compris entre 1 et n et lautre compris
entre 1 et m. Dans ce jeu, il y a au total nm possibilits quiprobables (P = 1/nm). Pour deviner
correctement la combinaison gagnante il faut, comme attendu
I = log2 (P ) = log2 (nm)
bits dinformation (la mme quantit dinformation que pour deviner un nombre compris entre
1 et nm, puisque chaque couple peut tre numrote avec les nombres de 1 nm et donc on
revient lexemple 3.). Or, pour les proprits du log :
log2 (nm) = log2 (n) + log2 (m),
donc, la quantit dinformation ncessaire pour deviner dabord un bon numro compris entre
1 et n et lautre compris entre 1 et m (la quantit dinformation contenue dans une suite dvnements) est bien la somme des quantits dinformation des vnements pris individuellement.
Cest la fonction logarithme quon doit cette proprit dadditivit.

4.2.2

Notion dEntropie

Considrons une source (metteur). Dans la pratique, un vrai metteur envoie donnes binaires (0 ou 1). Mais pour la gnralit, supposons quil envoie streams composes de n symboles
{a1 , a2 , . . . , an }. Chaque symbole peut tre vu comme un chiffre dun systme base n, cest
dire un entier plus petit ou gal n, qui peut tre identifie par log2 n bits.

4.2. QUELQUES CONCEPTS DE THORIE DE LINFORMATION

17

Supposons que lmetteur envoie s symboles par unit de temps (P. ex. 28800 bits par seconde,
1 bit par seconde = 1 baud). Linformation envoye est donc H = s log2 n.
H = s log2 n est la quantit dinfo (mesure en bits) envoye dans une unit de temps.
Soient donnes les probabilits Pi (pour i = 1, 2..., n) dapparition des symboles ai .
Dans le cas particulier o tous les Pi sont gaux (Pi = P pour tout i) on a 1 =
et donc n = 1/P . On a donc
H = s log2 (1/P ) = s log2 P

Pn

i=1

Pi = nP

.
Par contre, dans le cas gnral, si une fraction Pi des s symboles mis dans une unit de
temps est ai , alors la contribution lentropie par ces sPi symboles est sPi log2 Pi . On a
H = s

n
X

Pi log2 Pi

i=1

info (mesure en bits) envoye dans 1 unit temps.


On appelle Entropie E de la source, la quantit (moyenne) dinfo envoye par symbole mis.
On a E = H/s (il faut 1/s temps pour envoyer un symbole), soit :
E=

n
X

Pi log2 Pi

i=1

entropie des donnes transmises.


Par analogie, Pi log2 Pi est lentropie de ai . Cest le nombre minimal de bits ncessaires
pour reprsenter le symbole.
Cette entropie informatique a la mme grandeur dimensionnelle que lentropie introduite en
thermodynamique (et qui mesure le dsordre).
Lentropie dune source est maximale quand les probabilits sont toutes gales (cas de fichier
totalement random, o le dsordre est maximal).
Par exemple, si une source met le symbole a1 avec une probabilit p et le symbole a2 avec
une probabilit 1 p, lentropie de cette source est :
E = p log

1
1
(1 p) log
p
1p

Comme fonction de p, E tend vers 0 si p tend vers 0 ou 1, elle a son seul maximum pour
p = 1/2 (symboles quiprobables) o elle vaut
1
1 1
1
1
log log = log = 1
2
2 2
2
2
La figure suivante montre le graphe de la fonction E(p) dans ce cas.

18

CHAPITRE 4. MTHODES STATISTIQUES (CODES TAILLE VARIABLES)


E

0,5

Le stream mis dune source dentropie maximale (quand les symboles sont tous quiprobables) est compltement random et donc na aucune redondance. Sinon, la redondance R est
dfinie comme la diffrence entre lentropie maximale de la source et la vraie entropie :
R=

4.2.3

n
X
1
1
log

n
n
i=1

n
X
i=1

Pi log Pi

= log n

n
X
i=1

Pi log Pi

Codes taille variable

Soient quatre symboles a1 , a2 , a3 , a4 qui apparaissent avec la mme frquence 0.25.


Entropie est : 4 (0.25 log 0.25) = 4 (0.25 (2)) = 2. Le plus petit nombre de bits ncessaires
(en moyenne) pour reprsenter les symboles est 2. (P. ex. par le code taille fixe : 00, 01, 10, 11).
La redondance du stream est 0, on ne peut pas compresser davantage.
Soit maintenant p1 = 0.49, p2 = p3 = 0.25, p4 = 0.01. Entropie 1.57. Le plus petit nombre de
bits ncessaires (en moyenne) pour reprsenter les symboles est 1.57.
Avec le code prcdent 00, 01, 10, 11 on a une redondance de 0.43, donc un code de longueur
variable peut faire peut-tre mieux.
Par exemple : a1 = 1, a2 = 01, a3 = 010, a4 = 001.
Longueur moyenne : 1 0.49 + 2 0.25 + 3 0.25 + 3 0.01 = 1.77 (ceci est vrai pour de longs
messages, alors que pour petits messages on peut sloigner beaucoup de la moyenne).
Mais ce nest pas un code ! : 01001 = 01|001 = 010|01 = a3 a2 = a2 a4
Mieux, le suivant : a1 = 1, a2 = 01, a3 = 010, a4 = 001.
Cet ensemble est bien un code car il a la proprit prfixe (aucun mot nest prfixe dun autre).
Un ensemble avec la proprit prfixe est toujours un code.
Un code prfixe est un code longueur variable avec la proprit prfixe.

4.3. MTHODE DE SHANNON-FANO

19

Il nous faut donc des algorithmes pour trouver des codes de taille moyenne minimale en
fonction des frquences (probabilits) des symboles de lalphabet.

4.3

Mthode de Shannon-Fano

On applique lalgorithme suivant :


Ordonner les symboles par frquences dcroissantes ;
Partager les symboles en deux sous-ensembles de sorte que les deux sommes des frquences
des symboles dans les deux sous-ensembles soient le plus proches possible ;
Ajouter un 0 aux mots de code des symboles du premier ensemble et 1 aux mots de code
des symboles du second ensemble ;
Continuer rcursivement partages les sous-ensembles jusqu ce quils contiennent un seul
symbole.
Voici un exemple (le symbole _ indique o lon fait les partages).
Symbole
0.25
0.20
0.15
0.15
0.10
0.10
0.05

1
_ 1
0
0
0
0
0

Construction
_ 1
0
1 _ 1
_ 1
0
0 _ 1
0
0 _
0
0

Code
11
10
011
010
001
1 0001
0 0000

Note. La longueur moyenne de ce code (pondre par les probabilits) est 2.7 alors que lentropie est 2.67, on est donc trs proche de la longueur minimale.
Exercice. Excuter le premier partage entre le troisime et le quatrime symbole et montrer
que le code obtenu est moins bon.
Les partages "parfaits" (ce qui est possible si les probabilits sont des puissances ngatives
de 2) donnent les meilleurs codes. Par exemple :
Symbole
0.25
0.25
0.125
0.125
0.125
0.125

Construction
1 _ 1
_ 1
0
0
1 _
0 _ 1
0
0 _
0
0

1
0
1
0

Code
11
10
011
010
001
000

Longueur moyenne 2.5, entropie 2.5. Code optimal.

4.4

Mthode de Huffman

Cest la base de beaucoup de logiciels de compressions sur les PC, soit utilis comme seule
mthode de compression, soit comme une tape dun processus de compression en cascade.

20

CHAPITRE 4. MTHODES STATISTIQUES (CODES TAILLE VARIABLES)

Gnralement, donne des meilleurs rsultats que la mthode de Shannon-Fano et comme


celui-ci donne les meilleurs rsultats quand les probabilits sont des puissances (ngatives) de 2.
Cependant, on peut dmontrer que la mthode de Huffman produit toujours le code optimal (ce
qui nest pas vrai pour Shannon-Fano)
Diffrence avec Shannon-Fano, les mots de code sont produits de droite gauche.
Voici lalgo (qui construit un arbre)
Ordonner les symboles de A = {a1 , . . . , an } par frquences (probabilits) dcroissantes ;
E A ;
Tant que il y a plus dun symbole dans E faire
Choisir deux symboles aI , aJ E (o I et J sont deux sous-ensembles de {1, . . . , n})
ayant les deux plus petites probabilits ;
Construire larbre de racine aIJ ayant comme fils aI et aJ ;
E E {aI , aJ } {aIJ } ;
P roba(aIJ ) P roba(aI ) + P roba(aJ ) ;
Fin Tant que
On obtient un arbre binaire dont les feuilles sont tiquetes par les symboles de lalphabet.
Le mot de code de chaque symbole est obtenu en parcourant le chemin de la racine la feuille
correspondante au symbole et en ajoutant un 0 chaque fois quon se dplace vers un fils gauche
et un 1 chaque fois quon se dplace vers un fils droit.
Exemple
0.4

a1

0.2

a2

1 a12345
0.2

a3

0.1

a4

0.6
0.4

0.2
0.1

a345

a45

a5

On obtient
Symbole
a1
a2
a3
a4
a5

Code
0
10
110
1110
1111

a2345

4.4. MTHODE DE HUFFMAN

21

Toutefois, lalgorithme pourrait aussi produire un autre arbre


0.4

a1

0.2

a2
0.4

0.2

a23

1 a12345

a3
0.6 a145

0.1

a4
0.2

0.1

a45

a5

Correspondant au code
Symbole
a1
a2
a3
a4
a5

Code
10
00
01
110
111

Calculons les deux longueurs moyennes. Pour le premier code :


M1 = 0.4 1 + 0.2 2 + 0.2 3 + 0.1 4 + 0.1 4 = 2.2 bits/symbole
Pour le second :
M2 = 0.4 2 + 0.2 2 + 0.2 3 + 0.1 3 + 0.1 3 = 2.2 bits/symbole
soit la mme valeur.
Quand on choisit arbitrairement les deux symboles de probabilit minimale quil faut combiner, on peut obtenir des arbres diffrents mais la longueur moyenne rsultera la mme.
Lequel des deux codes est prfrable ? Celui avec la plus petite variance (ou dviation).
P
Dfinition 1 Soit une suite de valeurs x1 , . . . , xn de moyenne M = n1 ni=1 xi , la variance de
la suite est :
n
1X
(xi M )2
V :=
n i=1

Pour P
une suite pondre par les probabilits p1 , . . . , pn , o la moyenne pondre est dfinie comme
n
M = i=1 pi xi , la variance sest dfinit comme suit :
V :=

n
X
i=1

pi (xi M )2

CHAPITRE 4. MTHODES STATISTIQUES (CODES TAILLE VARIABLES)

22

Calculons les deux variances. Pour le premier code :


V1 := 0.4 (1 2.2)2 + 0.2 (2 2.2)2 + 0.2 (3 2.2)2 + 2 0.1 (4 2.2)2 = 1.36
pour le deuxime :
V2 := 0.4 (2 2.2)2 + 0.2 (2 2.2)2 + 0.2 (2 2.2)2 + 2 0.1 (3 2.2)2 = 0.16
Rgle pour obtenir celui avec la plus petite variance : sil existent plus que deux symboles
ayant probabilit minimale, choisir les deux tels que la diffrence de hauteur est minimale. Ceci
garantit que larbre obtenu est plus quilibr et revient choisir les deux symboles les plus anciens
(en ordre de cration) parmi ceux ayant probabilit minimale. Ceci peut tre facilement gr en
implmentant lensemble E laide dun tas-min, o les symboles sont rangs par rapport leur
frquence.
Lintrt davoir des codes de variance minimale est que lon peut utiliser des tampons de
taille infrieure et que les temps de dcodage de chaque symbole sont plus proches (important
pour applications on-line).
Note. Si les symboles ont la mme proba, alors la mthode de Huffman ne compresse pas
les donnes (le texte est random et donc ne peut pas tre compress). Il y a bien sr des cas
spciaux o, tout en gardant la mme probas, les symboles sont disposs avec un certaine rgularit, P. ex. a1 . . . a1 a2 . . . a2 a3 . . . a3 . . ., qui peut tre compress par RLE mais pas par Huffman.
Note. Huffman ne peut pas tre appliqu alphabets de taille 2 (p.ex images en N/B). On
pourrait combiner paquets de bits (4, 8, ...) et les considrer un nouvel alphabet (de taille 16,
256, ...), mais on pourrait perdre certaines rgularits, notamment celles dues au fait quun pixel
est probablement de la mme couleur que ses voisins. P. ex. 00011100|00000110 a un run de 0 de
longueur sept, qui serait cass si on regroupe par paquets de 8 bits.
Dcodage
Lencodeur construit donc larbre sur la base des frquences (entires) ou des probas (relles)
et ensuite il commence coder en utilisant les mots de code ainsi obtenus.
Le dcodeur doit connatre les mots de code ou avoir le mme arbre qua construit lencodeur
pour pouvoir effectuer le dcodage. Ou, au moins, il doit disposer de la mme information qui a
servi lencodeur pour le construire.
En tout cas, lencodeur doit faire prcder le stream compress par un "en tte" contenant :
soit des couples (symboles, codes) dans un format qui devra tre dtermin par protocole ;
soit larbre, dans un format dtermin par protocole ;
soit les frquences (ou les probas, qui peuvent tre rendues entires par normalisation),
par lesquelles on peut construire larbre (certaines rgles devraient tre alors dcides par
protocole pour assurer que encodeur et dcodeur construisent le mme arbre, p. ex. lequel
de deux fils prend 0 et lequel le 1).
Si le dcodeur dispose de larbre, lalgorithme de dcodage dvient extrmement simple. En
commenant la racine de larbre, pour chaque bit lu du stream cod, il parcourra les branches
de larbre pour dcoder un symbole chaque fois quune feuille est atteinte, avant de revenir
a racine. Il sagit en fait dun simple transducteur ptales.

4.4. MTHODE DE HUFFMAN

23

Proprit pour calculer la longueur moyenne dun code dHuffman


0.55 a1

0.25 a2
1 a12345

0.15 a3

0.45 a2345
0.2 a345

0.03 a4
0.05 a45
0.02 a5

On calcule la longueur moyenne :


M = 0.55 1 + 0.25 2 + 0.15 3 + 0.03 4 + 0.02 4 = 1.7
Mais aussi
1.7 = 1 + 0.45 + 0.2 + 0.05
Ceci est toujours vrai. La longueur moyenne dun code peut aussi tre calcule en additionnant
les probabilits de tous les nuds internes de larbre de Huffman.

4.4.1

Codes dHuffman canoniques

Soit lexemple de la figure 4.1.


Lalgo construit le code :
a
b
c
d
e
f

000
001
100
101
01
11

Toutefois, il existe dautres codes ayant la mme longueur moyenne (et donc aussi codes dHuffman). Notamment, tous les codes prfixes qui assignent des mots de code de longueur 3 a, b, c, d
et des mots de code de longueur 2 e et f sont aussi des codes dHuffman (et donc optimaux).
Pour le cas de cet exemple, nous voulons calculer le nombre de tels codes. On note que les
mots de code peuvent tre partags en quatre classes, selon le prfixe de longueur deux par lequel
ils commencent. Le quatre classes sont :
{00x | x {0, 1}},

{10y | y {0, 1}},

{01},

{11}

Or, tous les codes quon obtient en permutant arbitrairement ces quatre prfixes seront des
codes de Huffman aussi. Il y a 4! = 24 de telles permutations. De plus, pour chaque permutation

24

CHAPITRE 4. MTHODES STATISTIQUES (CODES TAILLE VARIABLES)


0.11

a
0.23

0.12

b
0.47

0.13

1
0.27

0.14

d
0.53

0.24

0.26

Fig. 4.1 Un exemple pour la construction dun code dHuffman canonique


possible, on peut construire quatre codes de Huffman diffrent en choisissant les valeur de x et
y. Il y a donc au total 4 24 = 96 de tels codes dHuffman.
Considrons en particulier le code que lon obtient par la permutation
00 00;

10 01;

01 10;

11 10;

et en choisissant x = 0 pour a et y = 0 pour c.


a
b
c
d
e
f

000
001
010
011
10
11

Ce code est intressant puisque il assigne aux symboles a, b, c, d quatre mots (sur trois bits)
reprsentant en binaire les entiers conscutifs 0, 1, 2, 3 alors quil assigne aux symboles e, f deux
mots (sur deux bits) reprsentant les entiers conscutifs 2, 3. Ce code est videmment aussi un
code de Huffman, et pourtant lalgorithme de Huffman donn ne pourra jamais le produire. En
effet, on constate que si un code a t produit par lalgo, alors e et f seront toujours combins en
dernier (ils se trouveront lun dans le sous arbre droit de la racine et lautre dans le sous arbre
gauche) et donc leurs mots de code ne pourront jamais commencer par le mme caractre (ici, 1).
On va montrer pourtant quun tel code de Huffman choisissant pour toute longueur l des mots
de code (sur lbits) reprsentant des entiers conscutifs est toujours possible et facile construire.
Un tel code est dit code de Huffman canonique. Comme on va le voir, lintrt dutiliser des

4.4. MTHODE DE HUFFMAN

25

codes canoniques est quils peuvent tre construits trs facilement par le dcodeur, sans besoin
que celui-ci connaisse ni les probabilits, ni larbre. Il suffit quil connaisse pour toute longueur
l combien de symboles ont t cods par un mot de longueur l. Voyons cela avec un exemple.
Supposons que lencodeur execute lalgorighme pour calculer un code dHuffman et supposons
quil dcouvre ainsi que lalgo affecte
- 6 symboles, des mots de longueurs 7
- 3 symboles, des mots de longueurs 6
- 4 symboles, des mots de longueurs 5
- 4 symboles, des mots de longueurs 3
Il veut alors changer le codage (pour un autre code dHuffman et notamment le code dHuffman canonique) de sorte que les nl symboles cods par des mots de longueurs l soient cods par
des mots (toujours sur l bits) reprsentant nl entiers conscutifs. Autrement dit, pour un entier
premier(l) opportunment choisi, ces nl symboles seront cods par les entiers
premier(l), premier(l) + 1, premier(l) + 2, . . . , premier(l) + nl 1.
Il sagit donc simplement de dterminer pour tout l, lentier premier(l) de manire obtenir
un code prfixe.
On considre les longueurs en ordre dcroissant (7, 6, 5, (4), 3). Pour la longueur maximale
lmax (ici lmax = 7), on choisit toujours premier(lmax ) = 0. Le code canonique alors assigne aux
six symboles le moins frquents les mots sur 7 bits :
0000000
0000001
0000010
0000011
0000100
0000101
Il faut maintenant dterminer premier(6), de manire ce que les 3 mots de longueur 6 reprsentant premier(6), premier(6) + 1 et premier(6) + 2 ne soient pas prfixes des mots de code
dj prsents.
Pour cela, il suffit de choisir pour premier(6) un entier m tel que 2 m (c-a-d, m shift dun
bit vers la gauche avec lajout dun 0) soit plus grand que 0000101 = 101 = 5 = 0 + 6 1 =
7
= 6/2 = 3. Le
premier(7) + n7 1. On peut simplement choisir premier(6) = premier(7)+n
2
code canonique alors assigne aux trois symboles suivants les mots sur 6 bits :
000011
000100
000101
Noter quaucun de ces mots nest prfixe des mots de longueur 7 dj dans le code.
De manire analogue on dtermine


premier(6) + n6
premier(5) =
2


3+3
=
= 6/2 = 3.
2

CHAPITRE 4. MTHODES STATISTIQUES (CODES TAILLE VARIABLES)

26

Le code canonique alors assigne aux quatre symboles suivants les mots sur 5 bits :
00011
00100
00101
00110
Noter quaucun de ces mots nest prfixe des mots de longueur 6 et 7 dj dans le code.
Mme si aucun symbole nest cod par des mots de longueur 4, on doit calculer premier(4)
car sa valeur est ncessaire pour calculer premier(3). On a
 


3+4
premier(5) + n5
=
= 7/2 = 4
premier(4) =
2
2
et
premier(3) =

premier(4) + n4
2


4+0
= 4/2 = 2.
2

Le code canonique alors assigne aux quatre derniers symboles suivants les mots sur 3 bits :
010
011
100
101
Lencodeur va alors coder les symboles (tris par frquence croissante) par les mots
0000000
0000001
0000010
0000011
0000100
0000101
000011
000100
000101

00011
00100
00101
00110
010
011
100
101

Le dcodeur utilisera le mme code. Toutefois pour que le dcodeur puisse le reconstruire il
suffit quil connaissent uniquement :
- les symboles de lalphabet tris par ordre de frquences croissantes (dans un format accord
par protocle, p. ex ; en ASCII)
- pour toute longueur l, le nombre de symboles cods par des mots longueur l.
Ces informations lui suffisent reconstruire le code canonique par lalgorithme :
Premier[lmax]=0 ;
Pour i de lmax 1 1l faire
m
Premier[i] = Premier[i+1]+Nombre[i+1]
2
fPour

4.4. MTHODE DE HUFFMAN

27

Pour lexemple prcdent on a comme donne le tableau Nombre = (0, 0, 4, 0, 5, 3, 6) et lalgorithme calcule Premier = (2, 3, 2, 4, 3, 3, 0).
Le code canonique a aussi lavantage de faciliter le dcodage. Le dcodeur lit le stream cod
bit par bit. Pour chaque paquet de l bits lus, il verifie si le mot v de l bit qui vient dtre lu
reprsente un entier plus petit que P remier[l]. Si cest le cas, v nest pas un mot de code mais
un prfixe dun mot du code. Il faut donc continuer lire bit par bit jusqu ce que v (dont la
longueur l augmente) devienne plus grand ou gal P remier[l], on pourra alors le dcoder.
P. ex si le dcodeur reoit le stream 0001001 . . ., chaque bit lu on aura :
v
v
v
v
v
v

= 0 < P remier[1] = 2
= 00 < P remier[2] = 3
= 000 < P remier[3] = 2
= 0001 = 1 < P remier[4] = 4
= 00010 = 2 < P remier[5] = 3
= 000100 = 4 P remier[6] = 3

Il saura alors que 000100 reprsente le 2e symbole parmi ceux qui sont cods sur des mots de
longueur 6 et il pourra ainsi le dcoder avant de poser nouveau v = et lire le prochain bit.

4.4.2

Codes dHuffman adaptatifs

Souvent, on ne connat pas les frquences (probabilits) de chaque symbole avant davoir
entirement lu le stream.
Pour viter deffectuer un codage deux passes (peu efficace), la mthode dveloppe un code dHuffman bas sur les statistiques des symbole dj lus.
Il faut faire cela en minimisant les calculs pour mettre jour larbre lorsquun nouveau symbole est lu et donc les frquences changent.
Si n est la taille de lalphabet, on reprsente larbre par un tableau de taille 2n 1, puisque
un arbre binaire complet avec n feuilles (les symboles) possde exactement 2n 1 nuds en
tout. Chaque composante du tableau correspond donc un nud de larbre et est constitue
dune structure ayant des champs contenant la frquence du symbole (le poids du noeud), le
symbole lui-mme (si le nud est une feuille), ainsi que des champs permettant de faire les liens
de parent (par exemple lindex des fils gauche et droite). Chaque nud a donc un poids (la
frquence du symbole sil sagit dun feuille, la somme des frquences de ses deux fils si le nud
est interne) et un numro (son index dans le tableau).
On affectera lindex 2n + 1 (soit, la dernire composante du tableau) la racine de larbre.
Ensuite, chaque fois que un nouveau noeud est ajout larbre, on lui affectera le plus grand
index pas encore attribu un nud. Autrement dit, on remplira le tableau de la droite vers
la gauche.
De plus, les nuds sont ordonns dans le tableau de sorte que leurs poids sont (faiblement)
croissants et de sorte que le numro dun nud interne est toujours suprieur celui de ses deux
fils. Ceci assure que quand on lit les poids des nuds du bas vers le haut et , dans chaque niveau
de larbre de la gauche vers la droite, on obtient une suite faiblement croissante.
On voudra maintenir cette proprit comme un invariant. Par la suite on appellera bloc une
sous-suite de nuds (un intervalle du tableau) constitue de tous les nuds ayant le mme poids.

28

CHAPITRE 4. MTHODES STATISTIQUES (CODES TAILLE VARIABLES)

La procdure de mise jour de larbre


Au dbut, lencodeur et le dcodeur ne connaissent rien sur les statistiques du stream. Les
deux commencent alors avec un arbre vide. En fait cet arbre contient un seul nud racine : PEC
(pour Pas Encore Cod) (de numro 2n 1 et de poids 0) correspondant tous les symboles
de lalphabet qui nont pas encore t cods. Pendant le traitement du stream, lencodeur et le
dcodeur maintiennent des arbres identiques (synchrones), mthode symtrique.
Quand un caractre c est rencontr pour la premire fois, lencodeur lenvoie sous forme non
compresse (brute). Bien entendu, il faut que le dcodeur puisse reconnaitre les suites de bits qui
correspondent des caractres non compresss, il faut donc un meta-caractre pour annoncer
larrive dune donne brute. On comprend que le code de ce meta-caractre ne peut pas tre
fixe dans le temps, parce que, quel que soit le code quon choisit pour lui, il se peut que plus tard
ce code doive tre attribu un autre symbole. On utilise le nud PEC (et donc son code, qui
est variable) avec prcisment cette fonction.
Ensuite, lencodeur ET le dcodeur ajoutent larbre un nouveau nud (de poids 1) correspondant c. Ceci est fait en transformant le nud PEC (qui tait une feuille) en un nud interne
(de poids 1) ayant deux fils : le nouveau nud PEC (de poids toujours 0 et qui reste une feuille)
et le nud correspondant c de poids 1. La position de PEC dans larbre donc change, ainsi
que son code. Ce sera son code (courant) qui sera envoy comme caractre dchappement avant
denvoyer un caractre sous forme brute. Puisque le dcodeur maintient un arbre synchrone, il
reconnaitra le code du caractre dchappement PEC et donc le flag.
Quand un caractre c est dj dans larbre, lencodeur envoie son code que le dcodeur pourra
dcoder (les deux ont toujours le mme arbre). Ensuite les deux procdent la (mme) mise jour
de larbre. Pour cela, il faudra incrmenter dune unit le poids du nud de larbre correspondant
c et rtablir linvariant sil a t cass. En effet, linvariant est cass si le nud contenant c
nest pas le dernier de son bloc. Pour rtablir linvariant il suffit dchanger le nud c avec le
dernier nud de son bloc (il y a une exception, quand le dernier nud de son bloc est prcisment
son pre ; dans ce cas aucun change nest ncessaire). La procdure de mise jour ne peut pas
sarrter l, puisque il faudra incrmenter dune unit aussi le poids du nud pre de c et rpter
rcursivement la procdure de mise jour son niveau pour rtablir linvariant.

Chapitre 5

Mthodes Dictionnaire
Les mthodes statistiques utilisent un modle statistique des donnes, les rsultat de compression dpendent de la qualit du modle.
Les mthodes dictionnaire slectionnent chanes de caractres coder comme des token
utilisant un dictionnaire.
Le dictionnaire peut tre
statique (fixe, permanent) bien que des ajouts soient parfois permis, ou
dynamique (adaptatif), ajouts et suppressions du dictionnaire sont alors permis en fonction
de ce quon trouve dans le texte.
En principe, une mthode dictionnaire peut compresser une chane de n symboles en nE
bits o E est lentropie de la chane (si le fichier est suffisamment large). Elles fournissent donc
des codages optimaux du point de vue du taux de compression.
Elles sont appliques texte mais aussi image et audio.
Si une chane est dj dans le dictionnaire (on dit dans ce cas quon a un matching), un token
correspondant son index est envoy. Sinon, on envoie la chane brute. Le stream compress
contient donc indices et mots bruts, il faut donc pouvoir les distinguer.
Une possibilit est de rserver un bit supplmentaire (flag) pour chaque item. Gnralement
19 bit sont suffisants pour reprsenter indices dans le dictionnaire (219 = 524.288 mots dans le
dictionnaire ). Avec un 20e bit on indique si le mot a t trouv (0) ou non trouv (1) dans le
dictionnaire . Si le mot est brut (1), il faut faire suivre ce 1 par la longueur du mot.
Donc, si un mot est dans le dictionnaire , son codage tient sur 20 bits. Sil ne lest pas, un
octet pour le flag et la longueur (sut 7 bits), plus un octet par lettre. Si les mots ont une longueur
moyenne de 5 lettres, cela fait 6 octets, soit 48 bits.
Si on peut compresser 48 bits en 20 bits, cest trs bien, condition que cela arrive souvent
(quun mot est dans le dictionnaire ). Si la probabilit de trouver un mot dans le dico est P ,
alors aprs lecture/codage de N mots on a un stream compress de taille :
N [20P + 48(1 P )] = N [48 28P ]bits
alors que la taille du stream non compress (dans lhypothse que les mots ont une longueur
moyenne de 5 lettres) est 5N octets = 40N bits.

29

CHAPITRE 5. MTHODES DICTIONNAIRE

30

On a donc compression si N [48 28P ] < 40N , ce qui donne P > 0.29.
Ds quon a des matchings avec une probabilit de 29%, on a compression.
Pour un texte en langue naturelle, un dictionnaire statique de 500000 fait trs bien laffaire
(puisque tous les mots y seront).
Pour fichiers binaires, quand ils sont lus en ASCII cela peut donner un nombre trs grand de
mots (sans sens). Dans ce cas, cest plus difficile de trouver un mot dans le dictionnaire , donc on
risque davoir expansion plutt que compression, un dictionnaire statique ne marche pas bien.
Cependant, un dictionnaire statique marche bien dans des cas particuliers. P. ex. quand on
utilise souvent des mots techniques, qui font partie dun petit dictionnaire ad hoc. Dans ce cas
un petit dictionnaire statique donne de trs bonnes performances.
En gnral, on a de meilleurs rsultats avec des mthodes adaptatives. Le dictionnaire est
initialement vide (ou avec quelques mots par dfaut). Au fur et mesure que lon rencontre des
nouveaux mots, on les ajoute. Si le dictionnaire devient trop grand, on peut effacer certains mots
(p. ex ceux que lon ne rencontre plus depuis le plus longtemps). Cela permet de rduire le temps
de recherche.
Comme pour toutes le mthodes adaptatives, quand on trouve un mot dans le dictionnaire,
on envoie son token. Sinon, on envoie le mot non compress et et ensuite on lajoute au dictionnaire. De plus, avant de passer au mot suivant, on regarde si un vieux mot peut tre effac du
dictionnaire .
Avantages des mthodes dictionnaire :
le calculs effectues par les algorithmes sont des algos de string search or string matching
et non des oprations numriques (qui peuvent causer des problmes darrondi).
les dcodeur est trs simple (mthodes asymtriques, alors que pour les mthodes statistiques, le plus souvent cest symtrique). Le dcodeur qui reoit un token (index), doit
seulement chercher le mot correspondant dans le dictionnaire .

5.1
5.1.1

LZ77 (fentre glissante)


Lencodage

Lencodeur maintient une fentre (tampon) qui est virtuellement glisse sur le texte coder
en la dplaant vers la droite. Le tampon est compos de deux parties :
la partie gauche est le tampon de recherche (search buffer, ou s.b.), cest le dictionnaire
proprement dit, o se trouvent les symboles rcemment cods. Gnralement il a une taille
de lordre de milliers doctets.
la partie droite est le tampon danticipation (look ahead buffer ou l.a.b.) qui contient du
texte encore coder. Gnralement il a une taille de lordre de quelques dizaines doctets.
Exemple 7 Soit le texte :
Supposons que eases sea sick seals doit encore tre compress. Le premier symbole du
l.a.b. (premier symbole coder) est un e. On regarde le s.b. de gauche vers la droite la
recherche dun e. On en trouve un distance (offset) 8 de la fin du tampon. Ensuite on regarde

5.1. LZ77 (FENTRE GLISSANTE)

31

... sir sid eastman easily teases sea sick seals ...

search buffer

lookahead buffer

combien de symboles suivant ce e concident avec des symboles suivant le e coder. Il y en a


deux : le a et le s, donc au total on un matching de longueur 3. On continue de balayer le
s.b. vers la gauche la recherche du matching le plus long. En cas dgalit, on retient le plus
gauche. Il y a celui offset 16 ayant aussi longueur 3. Cest celui qui sera retenu. Le token de
codage est alors le triplet form par loffset o, la longueur l du matching et le premier caractre
suivant les l caractres du matching. Dans ce cas le token envoy sera (16, 3, e).
Le token est crit dans loutput et la fentre est glisse vers la droite de 4 positions.
Si aucun matching nest trouv dans le s.b., alors le token (0, 0, symbole) est envoy. Ces
tokens, qui neffectuent pas une bonne compression, sont communs au dbut :
s (0, 0, s)
i (0, 0, i)
r (0, 0, r)
(0, 0, )
sid (4, 2, d)

Quelle est la taille en bits dun token ? Si S est la taille du s.b., L la taille du l.a.b. et A la
taille de lalphabet, un token a une taille log2 S + log2 (L 1) + log2 A. Si S est de lordre
de quelques milliers de bits, log2 S = 10 - 12 bits. Si L est de lordre de quelques dizaine de
bits, log2 (L 1) = 4 - 6 bits. Les symboles de lalphabet sont typiquement codes sur 8 bits.
Pour un total de 24 bits environ, y compris pour les tokens de type (0, 0, symbole), ce qui est
trois fois plus long que le symbole brut.
Attention au cas :

Mr alf fait pousser des alfalfa ...

Le plus long matching est celui a offset 3 qui est de longueur 4 (parce quil comprend le a,
mme si celui-ce est le permier caractre du l.a.b.) et non celui de offset 13 et longueur 3, donc
le token (3, 4, ) sera envoy et non (13, 3, a).
Penser aussi au cas :

... Joe cria aaaaaaaaahhh ...

5.1.2

Le dcodage

Le dcodeur est plus simple (LZ77 est asymtrique, donc adapt si la compression seffectue
une seule fois et la dcompression plusieurs fois). Il doit maintenir une tampon de taille gale

CHAPITRE 5. MTHODES DICTIONNAIRE

32

la fentre de lencodeur. Quand il reoit un token, il cherche dans son tampon le string correspondant au matching et ajoute le symbole en troisime position du token. Ensuite il effectue le
shift ncessaire (de longueur du matching plus 1).

5.1.3

Petites amliorations possibles

La mthode LZ77 attribue les codes (tokens) en fonction de ce qui a t lu rcemment (ce
qui se trouve toujours dans le s.b.) donc les textes qui seront mieux compresss sont ceux o des
chaines similaires sont distribues de manire proche les unes des autres.
Quelques amliorations des performances de compression peuvent tre obtenues par les techniques suivantes
Utiliser des champs de taille variable pour loffset et les longueurs
Augmenter la taille du s.b. Un s.b. plus grand permettera de trouver des matching plus
frquemment et plus longs, mais le prix payer est que les algos de recherche dun mot
dans le dictionnaire (recherche de motif) sera plus longue et labore.
Changer la technique pour faire coulisser la fentre. En gnral un shift cote O(taille(fentre)).
Mais si on omplmente la fentre comme une file circulaire, alors chaque nouvel input il
suffira dcraser la partie la plus ancienne du s.b. et dplacer les deux pointeurs de dbut
et de fin de file.
Organiser le dictionnaire (le s.b.) sous forme de ABR, mieux si quilibr, dans lequel on
stocke toutes les sous-chanes du s.b. le longueur | l.a.b. | avec loffset qui leur est associ.
On envoie donc un token 2 champs (offset, longueur). Il faut mettre jour larbre aprs
chaque shift (liminer des nuds et en ajouter des nouveaux).
Dfauts de LZ77
Assume que les motifs gaux ou similaires sont proches. si un chane apparat souvent mais
plus espace que | l.a.b. | on a mauvaise compression.
Taille limite des buffers. Elle doit tre limite parce que les algorithmes de string matching doivent vrifier caractre par caractre. L.a.b. plus grand donne meilleur compression
mais encodeur ralenti (doit chercher des concordances plus longues). de mme pour le s.b.
Augmenter la taille des tampons produit aussi des tokens plus gros et donc rduit la compression.

5.1.4

LZ78

Pas de s.b., ni de l.a.b. ni de fentre. Mais un dictionnaire de chanes dj rencontres. La


taille du dictionnaire est limite seulement par la mmoire disponible.
Lencodeur met des tokens deux champs : un pointeur une entre du dictionnaire et le
code dun symbole (la longueur nest plus ncessaire).
Chaque token correspond une chane et est ajout au dictionnaire juste aprs que le token
a t mis. On nefface jamais rien du dictionnaire.
Le dictionnaire est initialis avec la chane vide en position 0.
Quand on lit un symbole x :
si on le trouve pas, on met (0, x) et on ajoute la chaine x la premire place disponible
du dictionnaire.
si on le trouve (par exemple en position 37), on lit le caractre suivant y

5.1. LZ77 (FENTRE GLISSANTE)

33

si xy nest pas dans le dictionnaire, on met le token (37, y)


si xy est dans le dictionnaire, on lit le caractre suivant z et on cherche dans le dictionnaire
xyz
...
En gnral, on lit des caractres jusqu ce que la chine lue w nest pas dans le dictionnaire,
alors que w (avec w = w y pour un symbole y) est dans le dictionnaire. Alors on met le token
(index(w ), y).
La taille du dictionnaire peut tre limit (on verra quoi faire sil se remplit), puisque un
dictionnaire plus grand signifie plus de chance dy trouver la chane, mais pointeurs plus longs
et recherche dans le dictionnaire plus lente.
Structure de donnes pour le dictionnaire : un arbre lexicographique. Pour ajouter la chane
w y on ajoute un nud (nouvel.index, y) comme fils du nud correspondant w .
Une recherche dans le dictionnaire parcourt larbre de la racine vers une feuille (si trouv) ou
un nud interne (si non trouv).
Larbre doit tre dynamique c--d implement de manire ajouter un nombre arbitraire de
fil chaque nud.
Quand larbre est plein, plusieurs solutions :
Le fixer et continuer lutiliser comme un dictionnaire statique pour coder le reste.
Leffacer entirement et recommencer nouveau. Conseill si on change de section dans
le texte, susceptibles davoir distributions de motifs trs diffrentes.
Effacer des nuds (entres du dictionnaire), idalement celles moins utilises rcemment
(problme : pas dalgo efficace pour dcider cela).
LZ78 est symtrique (le dcodeur est plus complexe que pour LZ77)

5.1.5

LZW

Peut-tre la variante la plus populaire de LZ78. On limine aussi le deuxime champ du token.
Un token est simplement un pointeur une entre du au dictionnaire.
Supposons pour linstant pour simplicit que le dictionnaire soit un tableau et pas un arbre .
On initialise les premiers items du dictionnaire avec les symboles de lalphabet (pour ASCII,
les 256 premires position).
Donc un symbole est toujours prsent dans le dictionnaire.
Pour le codage, on lit les symboles et on stocke la chane lue dans une chane I. Quand on
rencontre un symbole x tel que I est dans le dictionnaire mais Ix ne lest pas, on met lindex
de I, on ajoute Ix au dictionnaire et on change lancien I en x avant de continuer lire.
Structure du dictionnaire de LZW et codage
La meilleurs structure est un arbre lexicographique, o pour tout mot w et tout caractre x,
le mot wx se trouve dans un nud fils du nud qui contient w.
Cela permet de rechercher facilement un mot dans le dictionnaire (on parcourt une branche
partir de la racine) et lorsque w est dans le dictionnaire mais wx ny est pas on sait o linsrer

CHAPITRE 5. MTHODES DICTIONNAIRE

34
(comme fils de w tiquet par x).

Il faut quand mme utiliser une structure dynamique qui permet un nud davoir un
nombre quelconque de fils sans leur rserver de place lavance.
On implmente cet arbre comme un tableau de nuds.
Chaque nud contient 2 champs : un pointeur vers le pre (lindex du nud pre) et un
symbole.
Pour descendre dans larbre on utilise une fonction de hachage h qui associe un nouvel index
une paire (index, symbole).
Exemple. Supposons de lire abcd et quaprs lecture de abc on sache que abc est dans
le dictionnaire avec a en position 97, ab en position 266 et abc en position 284. Les positions
correspondantes du tableaux contiendront :

...
...

0
a

...
...

97
b

...
...

c
284

266

97

...
...

266

Le prochain symbole est un d. On doit donc chercher si abcd est dans le dictionnaire, plus
prcisment sil y a un nud avec symbole = d et pre = 284.
On calcule alors h(284, 100) (puisque 100 est le code ASCII de d) qui retourne un index (p.
ex 299). Il y a alors 3 possibilits :
1. Le nud 299 est inutilis. Cela veut dire que abcd nappartient pas encore au dictionnaire
et doit tre ajout cette place. On cre alors le nouveau nud 299 et le dictionnaire
devient :

...
...

0
a
97

...
...

97
b
266

...
...

266
c
284

...
...

284
d

...
...

299

2. Le nud 299 a bien d dans le champ symbole et 284 (do on vient) dans le champ pre.
Cela veut dire que abcd appartient ou dico. On passe lire le symbole qui suit le d.
3. Le nud 299 contient autre chose. Cela veut dire quil y a une collision de la fonction de
hachage. La manire plus simple de traiter les collisions est celle de consulter les nuds
suivants (300, 301,...) jusqu ce quon tombe sur un nud inutilis (on est alors dans le
premier cas) ou bien sur un nud qui contient le couple (288, d) (on est alors dans le
deuxime cas)
En fait on utilise aussi un troisime champ de type index qui servira au dcodeur. Ce champs
contient la valeur retourn par la fonction de hachage sur le couple form par le deux autres

5.1. LZ77 (FENTRE GLISSANTE)

35

champs. Donc la valeur contenue dans ce champs concide avec la position du nud seulement
sil ny a pas eu de collision.
Dcodage
Le dcodeur na pas besoin de fonction de hachage. Il initialise le dictionnaire comme lencodeur, puis il lit les tokens et les utilise pour identifier un nud et donc une entre du dictionnaire.

36

CHAPITRE 5. MTHODES DICTIONNAIRE

Chapitre 6

Compression dimages
Une image digitale est un tableau rectangulaire de points (dits picture elements ou pixels)
disposs sur m lignes et n colonnes. Lexpression m n est dite rsolution de limage.
Le terme rsolution dsigne parfois le nombre de pixels par unit de mesure (p. ex. par
centimtre ou par pouce).
Il peut tre utile faire la distinction suivante :
Images binaires ou monochromatiques. Chaque pixel peut avoir seulement deux valeurs, gnralement nots blanc et noir et est reprsent par un bit.
Images niveau de gris. Chaque pixel est reprsent par n bits (dans le cas prcdent, n = 1)
et donc peut avoir seulement lun des 2n valeurs compris entre 0 et 2n 1, qui sont les
valeurs reprsentables sur n bits et qui reprsentent une intensit de gris (ou dune autre
couleur). Gnralement n est 4, 8, 12, 16, 24, ou en gnral un multiple de 4 ou de 8.
Lensemble de tous les k-mes bits des pixels forment le k-me bitplan (il y a donc exactement n bitplans).
Images tons continus Ces images prsentent un nombre trs grand de couleurs similaires
(ou de niveaux de gris). Quand les valeurs deux pixels adjacent diffrent seulement dune
unit, il est difficile ou mme impossible pour luil de les distinguer. La couleur parait
varier avec continuit. Un pixel est reprsent par un nombre trs grand (pour images
niveaux de gris) ou par trois composantes trs grandes (R, G, B, pour images en couleurs).
Il sagit souvent dimages naturelles (et non artificielles) obtenues avec un appareil photo
digital ou un scanner.
Images tons discrets (appels aussi images graphiques ou images synthtiques). Normalement, ces images sont artificielles. Elles peuvent avoir peu ou beaucoup de couleurs, mais
ils nont pas les caractre continu qui caractrise les prcdentes. Des exemples : une
page de texte, une table, un dessin anim, ou les icnes sur un cran dordinateur. On note
quon peut aussi avoir des images artificielles (gnres par un ordinateur) qui soient tons
continus puisque elle doivent paraitre naturelles. Dans une image tons discrets, trs
souvent deux pixels adjacents ont, soit des couleurs identiques (potentiellement, beaucoup
de redondance !), soit des couleurs totalement diffrents. Les mthodes de compression qui
sappliquent aux images tons continus ne marchent pas bien pour ce type dimages parce
quils estomperaient trop fortement les frontires entre une rgion dune couleur et une
rgion dune autre couleur.
Images dessin anim Ces images prsentent plusieurs rgions uniformes, cest dire composes de pixel ayant tous la mme couleur. Cette proprit peut bien tre exploit pour
obtenir de bons taux de compression.
37

38

6.1

CHAPITRE 6. COMPRESSION DIMAGES

Introduction la compression dimages.

Puisque la plupart des application aujourdhui prsentent des interfaces graphiques, on doit
tout le temps manipuler des images.
Mais les images peuvent tre trs volumineuses ! ! Gnralement, pour images couleurs, chaque
pixel est reprsent par un nombre sur 24 bits (3 fois 8, un octet pour chaque compostante R,
G, B), ce qui permet de reprsenter 224 , soit environ 16, 78 millions de couleurs. Donc une image
(non compresse) de 512 512 pixels fait 768.432 octets, alors quune image de 1024 1024 pixels
fait 3.145.728 octets.
En consquence la compression dimages est extrmement importante.
Une observation importante est que la compression dimage peut tre avec perte, en particulier
perte de ces caractristiques de limages qui ne sont pas visible luil.
Nous savons que linformation peut tre compresse seulement si elle prsente de la redondance. Dans le cas de compression avec perte (dimages) on pourra compresser limage mme
si elle ne prsente aucune redondance mais elle prsente de linformation non essentielle (en anglais : irrelevant ), cest dire des caractristiques qui peuvent tre limines sans que luil sen
aperoive. En consquence, une image peut tre compresse (avec perte) mme si il ny a pas de
redondance.
Il existe une mthode simple pour quantifier linformation perdue dans une compression avec
perte. tant donne une image A, la compresser pour obtenir B. Ensuite dcompresser B pour
obtenir C. Soit D = C A. Si A a t comprsse sans perte, alors C = A et D sera uniformment
blanche. Sinon, plus il y a eu la perte dans la compression et plus D sera loin dtre une image
blanche.
Les mthodes vues jusquici (RLE, quantisation scalaire, mthodes statistiques et mthodes
dictionnaire...) peuvent marcher, mais utilises toutes seules ne donnent pas de bons rsultats.
RLE. On a dja vu dans le premier chapitre comme RLE peut tre utilis pour compresser
des images. Toute seule elle ne marche pas bien pour images, sauf celles en N/B. Et mme
pour les images en N/B du fax, elle es utilise en combinaison avec la mthode de Huffman.
On verra que le format JPEG pa exemple utilise RLE combine avec dautres mthodes.
Les mthodes statistiques. Ces mthodes compressent bien quand les symboles ont des
probabilits trs diffrentes entre elles. Or, souvent ce nest pas le cas pour les diffrentes
couleurs ou niveaux de gris dans les images tons continus. Les mthodes statistiques
compressent mieux les images qui prsentent des discontinuits de couleurs (pixels adjacents
peuvent avoir couleur trs diffrentes). Cependant, il nest pas facile de juger la vue si
une image prsente assez de discontinuit de couleur pour que la compression soit bonne.
Les mthodes dictionnaire. Ces mthodes ne compressent pas bien non plus les images
tons continus. En fait, ces images prsentent des pixels adjacents ayant couleurs proches,
mais pas de patterns qui se rptent. Mme des images qui paraissent prsenter des patterns
qui se rptent (P. ex. une barre verticale noire sur fond blanc) peuvent les perdre si limage
traiter est le rsultat dune scannerisation o la feuille na pas t place parfaitement
verticale. Un autre problme des mthodes dictionnaire est quelles scannerisent limage
horizontalement, ainsi elles ngligent des rgularits verticales (et donc des corrlations
entre les pixels placs sur une mme colonne), qui donnent lieu aussi de la redondance
qui ne sera pas limine. P. ex., GIF compresse beaucoup mieux une image avec des barres
noires horizontales que la mme image tourne de 90 degrs.

6.1. INTRODUCTION LA COMPRESSION DIMAGES.

6.1.1

39

Compression dimages et Correlation.

La compression dimages est li au concept de correlation (ou redondance spatiale) entre


pixels. Des lments dinformation qui sont co-relis peuvent tre compresss de manire importante. Voyons cela avec deux exemples.
Exemple 1. On considre la suite suivante de donnes :
12, 17, 14, 19, 21, 26, 23, 29, 41, 38, 31, 44, 46, 57, 53, 50, 60, 58, 55, 54, 52, 51, 56, 60
On note que seulement deux valeurs sont identiques et que la moyenne de ces valeurs est
40, 3. On voit cependant quil y a une relation (correlation) entre chaque valeur et la suivante,
ce qui est mis en vidence par la suite de leurs diffrences :
12, 5, 3, 5, 2, 4, 3, 6, 11, 3, 7, 13, 4, 11, 4, 3, 10, 2, 3, 1, 2, 1, 5, 4
Cette suite est susceptible dtre plus fortement compresse que la prcdente pour plusieurs
raisons :
Ces diffrences ont des valeurs absolues plus petites que celles de la suite dorigine, elles
pourront donc tre en principe codes sur un nombre plus petit de bits.
Il y a des rptitions, ce qui rduit le nombre de valeurs diffrents et donc aussi le nombre
de bits pour les reprsenter. Ici par exemple il ny a plus que 15 valeurs distinctes et donc
4 bits pourraient suffire pour les reprsenter.
De plus, valeurs rptes dterminent plus facilement la cration de runs.
On peut donc utiliser la correlation pour compresser, et quand il ny a pas de correlation
apparente, on peut la crer pour lexploiter comme illustrer par lexemple suivant.
Exemple 2. Soit une image A de rsolution 32 32 dont les pixels ont une valeur entre 0 et 255
choisie au hasard. Limage A sera donc une distribution totalement random de pixels de diffrents
niveaux de gris. Il ny a donc pas de correlation entre les pixels et limage sera difficilement
compressible. Dautre part, considrons la matrice B obtenue en inversant la matrice A. On
rappelle que le calcul dune valeur B[i, j] de la matrice inverse dpend de toutes les valeurs de
la matrice A, puisque cette valeur est :
B[i, j] = (1)i+j

det(Ai,j )
det(A)

o Ai,j est la matrice (de taille 31 31) obtnue en effaant la ligne i et la colonne j de la
matrice A.
On voit donc que deux pixels adjacent de B auront des valeurs proches (les expressions pour
B[i, j] et B[i + 1, j] par exemple seront trs similaires, puisque les matrices Ai,j et Ai+1,j ont
beaucoup dlments en commun), ils sont donc co-relis. La matrice B se compressera donc
beaucoup mieux que la matrice A. On aura donc intrt transformer dabord A en B et compresser B au lieu de A. Le dcodeur dcompressera la version compresse de B et appliquera la
transformation dans le sens oppos pour retrouver A.
Ceci est le principe de lapproche des transformes. On transforme une image en une autre qui
prsente plus de correlation et on compresse cette dernire. Dans cet exemple, la transformation
consiste simplement prendre la matrice inverse.

CHAPITRE 6. COMPRESSION DIMAGES

40

6.1.2

Compression dimages et Luminance.

Par exprience, dans une image, la luminosit des pixels est aussi co-relie. Si un pixel est
clair (lumineux) alors trs souvent ses voisins seront aussi clairs (lumineux) mme sils sont dune
autre couleur. De plus, luil humain est beaucoup plus sensible aux variations de luminosit
quaux variations de couleurs. On peut voir lensemble de toutes le couleurs comme un espace
vectoriel tridimensionnel gnr par la base constitu des trois vecteurs R = (1, 0, 0), G = (0, 1, 0)
et B = (0, 0, 1) (p. ex, la couleur (78, 202, 113) est obtenue comme la combinaison linaire :
78 R + 202 G + 113 B).
Il convient en fait dexprimer les couleurs en fonction dune autre base que RGB. En effet, on
peut dfinir un vecteur Y , dit luminance, qui est une combinaison linaire de RGB et ayant la
proprit que la composante dune couleur en direction mesure le degr de luminosit du pixel.
Ce vecteur Y a une forte composante verte et une faible composante rouge et bleu, parce que
cest surtout la couleur verte qui donne la sensation de luminosit. De plus, on peut bien entendu
trouver deux vecteurs CR et CB ( une forte composante rouge et bleue, respectivement) qui
forment avec Y une nouvelle base.
Les composantes Y de pixels adjacents auront valeurs proches, elles seront donc co-rlies et
on pourra exploiter cette proprit de correlation pour une meilleur compression.

6.2

Prsentation des approches de la compression dimages.

1. Pour images binaires (en N/B). Digitaliser limage dans lordre du rateau (ligne par ligne,
de droite vers la gauche) et utiliser RLE. Les longueurs des runs peuvent ensuite tre codes
par un code prfixe taille variable (mthode statistique la Huffman comme pour le fax).
Variantes : digitaliser limages par dautres ordres qui pourraient savrer plus avantageux :
par colonnes, en zig-zag...
2. Pour images binaires (en N/B). Utiliser les quadtrees. Il sont dfinit rcursivement. Supposons davoir une image carre de taille 2k 2k (si ce nest pas le cas, on peut toujours
border limage avec un nombre opportun de colonnes ou de lignes de zros pour la rendre
carre et ayant comme cot une puissance de 2). Si une image est entirement blanche
(resp. noire) alors son quadtree est un arbre constitue dun seul nud (sa racine) ayant
couleur blanc (resp. noir). Sinon, le quadtree associ mimage est un arbre constitue
dune racine (nayant pas de couleur) ayant quatre sous-arbres, qui sont les quadtrees des
images obtenues en divisant limage en quatre (correspondants aux quadrants Nord-Ouest,
Nord-Est, Sud-Ouest et Sud-Est).
3. Pour images plusieurs niveaux de gris. Chaque bitplan dune telle image est en fait
quivalent une image en N/B. On donc peut appliquer chaque bitplan les approches
vues pour les images N/B.
Toutefois il est important de faire une considration. Le fait que pixels adjacents aient
tonalit de gris proche, nimplique pas forcment quils ont composantes identiques sur
la plupart des bitplans. P. ex., si dans une image 4 bitplans deux pixels adjacents ont
couleur 7 (0111) et 8 (1000), alors sur chacun des quatre bitplans la valeur va changer (de
0 a 1 sur le 1er bitpan, de 1 0 pour les autres. Ceci est d au fait que deux nombres
conscutifs nont pas forcment des reprsentations similaire en binaire. Si on veut que pour
deux pixels adjacents de couleur proche, un maximum de bitplans prsentent valeurs gales
(ce qui rsulte priori en runs de plus grande longueur), il faut utiliser pour les entiers un
codage ayant la proprit que le codes de deux entiers conscutif diffrent pour au plus un
bit (les codes ordinaires de 7 et 8 diffrent sur 4 bits). Un tel code existe, il sappelle code

6.2. PRSENTATION DES APPROCHES DE LA COMPRESSION DIMAGES.

41

de Gray. Le code de Gray de rang n, not G(n), utilise des mots de longueur n (n bits)
pour reprsenter les entiers entre 0 et 2n 1. Il est dfini rcursivement comme suit :
G(1) = {0, 1}
(on code lentier 0 par le mot 0 et lentier 1 par le mot 1)
^
G(n) = 0 G(n 1) 1 G(n
1)
o G(n 1) dnote bien entendu le code de Gary de rang n 1, loprateur dnote la
concatnation (ainsi 0G(n1) reprsente lensemble de tous le mots obtenus en concatnant
^
un 0 avec tous les mots de G(n1), alors que loprateur e dnote le renvers (ainsi G(n
1)
est lensemble des mots G(n 1) parcouru de la fin au dbut)
P. ex :
] = 0 {0, 1} 1 {1, 0} = {00, 01, 11, 10}
G(2) = 0 G(1) 1 G(1)
ce qui donne : 0 cod par 00, 1 cod par 01, 2 cod par 11, 3 cod par 10
G(3) =
=
=

]
0 G(2) 1 G(2)

(6.1)

0 {00, 01, 11, 10} 1 {10, 11, 01, 00}


{000, 001, 011, 010, 110, 111, 101, 100}

(6.2)
(6.3)

donc : 0 cod par 000, 1 cod par 001, 2 cod par 011, 3 cod par 010, 4 cod par 110, 5 cod
par 111, 6 cod par 101, 7 cod par 100. Quand les entiers sont cods par le code de Gray,
on voit tout de suite apparatre une plus grande rgularit sur les bitplans, notamment,
moins de distribution random et plus de runs (voir figures 4.9, 4.10 et 4.11 dans le livre de
David Salomon), ce qui permet de compresser davantage.
4. Utiliser le contexte dun pixel pour prdire sa valeur.
Soit une image P . On choisit un contexte pour chaque pixel P [i, j] (p. exemple les 4 pixels
ayant un cot en commun avec lui, ou les 8 pixels ayant un cot ou on sommet en commun
avec lui) et on calcule la moyenne des valeurs pixels du contexte. Soit la matrice A telle
queA[i, j] est la moyenne des valeurs des pixels dans le contexte de P [i, j]
Le principe de la compression dimage nous dit quen gnral la matrice A est presque
partout gale P (ou ses valeurs sont presque partout trs proches des valeurs de P ).
Une fois calcul la matrice A, on peut calculer la matrice = P A. Cette matrice est
compose de beaucoup de zro et de beaucoup de valeur trs petites. En fait, la moyenne
reprsente la valeur quon peut prdire pour P , elle est donc une information redondante
qui peut tre limine. Ma matrice se compresse donc bien par des mthodes standard
(RLE, quantisation, ou mthodes statistique qui assignent des codes plus courtes aux petites
valeurs qui seront plus frquentes). Lencodeur peut donc envoyer au lieu de P .
Le contexte peut tre dfini de plusieurs manires, il peut mme tre constitu de un ou
deux pixels seulement. On peut aussi attribuer des poids plus forts aux pixel du contexte qui
sont plus proches. On obtient ainsi une meilleure prdiction et une meilleure compression.
Le dcodeur reoit lencode de , la dcode, et commence calculer A. Pour chaque
A[i, j], il pourra calculer P [i, j] = A[i, j] + [i, j] et reconstruire limage dorigine.
Note. Pour que le calcul de A soit possible il faut que le premier pixel soit envoy sous
forme brute et que le contexte utilise uniquement des pixels qui ont dj t dcod. Par
exemple, le contexte du deuxime pixel cod ne pourra que contenir le premier.

CHAPITRE 6. COMPRESSION DIMAGES

42

5. Transformer limage et encoder la transforme. La mthode des transformes sera prsente


en dtail dans la prochaine section. En gnral il sagit dliminer la correlation et obtenir
une version de limage o les pixels sont non correlis. En liminant la redondance on cre
aussi des valeurs beaucoup plus communes alors que dautres sont rare (petite entropie).
La quantisation marche aussi bien sur les images transformes.
Regardons maintenant les images en couleurs.
6. Sparer limage en trois images niveaux de gris et appliquer lune des trois mthodes 3,
4, ou 5. Prfrablement en utilisant une dcomposition, luminance, chrominance, couleur
plutt que la reprsentation RGB.
7. Les images tons discrets peuvent profiter dun traitement particulier. En gnral elle
sont composes dun assemblage dlments de base (rectangles, lignes, courbes) qui sont
rpts diffrentes positions, diffrentes chelles, tournes dangles diffrents. On code
chacun des lments de base ainsi que les transformation quil a subi aux diffrents endroit
de limage (translation, rotation...).

6.3

Transformes.

VENIR

Annexe A

Titre

43

44

ANNEXE A. TITRE

Annexe B

Titre

45

46

ANNEXE B. TITRE

Conclusion et discussion

47

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