Compression Décompression
Compression Décompression
Décembre 2004
Table des matières
1 Introduction 2
5 Conclusion 24
1
Chapitre 1
Introduction
La compression des données est un vaste sujet qui a fait l’objet de nombreux
ouvrages et articles. Elle donne lieu aujourd’hui à de nombreuses recherches en
raison des enjeux économiques. Elle est utilisée majoritairement dans les appli-
cations informatiques et elle est une des conditions d’existence du multimédia.
L’utilisation de la compression et sa mise en pratique nécessitent des connais-
sances nombreuses et complexes tels que le calcul intégral, l’algèbre linéaire, la
géométrie fractale, la théorie des probabilités · · · Dans cet exposé, nous allons
ouvrir un champ de réflexion en indiquant tout d’abord quelles sont les méthodes
générales utilisées aujourd’hui pour compresser les données puis dans un second
temps, nous allons présenter deux méthodes très utilisées dans la compression
des données.
2
Chapitre 2
Généralités sur la
compression
2.1.2 Intêret
De nos jours, la puissance des processeurs augmente plus vite que les capaci-
tés de stockage, et énormément plus vite que la bande passante des réseaux (car
cela imposerait d’énormes changements dans les infrastructures de télécommu-
nication).
Il y a donc un déséquilibre entre le volume des données qu’il est possible de
traiter, de stocker, et de transférer.
Par conséquent, il faut donc réduire la taille des données. Pour cela, il faut
exploiter la puissance des processeurs, pour pallier aux insuffisances des capaci-
tés de stockage en mémoire et des vitesses de transmission sur les réseaux.
3
Exemples
Choisissons une séquence vidéo avec les caractéristiques suivantes :
– 25 images par seconde,
– 16 millions de couleurs (soit 3 octets par pixel),
– Résolution de 640 x 480.
Sans compression, il faudrait un débit de 23 Mo/s (25 x 3 x 640 x 480), et
pour donner un ordre d’idée, cela représente un débit 130 fois plus important
que celui d’un lecteur de CD-ROM simple vitesse (150 Ko/s). De plus, si on
souhaite stocker 2 heures de vidéo, il nous faudrait une unité de stockage de 162
Go (équivalent à 34 DVD de 4,7 Go).
4
2.2.2 Compression physique / logique
On considère généralement la compression comme un algorithme capable
de comprimer des données dans un minimum de place (compression phy-
sique), mais on peut également adopter une autre approche et considérer qu’en
premier lieu un algorithme de compression a pour but de recoder les données
dans une représentation différente plus compacte contenant la même informa-
tion (compression logique).
La distinction entre compression physique et logique se base sur la façon dont les
données sont compressées ou plus précisément comment est-ce que les données
sont réarrangées.
La compression physique est exécutée exclusivement sur les informations
contenues dans les données. Cette méthode produit typiquement des résultats
incompréhensibles qui apparemment n’ont aucun sens. Le résultat d’un bloc de
données compressées est plus petit que l’original car l’algorithme de compression
physique a retiré la redondance qui existait entre les données elles-mêmes.
La compression logique est accomplie à travers le processus de substitution
logique qui consiste à remplacer un symbole alphabétique, numérique ou binaire
en un autre. Changer "United State of America" en "USA" est un bon exemple
de substitution logique car "USA" est dérivé directement de l’information conte-
nue dans la chaîne "United State of America" et garde la même signification. La
substitution logique ne fonctionne qu’au niveau du caractère ou plus haut et est
basée exclusivement sur l’information contenue à l’intérieur même des données.
– Codage statistique :
Le but est de :
– Réduire le nombre de bits utilisés pour le codage des caractères fré-
quents.
– Augmenter ce nombre pour des caractères plus rares.
5
Exemple
Certaines informations sont plus souvent présentes que d’autres dans les
données que l’on veut compresser.
Dans un fichier HTML par exemple, on trouvera beaucoup de signes < , /
, et >. On va chercher à coder les données se répétant souvent sur moins
de bits, et les données moins fréquentes sur plus de bits. On va chercher
à élargir la réduction des répétitions des groupes d’octets plutôt que des
octets simples (principe utilisé pour les algorithmes de Lempel-Ziv, Zip,
Huffman · · ·).
– Substitution de séquences :
Comprime les séquences de caractères identiques.
6
– Temps pour écrire une image JPEG de 503Ko : 0,2s
– Temps total compression + écriture : 3,6s, soit 1,4s de moins (gain de 24%
en temps et 96% en volume stocké sur disque)
Ainsi, nous avons pu voir que les méthodes de compression sont très utiles et
apportent parfois des résultats spectaculaires. Sachant le fichier à compresser,
chaque algorithme a ses avantages et ses inconvénients et il faut donc choisir
l’algorithme en fonction du type de données.
7
Chapitre 3
Compression de type
statistique : codage de
Huffman
3.1 Introduction
Le codage de Huffman est un algorithme de compression des données basé
sur les fréquences d’apparition des caractères apparaissant dans le document
initial. Il a été développé par un étudiant de la MIT (Massachusetts Institute
of Technology), David A. Huffman en 1952. Cette technique est largement
utilisée car elle est très efficace et on observe selon le type de données des taux
de compression allant de 20% à 90% mais plus généralement entre 30% et 60%.
La dernière partie de cette section traitera des performances.
Le principe de compression est utilisé dans le codage d’image TIFF (Tagged
Image Format File) spécifié par Microsoft Corporation et Aldus Corporation. La
méthode JPEG (Join Photographic Experts Group) utilise aussi la compression
de type Huffman pour coder les informations d’une image. (Elle utilise d’ailleurs
des tables prédéfinies).
Ce procédé fait partie des méthodes de compression de type dites statistiques.
Cela repose sur le principe sur l’attribution de codes plus courts pour des valeurs
fréquentes et de codes plus longs pour les valeurs moins fréquentes. Cela est
plus efficace que la représentation actuelle qui consiste, quant à elle, à utiliser
une longueur fixe pour chaque symbole (exemple : un octet par caractère, code
ASCII).
8
– Tout d’abord, la création de la table de fréquence d’apparition des carac-
tères dans le texte initial.
– Ensuite la création d’un arbre binaire (usuellement dénommé arbre de
Huffman) suivant la table précédemment calculée. (Remarque : on devrait
parler plutôt de l’arborescence de Huffman.)
– Enfin coder les symboles en représentation binaire optimale.
nombre d′ occurrences de s
fs =
nombre de symboles
9
3.2.2 Construction de l’arbre de Huffman
L’arbre binaire de Huffman est la structure de données qui va nous per-
mettre d’attribuer à chaque symbole une représentation binaire optimale. Afin
de construire l’arbre, on utilise la table de fréquences précédemment construite
qu’on appelle T et on applique l’algorithme suivant :
fin
end
De façon informelle, on utilise une file d’attente Q dans laquelle on place les
noeuds correspondants au couple [symbole : nombre d’occurrences du symbole]
de tous les symboles. Ensuite on extrait de la file d’attente les 2 noeuds ayant la
valeur minimale puis on crée un nouveau noeud dans l’arbre de Huffman ayant
pour fils les 2 deux sélectionnés, on rajoute ensuite le noeud nouvellement crée
dans la file d’attente , et on réitère jusqu’à ce que la file soit vide.
10
Initialisation
Q
c:1
g:1
q:1
’:1
a:2
s:5
[ ]:11
e:14
Etape 1
Q
q:1
’:1
a:2
f:2
i:2
2
[ ]:11
e:14
2 c:1 g:1
Etape 2
Q
a:2
f:2
i:2
p:2
u:3
2 2
e:14
11
Q Etape finale
80
0 1
vide
34 46
0 1 0 1
16 18 20 26
0 1 0 1 0 1 0 1
8 8 7 [ ]:11 10 10 8 e:18
0 0 0 1 0 1
0 1 1 1 1 0
l:3 5 m:5 5 s:5 4 d:4
n:4 o:4 r:4 t:4 4
0 1 0 1 0 1 0 1
a:2 f:2 2 u:3 2 h:3 i:2 p:2
0 1 0 1
c:1 g:1 q:1 ’’:1
– Les arcs reliant un noeud à son fils gauche sont étiquetés par ’0’.
– Les arcs reliant un noeud a son fils droit sont étiquetés par ’1’.
De cette manière, chaque feuille représentant un symbole peut être redéfinie par
un nombre binaire correspondant au chemin entre la racine et la feuille de l’ar-
borescence. Ainsi, les symboles les plus utilisés ont une représentation binaire
moins importante (en terme de taille) que les symboles les moins utilisés. Ceci
permet de représenter chaque symbole de façon optimale et permet de réaliser
une compression des données efficacement.
12
Symbole Représentation binaire Taille(en bits) Gain(en bits)
c 100000 6 2
g 100001 6 2
q 101000 6 2
’ 101001 6 2
a 01000 5 3
f 01001 5 3
i 11000 5 3
p 11001 5 3
u 10001 5 3
h 10101 5 3
l 0101 4 4
d 1101 4 4
n 0000 4 4
o 0001 4 4
r 0010 4 4
t 0011 4 4
m 1001 4 4
s 1011 4 4
011 3 5
e 111 3 5
13
Entete Données compressées
3.2.4 Remarques
– Dans notre exemple nous avons appliqué l’algorithme sur un symbole mais
on peut améliorer de façon significative l’efficacité en l’appliquant sur une
suite de symboles (par exemple 2 ou 3 etc..). Par contre la taille de l’arbre
binaire de Huffman ainsi que celle de l’entête pour transmettre des données
sont significativement plus importantes. Il faut aussi considérer le temps
de traitement qui est plus long.
– L’algorithme de Huffman n’est pas à proprement parler un algorithme
de compression réservé aux réseaux (et aux couches basses en particulier)
puisque ceci est réalisé au niveau applicatif ; néanmoins, du au fait de l’en-
capsulation des couches, la propagation du message compressé se réalise
jusque dans les couches les plus basses.
– La méthode de Huffman possède l’inconvénient de devoir analyser statis-
tiquement le message original ce qui peut prendre relativement du temps.
De ce fait, on utilise parfois des tables statistiques prédéfinies ce qui évite
d’analyser le texte original au préalable. C’est ce qu’on appelle des tables
statiques alors que les autres sont habituellement dénommées dynamiques.
3.3 Performances
L’intérêt de la compression est de pouvoir réduire au maximum la taille
des informations originales, comme nous l’avions indiqué en première partie.
Cette mesure peut-être effectuée par le taux de compression qui est défini par
la formule suivante :
T aille compressee
ρ=1−
T aille originale
Par ailleurs, on peut aussi utiliser l’entropie permet de connaître le nombre
minimum de bits nécessaires au codage d’un fichier. On rappelle que la formule
de l’entropie est la suivante :
1
X
E=− (Pk ∗ log2 (Pk ))
N
14
où Pk est la fréquence d’apparition du k-ième symbole parmi les n possibles.
Analysons les performances de l’algorithme de Huffman grâce au taux de com-
pression puis avec l’entropie sur notre exemple tout d’abord puis nous généra-
liserons.
Entropie
1
X
E=− (Pk ∗ log2 (Pk ))
N
1 1 1 1 11 11 14 14
E = − ( ∗ log2 ) + ( ∗ log2 ) + · · · + ( ∗ log2 ) + ( ∗ log2 )
76 76 76 76 76 76 76 76
E = 3.92
Ce qui signifie qu’il faut au minimum 3.92 ∗ 76 = 297.92 bits pour coder la
chaîne. Avec 300 bits grâce à la méthode de Huffman on est très proche de
l’optimalité.
15
Type de fichier Taux de compression
Texte 49.5%
Bitmap (image) 50%
Wave (audio) 50%
Éxecutable 20%
3.4 Conclusion
L’algorithme de Huffman est un procédé largement répandu et qui se révèle
être un algorithme performant en moyenne. Il est le plus représentatif des algo-
rithmes de compression dit de type statistique : il en existe néanmoins d’autres
tels que le RLE(Run Length Encoding), ou bien VLC (Variable Length Code)
dénommé souvent codage entropique. Hormis tout ces avantages, Huffman pré-
sente l’inconvénient d’être relativement ancien et d’autres algorithmes plus ré-
cent reposant sur d’autres principes tels que les algorithmes de compression à
dictionnaire (exemple : LZW) arrivent a des taux de compression supérieurs en
moyenne à ceux que proposent l’encodage de Huffman.
16
Chapitre 4
Compression de type
Dictionnaire
17
4.2 L’algorithme LZW
4.2.1 Historique des algorithmes LZ**
C’est en 1977 que Jacob Ziv et Abraham Lempel fournissent une technique
de compression différente de l’algorithme de Huffman, et capable de donner de
meilleurs taux de compression. Ils mettent ainsi en place l’algorithme LZ77.
Puis vient LZSS, version amélioré de LZ77 par Storer et Szymanski puisque la
recherche des séquences dans le dictionnaire est réduite logarithmiquement.
Enfin vient l’algorithme LZ78, plus connu sous le nom LZW, amélioration faite
par Terry Welch en 1984 de LZSS de par le fait que les séquences sont rangées
dans une arborescence. Il porte le nom de ses 3 inventeurs : Lempel, Ziv et Welch.
4.2.2 Le principe
Le principe est fondé sur le fait qu’une séquence de caractères peut appa-
raître plusieurs fois dans un fichier.
L’algorithme LZW de compression consiste à émettre à la place des séquences,
les adresses des de ces séquences d’un dictionnaire généré à la volée.
C’est un algorithme de compression nettement plus performant en moyenne que
les algorithmes statistiques puisqu’il permet d’obtenir des gains plus élevés sur
la majorité des fichiers.
L’algorithme LZW se distingue des méthodes statistiques pour plusieurs raisons :
18
adresses supérieures à 255.
19
Voici un tableau résumant les opérations effectuées sur l’exemple lors du
déroulement de l’algorithme LZW de compression :
Adresse Séquence
0..255 ASCII
256 SI
257 IS
258 SI-
259 -E
260 ET
261 T-
262 -I
263 ISI
20
code et sait alors que le nombre de bits à lire est incrémenté (dans ce cas ci soit
9 bits). Ce processus fonctionne si l’on condamne certaines adresses du diction-
naire (255, 511,1023 ...,) en n’y plaçant pas de séquences d’octets.
Remarque : Un problème se pose, c’est la façon dont on peut différencier la
vraie valeur ’255’ de l’indicateur d’augmentation de bits. Il suffit pour résoudre
ce problème d’émettre l’adresse 255 sur 8 bits suivi immédiatement du code
’255’ mais sur 9 bits soit 011111111.
Une autre méthode, moins élégante, qui utilise une entête pour informer l’al-
gorithme de décompression des positions où dans le fichier l’on à augmenter la
taille des adresses.
Le code ’SP’ peut ne pas être le seul code de communication avec l’algorithme
de décompression. D’autres codes peuvent par exemple servir à vider des dic-
tionnaires périodiquement, à créer d’autres dictionnaires : il n’y a pas de limites.
21
Exemple d’utilisation de l’algorithme LZW de décompression
A l’aide de l’algorithme LZW, nous voulons décompresser la séquence sui-
vante : ’[Link].[Link].257’
On lit donc la première adresse soit 83. On écrit la séquence associée à cette
adresse du dictionnaire. Ensuite on lit l’adresse suivante. On s’assure que l’adresse
lue appartient au dictionnaire et que ce n’est pas un code spécial de contrôle, en-
suite on écrit la séquence associée à cette adresse. On ajoute dans le dictionnaire
la concaténation de l’ancienne adresse lue et la première lettre de la séquence.
On continue ensuite avec les adresses suivantes jusqu’à la fin du fichier.
Remarque : nous ne nous préoccuperons pas de la taille des adresses inscrites
dans le fichier à décompresser.
Voici un tableau résumant les opérations effectuées sur l’exemple lors du dérou-
lement de l’algorithme LZW de compression :
22
possède une taille de 79 bits (2*8+7*9), donc on a ici un taux de compression
de l’ordre de
79
ρ=1− ≈ 0.18 ≈ 18%.
96
En général lorsque la taille du fichier n’est pas trop petite, le taux de compres-
sion est supérieur à celui obtenu par une méthode statistique. On peut rajouter
que l’algorithme LZW est nettement plus rapide qu’un algorithme de type sta-
tistique en terme de traitement.
On peut noter qu’il est possible de compresser un fichier déjà compressé aupa-
ravant par un algorithme de type statistique ou l’inverse.
4.2.6 Conclusion
L’algorithme LZW est aujourd’hui considéré comme la méthode de compres-
sion la plus efficace et une des plus connues. Elle est relativemnt rapide ce qui
a rendu l’utilisation de la compression possible sur les disques durs de façon
transparente. Cette méthode est aussi utilisée dans le format .gif, mais encore
dans les compresseurs tels que ZIP, ARJ.
Néanmoins elle était peu utilisée car elle était brevetée par la société Unisys
jusqu’en juillet 2004 (8 Juillet 2004) où le brevet a expiré. Par conséquent, cette
dernière ne peut plus à présent réclamer des droits sur l’utilisation du format
gif par exemple car celui ci reposait sur l’algorithme LZW.
23
Chapitre 5
Conclusion
La compression des données est appelée à prendre un rôle encore plus impor-
tant en raison du développement des réseaux et du multimédia. Son importance
est surtout due au décalage qui existe entre les possibilités matérielles des dispo-
sitifs que nous utilisons (débits sur Internet, sur Numéris et sur les divers câbles,
capacité des mémoires de masse · · ·) et les besoins qu’expriment les utilisateurs
(visiophonie, vidéo plein écran, transfert de quantités d’information toujours
plus importantes dans des délais toujours plus brefs). Quand ce décalage n’existe
pas, ce qui est rare, la compression permet de toutes façons des économies. Les
méthodes déjà utilisées couramment sont efficaces et sophistiquées (Huffman,
LZW, JPEG) et utilisent des théories assez complexes, les méthodes émergentes
sont prometteuses (fractales, ondelettes) mais nous sommes loin d’avoir épuisé
toutes les pistes de recherche. Les méthodes du futur sauront sans doute s’adap-
ter à la nature des données à compresser et utiliseront l’intelligence artificielle
mais on est dans le droit de se poser la question suivante : La compression sera-
t-elle utile dans le futur alors que les contraintes sur les ressources deviennent
de moins en moins importantes ?
24