Académique Documents
Professionnel Documents
Culture Documents
Discrètes et Compression
1
Introduction
• Une source d’information à été définie comme une
variable aléatoire A. Nous nous intéressons maintenant à
la suite des valeurs que peut émettre cette source, que
nous allons modéliser comme une suite A1,A2, . . . ,An de
variables aléatoires.
Pour simplifier, nous supposerons que les Ai sont
indépendantes (on dit alors que la source est sans
mémoire) et identiquement distribuées (i.i.d.) de loi PA.
Les résultats de ce chapitre s’étendent néanmoins au cas
de sources avec mémoire, i.e. telles que les Ai sont liées.
2
Introduction
• Notre objectif est de coder efficacement un message
produit par une source A, c’est à dire une suite de
valeurs a1, . . . , an, afin de le transmettre sur un canal
supposé sans bruit.
• Par « codage efficace », on entend que le train de bits
résultant du codage doit être le plus court possible, en
moyenne.
• Si le codage est destiné à de la transmission sur un canal
parfait, cela garantit une transmission rapide. S’il est
destiné à un stockage d’information, cela garantit un
encombrement mémoire minimal. On parle alors de
compression de données.
3
Introduction
• Un codage efficace doit accorder peu de bits (ou de lettres)
aux valeurs ai ∈ A fréquentes, et beaucoup aux valeurs
rares.
• C’est par exemple une idée qui a été utilisée dans la
construction de l’alphabet Morse, lequel repose sur 4
lettres : trait (−), point (·), silence court, silence long.
• Ainsi trait et point correspondent à des lettres (de
l’alphabet) très fréquentes t = − et e = · .De même i = · · ,
etc. En revanche x = − · ·− , y = − · −− et z = − − ·· .
• Si on y regarde de plus près, on constate que ce codage est
adapté à la distribution statistique des lettres de l’alphabet
pour la langue anglaise.
4
Codage de source
• Le codage de source consiste à associer à chaque symbole ai
d’une source une séquence d’éléments de l’alphabet de
destination, appelée mot du code.
• L’objectif du codage de source est de supprimer les parties
redondantes de l’information délivrée par la source.
• Un code de A est une application C: A à B* qui à chaque
symbole ai ÎA, fait correspondre un mot C(ai) Î B* où B
est un alphabet de codage : ai ®C(ai).
• « C » doit être une application injective Þ C-1 existe
• Le plus souvent, on utilise un code binaire, l'alphabet de
codage est B ={0,1},
5
Codage de source
• Pour chaque mot mÎ A*, on définit son codage Cd(m)Î B*
(un mot de l'alphabet de codage)
• Si un message m est composé d'une suite de lettres:
m =a1a2…aℓ
on définit son codage Cd(m) par concaténation :
Cd(m) = C(a1)C(a2)….C(aℓ)
• « Cd » est un morphisme de A* vers B*:
Cd: A* ® B*
m ® Cd(m)=C(a1)C(a2)….C(aℓ)
• Cd(A*): l’ensemble de tout les mot de code qui peuvent
être associer au séquences construits sur A.
6
Codage de source: Exemples
Soit A={a,b,c,d} avec B={0,1}
C={a®01,b ®0,c ®10, d ®111}
Cd(abbc)=010010
• L’application Cd doit être injective: Cd(m)=Cd(m’)Þm=m’
si « C » est injectif « Cd » ne l’est pas forcément.
Exemple:
– Cd(abbc) = 010010
– Cd(bcab) = 010010
– Cd(abab) = 010010
« Cd » n’est pas injectiveÞ on ne peut décodé !
Un codage ambigu implique une perte d'information.
7
Codage de source
• Un code (resp. codage) est régulier si deux lettres (resp.
séquences de lettres) distinctes sont codées par des mots
distincts. Un code non régulier implique une perte
d'information.
• Un code est à décodage unique (déchiffrable) si son
codage associe est régulier.
– Code non ambigu (Régulier) Û C injective
– Code à décodage unique (déchiffrable)Û Cd injective
• Si un code est uniquement déchiffrable, il existe donc une
fonction de décodage (fonction réciproque)
D : C(A*)® A*
telle que D(C(m)) = m pour tout mÎA*.
8
Codage de source
• En toute généralité, il n'est pas toujours facile de décider si
un codage est uniquement déchiffrable, ni, s'il l'est, de
calculer la fonction de décodage.
• Prouver qu'un codage est ambigu est conceptuellement
simple : il suffit d'exhiber deux mots distincts qui ont le
même codage
• Pour prouver qu'un code est uniquement déchiffrable c'est
plus compliqué : moralement, il faut trouver la fonction «
D » et prouver qu'elle est correcte
• Dans la pratique, on verra qu'il existe des conditions
suffisantes pour qu'un code soit uniquement déchiffrable.
9
Codage de source
10
Codage de source: Exemples
Pour chaque code, donné par l'ensemble des mots de
code des symboles, dire s'il est ou non uniquement
déchiffrable.
• C1 = {0, 11, 101} déchiffrable
• C2 = {00, 01, 101} déchiffrable
• C3 = {0, 01, 10} ambigu : C(ac) = 010 = C(ba)
• C4 = {000, 001, 01, 1} déchiffrable
• C5 = {000100,100101,010101,111000} déchiffrable
et de longueur fixe,
• C6 = {0, 01, 11} déchiffrable, mais délai non borné
11
Codage de source: Longueurs
• La longueur d'un mot m est le nombre de symboles (pas
forcément distinctes) qui le composent. On la note ℓ(m),
parfois |m|.
• On note ℓa(m), ou |m|a , le nombre d'occurrences de la
lettre « a » dans le mot m.
• Pour définir un code d’une source A = {a1,…,an}, on utilise
la notation C = {M1,…,Mn}, ce qui sous-entend C(ai) = Mi
• On a trivialement, pour tout mot mÎA*:
n
l (C (m)) = å lai (m) * l ( M i )
i =1
• Longueur maximale d'un code : L = max(ℓ(Mi ))
• Trivialement : ℓ(C(m)) ≤ L*ℓ(m)
12
Codes de longueur fixe
• Un code est dit de longueur fixe, si tout les mots de codes
associées aux symboles ont la même longueur :
"aiÎA: ℓ(C(ai))=L , avec L fixe
• Pour tout code non ambigu de longueur L d'une source A
de cardinal n, nous avons:
Log2(n) ≤ L
(dans le cas d’un alphabet de codage {0,1})
Preuve: Si 2L< n, on essaye de coder sur un ensemble plus
petit Þ perte d'injectivité. Donc L ³ log2(n).
• L’efficacité d'un tel code est donnée par H(A)/ log2(n) (qui
vaut 1 si la loi de A est uniforme).
13
Codes de longueur fixe
• Proposition : Pour toute source A de cardinal n, il existe un
code non ambigu de longueur L tel que
log2(n)≤ L < 1 + log2(n)
Preuve :
Soit L le plus petit entier tel que 2L ³ n, alors à la lettre aj
on associe l’écriture en base 2 de j, sur L bits. On a 2L-1 < n,
donc :L < 1+Log2(n)
• Corollaire :
Pour tout source sans mémoire A, il existe un codage non-
ambigu C de longueur fixe, dont l’efficacité est proche de
H(A)/Log2(n).
14
Codes de longueur fixe: Exemple
• Codage des Chiffres
Soit la source A = {0, 1,…., 9} munie de la loi de probabilité
uniforme. Le code de longueur fixe d'une telle source a une
longueur au moins 4. Par exemple:
19
Arbres de codes Préfixe
• Pour tout code préfixe, il existe un arbre dont les mots de
codes sont les feuilles. Chaque branche représente une lettre
de l’alphabet. On choisit les mots codes tels que leur chemin
ne contienne pas celui d’un autre …
21
Théorème de Kraft
• Soit un alphabet de source A de cardinalité n, et un alphabet
de codage C de cardinalité k.
• Théorème: (Kraft)
Il existe un code préfixe dont les « n » mots ont pour
longueur ℓ1, ℓ2, …. , ℓn si et seulement si:
n
åk
i =1
- li
£1
Tout code préfixe satisfait la condition de Kraft.
• Le théorème de Kraft nous caractérise les multi-ensembles
de longueurs qui sont les longueurs de codes préfixes.
22
Théorème de Mac-Millan
• Le théorème de Mac-Millan nous dit que ce sont aussi
exactement les multi-ensembles de longueurs des codes
uniquement déchiffrables qui satisfaisants la condition de
Kraft.
• Théorème: (Mac-Millan)
Il existe un code Uniquement déchiffrable dont les « n »
mots ont pour longueur ℓ1, ℓ2, …. , ℓn si et seulement si:
n
åk
i =1
- li
£1
Tout code uniquement déchiffrable satisfait la condition de
Kraft.
23
Kraft & Mac-Millan
• La combinaison des deux théorèmes montre que tout
code uniquement déchiffrable peut se ramener à un code
préfix de même distribution de longueur.
« C » uniquement déchiffrable Þ
Le code « C » vérifie l’inégalité de Kraft (Mac-Millan) Þ
Il existe un code « C ’ » de même longueur de mots codes
qui est préfixe (Kraft).
Donc pour chercher un code optimale il suffit de se
restreindre a la classe des codes préfixe.
(pour chaque code déchiffrable optimale il existe un code
préfixe de même longueur )
24
Kraft & Mac-Millan
• Grace au théorème de Kraft et Mac-Millan on est sûre
qu’un code préfixe optimale existe pour chaque source sans
mémoire.
• On préfère toujours les codes préfixe car il sont facile à
décodé, il suffit de suivre les sommet de l’arbre
correspondant depuis la racine (mot vide) jusqu’à la feuille
qui correspond à un symbole de l’alphabet A. on revient à
la racine chaque fois qu’un symbole est décodé jusqu’à
avoir décodé toute la séquence.
• La longueur de ce code optimal est maintenant bornée par
le théorème suivant :
25
Premier théorème de Shannon
• Ce théorème spécifie les bornes de la longueur minimale
d’un code déchiffrable préfixe pour une source sans
mémoire ainsi que l’efficacité correspondante.
• Théorème : Soit A une source de cardinalité n et de
distribution P, et d’entropie H(A). Alors il existe un code
préfixe de longueur moyenne L, sur un alphabet de
cardinalité m tel que :
H(A) H(A)
£L< +1
Log 2 (m) Log 2 (m)
26
Premier théorème de Shannon
• Dans le cas d’un alphabet de codage binaire ({0,1}),
l’inégalité devient :
27
Premier théorème de Shannon
• Sur la base du premier théorème de Shannon, plusieurs
algorithmes de codage d’une source sans mémoire ont été
élaborés.
• Le but de chaque algorithme est de construire un code
préfixe optimale pour une source A sur la base des
probabilités des symboles.
• L’optimalité du code construit est garantie par le premier
théorème de Shannon.
• L’efficacité du codage et toujours proche de 1 (égale à 1
dans le cas idéale )
• Dans ce qui suit, on expose les algorithmes les plus
connues de codage optimale d’une source discrète sans
mémoire.
28
Codage de Shannon-Fano
• Le code de Shannon-Fano est le premier code à avoir
exploité la redondance d’une source:
30
Codage de Shannon-Fano
31
Codage de Huffman
• Contrairement au code de Shannon-Fao La méthode de
Huffman est une méthode ascendante pour la construction
de l’arbre d’affectation des codes.
• L’arbre de Huffman est construit dans le sens feuilles ->
racine, chaque feuille représente un symbole de l’alphabet
de la source.
• Le code est construit ensuite à partir de l’arbre, chaque
symbole est codé par les symboles du chemin qui le relie à
la racine.
• La méthode de Huffman consiste à regrouper les deux
états les moins probables, puis à les traiter comme un seul
en sommant leur probabilité. Cette technique est réitérée
sur les états restants, jusqu’à ce qu’il n’en reste que deux.
32
Codage de Huffman
• On construit un arbre en partant des feuilles les plus
profondes, qui représentent les symboles de la source.
1. A chaque étape, on fusionne les feuilles les moins
probables en une seule.
2. La procédure s’arrête lorsque on aboutit à une feuille
unique constituée de tous les symboles.
3. Le parcours inverse de l’arbre fournit les mots du code.
33
Codage de Huffman: Exemple
• Soit A={a1,a2,a3,a4,a5} une source S.M avec:
P(a1)=0.35, P(a2)=0.22, P(a3)=0.18, P(a4)=0.15, P(a5)=0.1 :
35
Codage de Huffman
36
Codage de Huffman
• On peut montrer que le code de Huffman vérifie :
H(A) £ L < H(A) + 1
• Cette relation montre que le codage de Huffman s'approche
de l'entropie de la source et donc de l'optimum, elle peut
s'avérer en fait peu intéressante dans le cas où l'entropie est
très faible, et où un surcoût de 1 bit devient important.
• Une solution à ce problème est de travailler sur des blocs de
K symboles. On montre alors qu' on peut s'approcher de
façon plus fine de l'entropie:
1
H(A) £ L < H(A) +
K
mais le processus d'estimation des probabilités devient
plus complexe et coûteux.
37
Codage de Huffman
• Le codage de Huffman impose d'utiliser un nombre entier
de bit pour un symbole source, ce qui peut s'avérer peu
efficace.
• On peut conclure que même si le codage de Huffman est
très efficace, il n’est pas toujours le meilleur, mais il est
l’optimum des codes préfixe.
• Il est en général utilisé au second étage de compression,
une fois la redondance propre au média mise en évidence
par d'autres algorithmes. En particulier à la compression
JPEG pour les images, MPEG pour les vidéos et MP3 pour
le son, qui peuvent retirer les éléments superflus
imperceptibles pour les humains. On parle alors de
compression avec perte.
38
Codage Arithmétique
• Son principe est le codage d’une suite de symboles par une
séquence représentant une valeur fractionnaire de
l’intervalle réel [0,1], à travers une procédure récursive
encodant un signe à chaque itération.
• Il est basé sur la réduction de la largeur de l’intervalle réel
en fonction de la probabilité du nouveau symbole à
encoder ; la réduction est d’autant plus faible que le
symbole est probable.
• Nombre de bits de spécification inversement proportionnel
à la probabilité.
39
Codage Arithmétique
• Ce qui différencie le codage arithmétique des autres
codages source est qu'il encode le message entièrement et le
représente par un seul nombre r (flottant) alors que les
autres codages séparent le message d'entrée en les symboles
qui le composent et encodent ensuite chaque symbole par
un mot code.
• Par contre à l’algorithme de Huffman, le nombre de bits du
code de chaque symbole n’est pas forcément entier !
• Le codage arithmétique est toujours meilleur que le Codage
de Huffman sauf si dans l'arbre de Huffman tous les
probabilités des symboles sont des puissances de 2.
40
Codage Arithmétique
• A chaque symbole de l’alphabet de la source on associe un
intervalle inclus dans [0,1]. La taille de l’intervalle est
proportionnelle à la probabilité du symbole .
aiÎA®[ri, ri+P(ai)[ avec r0=0
• Un message à encoder est une chaîne de symboles, le
premier symbole détermine l’intervalle du code (la borne
inférieur est choisie).
• Cet intervalle est ensuite subdiviser en utilisent le même
principe (les probabilités) a chaque lecture d’un nouveau
symbole et on choisie le sous intervalle du symbole
suivant.
• Le code a la fin peut être n’importe quel valeur dans
l’intervalle finale.
41
Codage Arithmétique
• Après avoir associer à chaque symbole ai son intervalle
correspondant [ri, ri+P(ai)[, l’algorithme suivant permet de
coder une chaîne de symboles :
Inf:=0;
Sup:=1;
Tans qu’il y’a un symbole « c » faire:
Sup:=inf+(Sup-inf)*BornSup[c];
inf:=inf+(Sup-inf)*BornInf[c];
c:=LireCarSuivant();
A la fin la valeur inf est le code du message , sa peut aussi
être n’importe quel valeur dans l’intervalle [inf, Sup[.
42
Codage Arithmétique: Exemple
Soit A={a, b, c, d} avec Prob. {0.2,0.5,0.2,0.1}
On associe donc les intervalles comme suite:
a®[0,0.2[
b ®[0.2,0.5+0.2[=[0.2,0.7[
c ®[0.7,0.7+0.2[=[0.7,0.9[
d ®[0.9,0.9+0.1[=[0.9,1[
Ainsi pour coder « a » on peut utiliser 0, 0.1, 0.12,
0.1999.. Ou n’importe quel valeur dans [0,0.2[.
La même chose pour b, c et d autant que symboles.
Pour coder maintenant un message on applique
l’algorithme, par exemple coder : « cbaabd »
43
Codage Arithmétique: Exemple
Le premier symbole est « c » , on choisie l’intervalle [0.7,0.9[
Le symbole suivant est «b» donc le nouvel intervalle est:
[0.7+(0.9-0.7)*0.2 , 0.7+(0.9-0.7)*0.7 [ = [0.74,0.84[
Le symbole suivant est « a » donc le nouvel intervalle est :
[0.74+(0.84-0.74)*0, 0.74+(0.84-0.74)*0.2 [ = [0.74,0.76[
Symbole Borne Inf Borne Sup
c 0.7 0.9
b 0.74 0.84
a 0.74 0.76
a 0.74 0.744
b 0.7408 0.741
d 0.7426 O.7428
45
Codage Arithmétique: Exemple
Le décodage se fait par l’algorithme suivant :
r:=val; message:=‘’;
Répéter {si rÎ[ri,ri+P(ai)[ alors message:=message+ai
r:=(r-ri)/P(ai)} Jusqu’à décodé tout le message;
En appliquant sur l’exemple on trouve :
r= 0.7426 Î[0.7,0.9[ ® « c »
r= (0.7426-0.7)/0.2= 0,213 Î[0.2,0.7[ ® « b »
r= (0.213-0.2)/0.5= 0,026 Î[0,0.2[ ® « a »
r= (0.026-0)/0.2= 0, 13 Î[0,0.2[ ® « a »
r= (0.13-0)/0.2= 0,65 Î[0.2,0.7[ ® « b »
r=(0.65-0.2)/0.5= 0,9 Î[0.9,1[ ® « d » ® Fin
47
Codage Arithmétique
• En terme informatique on ne peut pas se permettre de
stocker des fractions non calculées, il y a donc des erreurs
au niveau des arrondis, mais ce type de codage va faire les
mêmes erreurs au décodage qu'à l'encodage et évite donc
cet écueil.
• Couvert par des brevets détenus par IBM, AT&T et
MITSUBISHI => utilisation soumise à la détention d’une
licence.
• Utilisé pour la compression de données : programmes et
fichiers) ainsi que pour la compression d’images (ex :
JPEG2000) à condition d’en détenir la licence.
• Ce codage et plus performant que celui de Huffman.
48
Codage de Lampel-Ziv
• A partir des années 70’s, les chercheures tendent à
remplacer l’algorithme de Huffman par des méthodes
adaptatifs plus performants.
• Une approche radicalement différente et prometteuse à été
introduite par Abraham Lempel et Jacob Ziv en 1977.
• Cette technique consiste actuellement en deux algorithmes
différents LZ77 et LZ78 , chacun avec plusieurs variantes :
Variantes de LZ77 LZR LZSS LZB LZH
Variantes de LZ78 LZW LZC LZT LZMW LZJ LZFG
50
Lampel-Ziv: l’algorithme LZ78
• LZ78 insère des parties non chevauchées du messages sous
forme d’un symbole ou d’une chaine de caractères dans le
dictionnaire. Une partie du message est sous la forme
a1a2….an-1an, sont préfixe correspondant est a1a2….an-1. Le
dictionnaire ici est implémenter sous forme d’une table
indexé.
• LZ78 peut produire en sortie l’un des trois codes :
Si le symbole n’est pas dans le
(0, Symbole)
dictionnaire
Si la chaîne de caractères (le
(Préfix-index , Dernier-Symbole) préfixe) n’est pas dans le
dictionnaire
Si le dernier symbole ou la
(Préfix-index, ‘’) dernière chaîne n’est pas dans le
dictionnaire
51
Lampel-Ziv: l’algorithme LZ78
• L’algorithmes de compression se présente comme suite:
Dictionary ¬ [] ;
Prefix ¬ ‘’ ;
Dictionary_Index ¬ 1;
While (Source n‘est pas vide)
{ Char ¬ Symbole_suivant(Source);
if (Prefix + Char existe dans le Dictionnaire) Prefix ¬ Prefix + Char ;
else { if (Prefix =‘’) Code_du_Prefix ¬ 0
else Code_du_Prefix ¬ Index _Dictionnaire(Prefix) ;
Output (Code_du_Prefix , Char) ;
Insérer_Dictionnaire(Dictionary_Index , Prefix + Char);
Dictionary_Index:= Dictionary_Index+1;
Prefix ¬ ‘’;
}
}
If (Prefix<>’’) {Code_du_Prefix ¬ Index _Dictionnaire(Prefix) ;
Output (Code_du_Prefix , ‘’ ) }
52
Lampel-Ziv LZ78: Exemple (1)
• Compresser la chaîne ABBCBCABABCAABCAAB :
Dictionary ¬ [];
Dictionary_Index ¬ 1 ;
While (Il y’a des paires (Code, Symbole) dans le code compressé )
{ Code ¬ Code suivant dans le code compressé ;
Char ¬ Symbole correspondant à Code ;
if (Code= 0) String ¬ ‘’;
else String ¬ la chaîne d’index Code dans Dictionary;
Output (String + Char) ;
Insérer_Dictionnaire (Dictionary_Index , String + Char ) ;
Dictionary_Index:= Dictionary_Index+1;}
58
Lampel-Ziv: Décompression (Exemple 1)
• Décompression de: (0,A),(0,B),(2,C),(3,A),(2,A),(4,A),(6,B)
62
Codage RLE: Run Length Encoding
• Le run-length encoding, appelé en français le codage par
plages, est un algorithme de compression de données en
sans perte.
• Au début, l’algorithme s'appliqué essentiellement à des
documents scannés en noir et blanc : au lieu de coder un bit
par point, on dispose d'un compteur (en général sur un
octet) indiquant combien de points blancs ou noirs se
suivent.
• Comme il est rare de ne pas avoir au moins 8 pixels noirs ou
8 pixels blancs qui se suivent, et que 256 ne sont pas rares
sur les endroits vierges ou les à-plats noirs, le système a bien
pour effet une compression.
63
Codage RLE: Run Length Encoding
• Par exemple, considérons un écran de texte noir sur fond
blanc. Il sera constitué de longues séquences de pixels blancs
pour le fond, et de courtes séquences de pixels noirs pour le
texte. Représentons une ligne d'un tel écran, avec B pour les
pixels noirs et W pour les pixels blancs :
WWWWWWWWWWWWBWWWWWWWWWWWWWWBBBWWWWWWWWWWWWWWWW
WWWWWWWBWWWWWWWWWWW
66
Conclusion
67