Vous êtes sur la page 1sur 67

Chapitre 3: Codage de Sources

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

• Un autre problème potentiel est le délai : nombre de


symboles de code qu'on peut avoir besoin d'examiner au-
delà de ceux qui codent une lettre, avant de pouvoir
décoder cette lettre.
• Exemple de C= {0, 01, 11} : uniquement déchiffrable, mais
pour décoder 011…..1 il faut connaître la parité du nombre
de 1 consécutifs avant d'être capable de décoder la
première lettre (délai non borné).

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:

L’efficacité de ce code est égale :H(X)/4 = log2(10)/4 = 0. 83


En les regroupant 3 par 3, on a un cardinal de 1000, qu'on
code sur 10 bits (210 = 1024).L'efficacité est donc :
log2(1000)/10= 0.9965 15
Codes de longueur Variable
Un code est dit de longueur variable si les longueurs des
mots de codes C(ai) ne sont pas tous identiques :
$ ai,aj ÎA : ℓ(C(ai)) ≠ ℓ(C(aj))
La longueur des mots varie en fonction de leur fréquence
d’apparition. Un mot sera d’autant plus long que sa
probabilité d’apparition sera petite.
La longueur moyenne d’un code à longueur variable est
donnée par :
L= å P(a ).l (C(a ))
a i ÎA
i i

Dans ce qui suit, on détermine les condition d’existence d’un


code déchiffrable, et ceux qui permettent de trouver le code
déchiffrable optimale (de longue moyenne minimale).
16
Codes Préfixes
• Un mot m est un préfixe d'un mot m’, s'il existe un mot w
tel que m’ = mw.

• Pour prouvé qu’un code est déchiffrable il suffit de vérifier


qu’il est préfixe (condition suffisante mais pas nécessaire ) :
Préfixe Þ uniquement déchiffrable
X Préfixe
Uniquement déchiffrable Þ
17
Codes Préfixes
• Preuve du théorème :
Par l'absurde : on suppose que le code est ambigu.
§ Soit w = C(u) = C(u’) un mot de code ambigu
§ Soit v le plus long préfixe commun de u et u’ :
u = v.ai.u1, u’ = v.aj.u2 avec i≠ j
w = C(v).C(ai.u1) = C(v).C(aj.u2), donc C(ai.u1) = C(aj.u2)Þ
C(ai).C(u1) = C(aj).C(u2)
§ Deux cas sont possibles :
1. ℓ(C(ai))≤ ℓ(C(aj)) :alors C(ai ) est un préfixe de C(aj )
(comme préfixe de longueur ℓ(C(ai)) du mot C(aj.u2), le
code n'est donc pas préfixe ;
2. ℓ(C(aj))< ℓ(C(ai)) :inversement, C(aj ) est un préfixe
(strict) de C(ai ), et le code n'est pas préfixe
18
Codes Préfixes : Exemples

{a1®0, a2 ®11, a3 ®11, a4 ®10} : Code Ambigu


{a1®0, a2 ®010, a3 ®01, a4 ®10} : non Ambigu mais
pas déchiffrable (010 = a2 ou a1a4 ou a3a1)
{a1®1, a2 ®10, a3 ®100, a4 ®1000} : Déchiffrable mais pas
préfixe
{a1®0, a2 ®10, a3 ®110, a4 ®111} : Code préfixe donc
déchiffrable
{a1®10, a2 ®00, a3 ®11, a4 ®110} : Déchiffrable mais pas
préfixe

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 …

• On dira que le code est irréductible si les nœuds de son


arbre ont soit 0 soit 2 fils. On préférera les codes
irréductibles, car ils sont plus courts.
20
Codes Préfixes : Récap.
• Le but du codage de la source est de trouver un codage
Optimale : de longueur moyenne minimale
• En même temps, il faut que ce code soit déchiffrable
(codage non ambigu)
• Si le code est préfixe alors il est déchiffrable mais l’inverse
n’est pas toujours vrai, et pour assuré la déchiffrabilité il
est préférable que le code optimal soit préfixe.
est ce qu’il est possible que pour une source A, le codage
déchiffrable optimale ne soit pas préfixe?

• La réponse est donnée par le théorème de Kraft et Mac-


Millan

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 :

H(A) £ L < H(A) + 1


• Le cas particulier d’égalité H(A)=L se produit quand les
probabilités des symboles sont des puissances de deux :
p(ai)=2-l(C(ai)) :distribution dyadique.
• Dans ce cas le code est appelé code complet.
• Puisque l’efficacité est donnée par H(A)/L, le théorème
indique que pour chaque source sans mémoire il existe un
code préfixe d’efficacité arbitrairement proche de 1.

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:

1. Ranger les symboles de A par probabilités décroissantes.


2. Subdiviser les symboles en 2 groupes G0 et G1 de
probabilités voisines, sans modifier l’ordre dans lequel ils
ont été rangés en l’étape 1.
3. Chaque groupe Gi est subdivisé en 2 sous-groupes Gi0 et
Gi1 de probabilités aussi voisines que possibles, une fois
encore sans modifier l’ordre des symboles.
4. La procédure s’arrête lorsque chaque sous-groupe est
constitué d’un unique élément. L’indice du groupe donne
le mot de code.
29
Codage de Shannon-Fano
• 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:
Symbole P(ai) Étape 1 Étape 2 Étape 3 Code
a1 0.35 0 0 00
a2 0.22 0 1 01
a3 0.18 1 0 10
a4 0.15 1 1 0 110
a5 0.10 1 1 1 111

La longueur moyenne est L=2.25 à comparer avec l’entropie


H(A)=2.19.

30
Codage de Shannon-Fano

• L'approche du codage de Shannon-Fano est descendante :


l'algorithme part de l'ensemble des symboles et divise cet
ensemble récursivement jusqu'à arriver à des parties ne
contenant qu'un seul symbole.
• L'inconvénient de cette approche est que, lorsqu'il n'est pas
possible de séparer un ensemble de symboles en deux
sous-ensembles de probabilités à peu près égales (c'est-à-
dire lorsque l'un des sous-ensembles est beaucoup plus
probable que l'autre), les codes produits ne sont pas
optimaux.

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.

Si, au cours de l'algorithme de Huffman, on a à un certain


moment des probabilités égales, il se peut que la
répartition des longueurs (profil de l'arbre) ne soit pas
unique.

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 :

• Finalement, le parcours inverse de l’arbre fournit le résultat


suivant : a1 ® 00; a2 ® 10; a3 ® 11; a4 ® 010; a5 ® 011.
• On aboutit à L = 2.25, à comparer à H(S) = 2.19.
34
Codage de Huffman: Exemple

35
Codage de Huffman

• On appelle parfois codage de Huffman d'un texte, le codage


obtenu en prenant pour probabilités des différentes lettres
leurs fréquences relatives d'apparition dans le texte.
• Nécessité d'avoir/de faire au préalable des statistiques sur
les probabilités d'occurrence des symboles de l'alphabet. On
peut remédier a ce problème en utilisant un algorithme de
codage adaptatif qui calcule les statiques a la volée et les
affiné au fil du codage.
• Le codage de Huffman ne se base que sur la fréquence
relative des symboles d'entrée (suites de bits) sans
distinction pour leur provenance (images, vidéos, sons, etc.).

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

Le code de « cbaabd » est donc 0.7426


44
Codage Arithmétique: Exemple

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

La taille du message doit être connue au préalable (sinon on


peut bouclé à l’infinie)
46
Codage Arithmétique

• La valeur réelle obtenu est convertie en binaire avant le


stockage: 0.7426= 1110100000010 (13 bit=-log2(0.0001))
• Ce qui donne un taux de 2.1 bit par symbole. Qui est très
proche de l’entropie du message 1.901.
• La notion de longueur moyenne n’existe pas dans le codage
arithmétique, car chaque codage est dépanadant de la taille
du message à codé et de sont entropie.
• Tans que la taille est grande, l’entropie du message converge
vers l’entropie de la source, le codage arithmétique est plus
performant pour les long messages, mais la précision du
calcule arithmétique pose quelque limites.

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

• Les Zip et le Winzip utilisent la variante LZH, tandis que


UNIX utilise LZW et LZC.
• Tout les variantes utilisent le même principe de base, celui
d’un dictionnaire dynamique.
49
Codage de Lampel-Ziv
• La différence entre les différents variantes réside dans la
représentation du dictionnaire et la sélection des préfixes.
• Un dictionnaire des mots préfixes est construit
dynamiquement à partir du texte (la source) à compresser
(coder). Chaque mot est ensuite remplacer par sont index
dans le dictionnaire.
• Lors de la décompression, le même dictionnaire est
reconstruit est les codes sont remplacer par leurs préfixes
correspondants.
• Ce principe est illustré dans ce qui suit sur la variante LZ78
originale.

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 :

• Le code en sortie: (0,A)(0,B)(2,C)(3,A)(2,A)(4,A)(6,B)


• Ceci n’est qu’une représentation, la manière de coder la
sortie sera discutée plus tard.
53
Lampel-Ziv LZ78 : Exemple(2)
• Compresser la chaîne BABAABRRRA :

• Le code en sortie est :(0,B)(0,A)(1,A)(2,B)(0,R)(5,R)(2, )


54
Lampel-Ziv LZ78: Exemple(3)
• Compresser la chaîne AAAAAAAAA :

1. A Ï Dictionnaire Þ insérer A et sortie (0,A)


2. A Î Dictionnaire
AA Ï Dictionnaire Þ insérer AA et sortie (1,A)
3. A Î Dictionnaire
AA Î Dictionnaire
AAA Ï Dictionnaire Þ insérer AAA et sortie (2,A)
4. A Î Dictionnaire
AA Î Dictionnaire
AAA Î Dictionnaire et fin de la chaîneÞ sortie (3,’’)
55
Lampel-Ziv LZ78 : (bits transmises)
• Par exemple la chaîne : ABBCBCABABCAABCAAB
contient : Nombre de bites= 18*8=144 bits
• Supposez que les mots de codes sont indexé à partir de 1:
Mots de code (0, A) (0, B) (2, C) (3, A) (2, A) (4, A) (6, B)
Indexes 1 2 3 4 5 6 7
• Chaque mot de code est composé d’un symbole et d’un
nombre entier, le symbole est sur 8 bits, alors que le nombre
de bits n pour codé la partie nombre du code d’indexe i est
donnée par :
ì1 si i = 1
n=í
î[Log2 (i)] si i > 1
• Car la valeur du nombre ne peut être que inférieur à celle de
l’index (i-1 au maximum)
56
Lampel-Ziv LZ78 : (bits transmises)

Mots de code : (0, A),(0, B),(2, C),(3, A),(2, A),(4, A),(6, B)


Indexes 1 2 3 4 5 6 7
Nbr. de bits: (1+8) + (1+8) + (2+8) + (2+8) + (3+8) + (3+8) + (3+8)= 71 bit
Le message compresser est :0A0B10C11A010A100A110B
en remplaçant chaque symbole par sa valeur 8 bits.
57
Lampel-Ziv LZ78 : Décompression
• L’algorithme de décompression d’un code produits par
LZ78 est donné comme suite :

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;}

• En entré : liste des couples (code, symbole); en sortie la


chaîne de caractères décompressée.

58
Lampel-Ziv: Décompression (Exemple 1)
• Décompression de: (0,A),(0,B),(2,C),(3,A),(2,A),(4,A),(6,B)

• Le résultat est : ABBCBCABABCAABCAAB


59
Lampel-Ziv:Décompression (Exemple 2)
• Décompression de: (0,B),(0,A),(1,A),(2,B),(0,R),(5,R),(2,’’)

• Le résultat est : BABAABRRRA


60
Lampel-Ziv: Décompression (Exemple 3)
• Décompression de: (0, A) (1, A) (2, A) (3,’’)

• Le résultat est : AAAAAAAAA


61
Codage de Lampel-Ziv
• Le problème majeure de l’approche Lampel-Ziv est la taille
du dictionnaire qui risque d’occuper trop de mémoire.
• Pour les gros fichiers, il ne faut pas saturer la mémoire avec
un trop gros dictionnaire. Une stratégie consiste à
recommencer à zéro quand on a lu un certain nombre de
caractères.
• Une autre consiste à recommencer à zéro quand le
dictionnaire atteint une certaine taille. Cette éventuelle
optimisation doit être prise en compte lors de la
décompression.
• L’idéal étant de maintenir l’espace mémoire utilisé par le
programme en dessous d’un certain seuil, 1 Mo par
exemple.

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

Un encodage RLE consiste alors à indiquer pour chaque


suite de pixels d'une même valeur, le nombre de pixels de
cette séquence. Le résultat comporte en général moins de
caractères, bien que ce ne soit pas une obligation. On obtient
par exemple pour la ligne précédente :
12W1B14W3B23W1B11W
64
Codage RLE: Run Length Encoding
Tandis que le codage de
WBWBWBWBWB
Donnerait
1W1B1W1B1W1B1W1B1W1B
Qui est deux fois plus long.
• En réalité la compression RLE est régie par des règles
particulières permettant de compresser lorsque cela est
nécessaire et de laisser la chaîne telle quelle lorsque la
compression induit un gaspillage.
• La méthode RLE est utilisée dans le format BMP (noir &
blanc, 16 couleurs et 256 couleurs). RLE est aussi utilisé pour
les fax Groupe 3 et Groupe 4 (Recommandations ITU-T T.4
et T.6), son usage le plus fréquent hors informatique.
65
Conclusion
• Plusieurs autres algorithmes de compression plus
sophistiquées ont été développés, qui peuvent atteindre
des taux de compression encore plus optimales (plus
proche de l’entropie):
– Huffman Adaptatif
– Arithmétique Adaptatif
– Burrows-Wheeler (BWT)
– Deflat ; RAR
– …..

• Certaines applications utilisent une combinaison (en série)


de plusieurs techniques pour atteindre des taux meilleurs.

66
Conclusion

• Tout les techniques décrites ici font partie des méthodes


de compression réversible (sans perte): les données sont
exactement restituée après décompression.
• Pour certaines types de données, ceci n’est pas
obligatoirement nécessaire (on peut toléré une distorsion
de l’information restituée par rapport à l’originale) comme
il est le cas pour les images, la vidéo et le son.
• Ainsi, pour ce types de données, une transformation initial
est appliqué au données pour réduire l’entropie et
augmenté la redondance (DCT, ondelettes,…). C’est le cas
des normes JPEG, MPEG,DIVX, et MP3.

67

Vous aimerez peut-être aussi