Documente Academic
Documente Profesional
Documente Cultură
Roberto Mantaci
13 mars 2012
Chapitre 1
Introduction
CHAPITRE 1. INTRODUCTION
Chapitre 2
Gnralits
2.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
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.
CHAPITRE 2. GNRALITS
Chapitre 3
Brailles
3.2
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
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
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
3.4.1
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.
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
...
...
...
3.5
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.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.
10
3.5.2
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
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
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 :
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
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
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
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.
13
3.7
14
Chapitre 4
Introduction
Principe : codes plus courts pour symboles plus frquents.
4.2
16
4.2.1
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.
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
n
X
Pi log2 Pi
i=1
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
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
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
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
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
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
21
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
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
22
23
0.25 a2
1 a12345
0.15 a3
0.45 a2345
0.2 a345
0.03 a4
0.05 a45
0.02 a5
4.4.1
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}},
{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
a
0.23
0.12
b
0.47
0.13
1
0.27
0.14
d
0.53
0.24
0.26
10 01;
01 10;
11 10;
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
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
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
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
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 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
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
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
31
... sir sid eastman easily teases sea sick seals ...
search buffer
lookahead buffer
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 :
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 :
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
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
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
33
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
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
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 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
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.1
39
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.
40
6.1.2
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
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
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)
(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.
42
6.3
Transformes.
VENIR
Annexe A
Titre
43
44
ANNEXE A. TITRE
Annexe B
Titre
45
46
ANNEXE B. TITRE
Conclusion et discussion
47