Vous êtes sur la page 1sur 12

Institut Des Sciences Appliquées et Économiques

Le cnam – Liban

TP ELE109 : Codage de source


Manipulation n° 3

Garen Arabkirlian
Contents
1. Etude du code de Huffman ....................................................................................................................................... 3
a. Tracer la distribution de cette source en utilisant la fonction histogram ............................................................ 3
b. Calculer l’entropie de cette source en supposant les caractères indépendants. On pourra utiliser la
commande .................................................................................................................................................................... 3
c. Utiliser la fonction huff_tbl.m après avoir identifié les entrées et les sorties. En déduire le nombre de
bits moyens par caractère obtenu pour cette source. Ce résultat est-il cohérent avec la théorie ? ........................... 4
d. Utiliser la fonction huff_enc.m après avoir identifié les entrées et les sorties. Vérifier le nombre de bits
moyens calculé précédemment. Calculer le taux de compression par rapport aux caractères initiaux. On utilisera le
fait que les caractères initiaux sont codés en ASCII, qui utilise 7 bits pour un texte non accentué. Comparer les
performances obtenues avec un logiciel de compression standard (zip, …). ............................................................... 6
e. Proposer un algorithme pour le décodage de Huffman. Réaliser votre propre fonction ou utiliser la fonction
huff_dec.m après avoir identifié les entrées et les sorties. Vérifier que vous retrouvez le texte original. ........... 7
2. Application à la compression d’image fixe JPEG ........................................................................................................... 8
a. Etudier la routine Matlab tp_huffman_part2.m qui réalise l’opération simplifiée d’encodage puis de décodage
JPEG (ainsi que les routines associées). ........................................................................................................................ 8
b. Tracer l’histogramme des données avant et après la DCT. .................................................................................. 8
c. Calculer l’entropie des données avant la DCT. ..................................................................................................... 8
d. Déterminer le facteur de compression en utilisant la table de quantification originale, puis en multipliant la
table de quantification par un facteur variant de 0.5 à 16. En déduire l'influence de la table de quantification. ...... 9
e. Etudier la perte de qualité due à la compression. Comparer les erreurs de codage pour différentes tables de
quantification. ............................................................................................................................................................... 9
f. Evaluer les performances obtenues...................................................................................................................... 9
1. En calculant le Peak Signal to Noise Ratio (PSNR) ............................................................................................ 9
2. En évaluant visuellement la qualité de l’image restituée. ................................................................................ 9
1. Etude du code de Huffman

a. Tracer la distribution de cette source en utilisant la fonction histogram

x=0:29;
histo=hist(chaine_res,x);
figure;bar(x,histo);title("Distribution du source");

On obtient l’histogramme suivante, qui représente la distribution du source.

b. Calculer l’entropie de cette source en supposant les caractères indépendants. On pourra


utiliser la commande

On definit l’entropy par :

On applique la fonction « entropy_cnam », on obtient :


u=histo+eps;
Entroy_cnam_fonction =entropy_cnam(u)

entropy_theorique = log2(30)
Résultats :

Entroy_cnam_fonction =

4.0951

entropy_theorique =

4.9069

c. Utiliser la fonction huff_tbl.m après avoir identifié les entrées et les sorties. En déduire
le nombre de bits moyens par caractère obtenu pour cette source. Ce résultat est-il cohérent
avec la théorie ?
On applique la fonction huff_tb1.m, on utilise comme entrée le vecteur « histo », de la distribution de la source, mais
sa transpose (histo’).

D’où on peut appeler la fonction en appliquant :

huff_tbl(histo')

Et on obtient comme sortie, 3 tableaux :

Np et ptr :
Et enfin, la réponse (dont on s’intéresse) : C’est le tableau de Huffman :

Ce tableau attribue le nombre de bit à un caractère, en relation avec la probabilité de cette caractère.

Structuré tel que la dernière colonne est le nombre de bit attribué à l’alphabet. (26 lettres + 4 symboles). Par
exemple, l’élément ans (1,12) indique la lettre « a », qui est représenté en 4 bits, le même pour le lettre « b » etc…

Le principe du tableau de Huffman, est de donner les caractères qui sont plus fréquents (Grande probabilité) un
nombre de bit plus petit que celles qui le sont moins fréquents (Petit probabilité). Ceci est dans le but d’abaisser le
nombre moyenne de bit par caractère, et par suite de n’importe quel texte.

D’où on peut calculer le nombre de bit moyenne par caractère, tel que :

proba=huff_tbl(histo');

somme=sum(histo);

Avg_bit_per_symbol = sum(proba(:,12).*histo'/somme)

On obtient :

Avg_bit_per_symbol =

4.1264
d. Utiliser la fonction huff_enc.m après avoir identifié les entrées et les sorties. Vérifier le
nombre de bits moyens calculé précédemment. Calculer le taux de compression par rapport
aux caractères initiaux. On utilisera le fait que les caractères initiaux sont codés en ASCII, qui
utilise 7 bits pour un texte non accentué. Comparer les performances obtenues avec un
logiciel de compression standard (zip, …).

La fonction « huff_enc.m » sert à encoder la chaine résultante des caractères. Prend comme entrée le tableau de
huffman transposé et la chaine de caractères résultante + 1.

On applique la fonction tel que :

encoding=huff_enc(proba,chaine_res+1);

ASCII_length = length(chaine_res)*7; % if coded in ASCII 7bit per character


Encoded_length = length(encoding);

verification = Encoded_length/8 % size in bytes

rate = (1-(Encoded_length/ASCII_length))*100 % compression rate in percentage

On obtient :

verification =

3345

rate =

41.0508 %

Si on compresse le fichier data.txt à l’aide du logiciel WinRar en un fichier ZIP. On obtient, la grandeur du fichier
compressé : Size(Zip) = 3048 bytes
e. Proposer un algorithme pour le décodage de Huffman. Réaliser votre propre fonction ou
utiliser la fonction huff_dec.m après avoir identifié les entrées et les sorties. Vérifier que
vous retrouvez le texte original.
La fonction « huff_dec.m » prend comme entrée le tableau de Huffman et la chaine encodée, et retourne la
chaine décodée.

On applique le décodage sur la chaine encodée précédemment :

decode = huff_dec(proba,encoding)-1 % substraction in order to get the


original ordering of 0 to 29

On obtient comme réponse le texte original !


2. Application à la compression d’image fixe JPEG
a. Etudier la routine Matlab tp_huffman_part2.m qui réalise l’opération simplifiée d’encodage
puis de décodage JPEG (ainsi que les routines associées).
Après l’étude de la routine Matlab tp_huffman_part2.m on réalise que le programme fonction comme suit :

1. Lire l’image de type bmp


2. Stockage des valeurs des pixels de l’image dans « lenna_im ». En plus son colormap dans « map »
3. Convertir les valeurs de « lenna_im » de type uint8 en type double et leur stocker dans le tableau « fin »
4. Décalage des valeurs de « fin » par 128 bits et stockage dans le tableau « f »
5. Diviser l’image en des blocs 8*8 égaux
6. Appliquer la transformée en cosinus discrète 2D sur chaque bloc 8*8 (2 fois, l’une sur lignes et l’autre sur
colonnes) et stockage des nouvelles valeurs dans « Ff »
7. Arrondissement des valeurs du tableau « Ff »
8. Quantification à l’aide du tableau Q et division élément par élément avec le tableau résultant « Ff »
9. Les éléments de chaque bloc de « Ff » sont sérialisés par la méthode Zig-zag scanning
10. Encodage en utilisant le codage de Huffman
11. Décodage de la même séquence encodée
12. Reconstruction de l’image et stockage dans « Ffout »
13. Appliquer la transformée en cosinus inverse sur des blocs 8*8 du tableau résultante « Ffout »
14. Décalage positive par 128 bits
15. Sauvegarder et tracer l’image résultante « toto.bmp »

b. Tracer l’histogramme des données avant et après la DCT.

Code :

x=-128:1:127;
figure(3)
hist(f(:),x);title("Before DCT");
figure(4)
x=-128:1:127;
hist(Ff(:),x);title("After DCT");

c. Calculer l’entropie des données avant la DCT.


Code :

histo2 = hist(f(:),x);title("Before DCT");

E = entropy_cnam(histo2+eps)
Résultat :
E=

7.5683

d. Déterminer le facteur de compression en utilisant la table de quantification originale, puis en


multipliant la table de quantification par un facteur variant de 0.5 à 16. En déduire l'influence
de la table de quantification.
coef 0.5 1 1.5 2 2.5 3 3.5 4 4.5 5 5.5 6 6.5 7 7.5 8

-
compressi 38.9 27.0 38.3 47.0 53.3 56.8 60.0 63.1 65.4 67.5 69.3 71.0 72.5 73.8 71.9
on rate(%) 1 6.22 7 6 5 7 2 3 8 3 9 5 2 1 3 1
coef 8.5 9 9.5 10 10.5 11 11.5 12 12.5 13 13.5 14 14.5 15 15.5 16

compressi 75.9 76.8 77.6 78.4 79.1 79.7 80.4 81.5 81.9 82.8 83.2 83.6 83.9 84.1
on rate(%) 2 3 3 1 7 6 2 80.9 1 7 82.5 7 8 7 3 4

e. Etudier la perte de qualité due à la compression. Comparer les erreurs de codage pour
différentes tables de quantification.
Durant la quantification on divise chaque bloc 8*8 de l’image « initial lenna_im » par une division élément par
élément avec la matrice Q. D’où Q est inversement proportionnel à la qualité de l’image résultante.

f. Evaluer les performances obtenues


1. En calculant le Peak Signal to Noise Ratio (PSNR)

Power = (max(fin(:)))^2;
MSE = (sum(sum((fin - Ffoo).^2)))/( mf * nf );
PSNR = 10 * log10(Power/MSE)

On obtient le suivant pour diffèrent valeurs de coef :

coef 1 4 8 12 16
PSNR 32.29 27.81 25.27 23.61 22.54

2. En évaluant visuellement la qualité de l’image restituée.


Image originale :

Coef = 1 :
Coef = 8 :

Coef = 12 :
Coef = 16:

Vous aimerez peut-être aussi