Vous êtes sur la page 1sur 29

Université Mohammed-V de Rabat

École Nationale supérieure d’Arts et Métiers de Rabat

Département génie électrique

Compte rendu
TP :

COMPRESSION JPEG

Réalisé par : Encadre par :


Nouhaila aithssain Abdelilah JILBAB
Loubna mham
Rajaa lamaangar
TP : COMPRESSION JPEG

Objectif de TP :
Le TP vise à explorer et à mettre en œuvre les divers blocs du codeur JPEG. Il vous est
demandé de coder ces blocs spécifiques pour comprimer l'image, puis d'analyser leurs impacts
sur le taux de compression et la qualité de l'image.

Les étapes de compression :

La chaîne de compression/décompression JPEG s'articule autour de deux catégories


fondamentales, chacune définissant une approche distincte : le codage/décodage avec perte et
le codage/décodage sans perte. Dans le premier cas, le processus de compression induit une
perte d'information, permettant une réduction significative de la taille du fichier, mais au prix
d'une diminution perceptible de la qualité visuelle. À l'inverse, le second scénario vise à
préserver l'intégralité des données originales, assurant ainsi une restitution fidèle de l'image,
mais avec une compression moins agressive. Cette dualité offre aux concepteurs une
flexibilité cruciale en fonction des impératifs spécifiques liés à la taille du fichier et à la
préservation de la qualité dans le contexte de la compression d'images.
Partie I : Codage avec perte
Le principe de base de la compression JPEG consiste à effectuer sur chaque bloc LxL de
l’image (L=8) les opérations représentées sur le schéma suivant :

1. Ecrire une fonction, que l’on appellera "coder.m" qui regroupe les étapes suivantes :
 Calculer la DCT d’une image Img (pour cela on utilisera la fonction Matlab
"dct2.m"). Le calcul se fait par fenêtre de 8x8.
 Calculer les indices de quantification sur les blocs transformés de taille LxL.
Pour cela on divise les coefficients par une matrice Q, et on conserve uniquement
la partie entière.
 Retourner l’ensemble des blocs transformés indicés (dans une matrice de mêmes
dimensions que l’image originale).

La syntaxe d’appel de cette fonction devra être : [ImgTr] = coder (Img,L,Q).


 Programme :
2. Donner un script de programme principal pour faire les tests. On écrira un programme
principal qui utilise la fonction coder de la question précédente. On définira dans ce
programme une matrice de quantification standard de la norme JPEG, donnée par :
Q_Stand= [16 11 10 16 24 40 51 61 ;
12 12 14 19 26 58 60 55 ;
14 13 16 24 40 57 69 56 ;
14 17 22 29 51 87 80 62 ;
18 22 37 56 68 109 103 77 ;
24 35 55 64 81 104 113 92 ;
49 64 78 87 103 121 120 101 ;
72 92 95 98 112 100 103 99]
 Programme :

3. Ecrire la fonction de décodage : [ImgRec] =decoder(ImgTr,L,Q) qui :


 Pour chaque bloc d’indices (pixels transformés), multiplie ceux-ci par les pas de
quantification correspondants (multiplication de matrices point à point) pour obtenir
le bloc transformé quantifié,
 Puis on calcule la DCT inverse (idct2.m).
 Programme :

4. Compléter le programme principal pour faire des tests des fonctions coder et decoder.
 Programme :

5. Ecrire la fonction [D]=distimage (Img,Imgrec) qui calcule la distorsion moyenne (écart


quadratique moyen) entre l’image originale et l’image reconstituée.
6. On demande de tester les fonctions définies précédemment sur une image pour
différentes matrices de quantification Q :
6.1. Avec une quantification optimale utilisant la matrice de ‘pas’ définie dans le
standard JPEG.
 Programme :

 Exécution :

Figure 1 : Image originale


Figure 2 : Image Transformée

Figure 3 : Image Reconstituée


Figure 4 : Image Reconstituée
6.2. Avec une quantification uniforme : Q= q*ones(L, L) où q=5.
 Programme :
 Exécution :

Figure 5 : Image originale


Figure 6 : Image Transformée

Figure 7 : Image Transformée

Figure 8 : Différence d'Image


6.3. Avec des versions dégradées de ces matrices (c'est-à-dire avec des pas de
quantification multipliés par un facteur 2p, à essayer pour p = 1 (réduction d’un bit
par pixel a priori) et p=2 (réduction de 2 bits par pixel).
 Programme :
 Exécution :

Figure 9 : Image originale


Figure 10 : Quantification standard

Figure 11 : Quantification dégradé p=1

Figure 12:Quantification dégradé p=2


Figure 13 : Reconstruction avec quantification standard
Figure 14: Reconstruction avec quantification dégradé p=1

Figure 15:Reconstruction avec quantification dégradé p=2

Figure 16: Distorsion avec quantification standard


Figure 17:Distorsion avec quantification dégradée p=1

Figure 18:Distorsion avec quantification dégradée p=2


7. Tracer les histogrammes des indices de quantification obtenus dans chaque cas de la
question précédente. Interpréter ces histogrammes en mettant l’accent sur les points
suivants :
 Estimation du nombre de bits nécessaires (sans faire appel à une technique de
codage sans pertes) pour transmettre à priori les indices de quantification (pixels
transformés).
 Remarque sur le nombre de valeurs nulles.

 1 er cas :
 Programme et interprétation :

 Exécution :
Figure 19: Histogramme des indices de quantification de 1er cas

 2 -ème cas :
 Programme et interprétation :
 Exécution :

Figure 20:Histogramme des indices de quantification de 2-ème cas


 3 -ème cas :
 Programme et interprétation :
 Exécution :

Figure 21: Histogramme des indices de quantification de 2-ème cas


Partie II : Codage sans perte
On trouve dans le codeur JPEG deux blocs qui permettent d’effectuer une compression sans

perte : le codage RLC « Run Length Coding » (ou RLE « Run-Length Encoding ») et le

codage de Huffman.

1. Lecture en zigzag et Run Length Coding


La fonction donnée ci-après permet d’effectuer un zigzag sur les indices d’une matrice
carrée M de NxN éléments, pour l’utiliser on écrit R = M(zigzag(N)).

a. Expliquer les étapes de cette fonction

1. Initialisation des variables :


 K est initialisé à 2 car le premier élément du zigzag est toujours 1.
 M est défini comme la taille de la matrice moins un.

2. Boucle ascendante (haut vers bas) :

 La boucle parcourt les indices de 1 à M.


 Les indices du zigzag sont remplis avec des valeurs spécifiques basées sur la parité de
l'itération.
 La variable K est mise à jour pour la prochaine itération.

3. Boucle descendante (bas vers haut) :

 La boucle parcourt les indices de M-1 à 0 en ordre décroissant.


 Les indices du zigzag sont remplis de manière similaire à la boucle ascendante.
 La variable K est mise à jour pour la prochaine itération.

4. Finalisation :

 cumsum effectue la somme cumulée des éléments du vecteur ind.


 1 est ajouté à chaque élément pour obtenir les indices corrects (MATLAB utilise un
index de 1 comme point de départ).
b. Introduire cette fonction dans le programme de compression

c. Écrire une fonction pour réaliser le codage RLC (de type {longueur plage nulle,
valeur})
d. appliquer le RLC sur les coefficients calculés par la fonction coder () de la partie I
2. Codage sans pertes – Codage de Huffman
Le programme suivant permet de faire un codage de Huffman des coefficients d’un vecteur
Im_dctq
a. Expliquer les étapes de cette fonction.

1. Initialisation des variables :

 temp est initialisé à 1 et est utilisé comme compteur.


 temp2 est initialisé à 0 et est utilisé pour calculer la probabilité cumulative.

2. Calcul des probabilités et de la probabilité cumulative :

 La taille de l'image transformée est obtenue avec [row, col] = size (Im_dctq).
 Les valeurs de l'image sont transformées en un vecteur avec symbol =
reshape(Im_dctq, [1, row * col]).
 Les valeurs uniques de ce vecteur sont extraites avec symbol1 = unique(symbol).
 Une boucle est utilisée pour calculer la fréquence d'occurrence de chaque valeur
unique (count), la probabilité de chaque valeur (prob_pix), et la probabilité cumulative
(prob_cum).

3. Génération du dictionnaire de Huffman :

 La fonction huffmandict est utilisée pour générer le dictionnaire de Huffman.


 Les arguments sont les symboles (symbol1) et les probabilités correspondantes
(prob_pix).
 Le dictionnaire généré est stocké dans la variable dict.
 La longueur moyenne des codes de Huffman est stockée dans la variable avg_len.

b. Introduire cette fonction dans le programme de codage complet


c. Faire des expérimentations sur des images pour vérifier l’effet de la compression
JPEG.

Vous aimerez peut-être aussi