Vous êtes sur la page 1sur 4

TP1 et TP2 : Codage de l’information

Le codage de l’information concerne les moyens de représenter les informations afin de pouvoir
les utiliser, les transmettre ou les stocker. Les ordinateurs manipulent et stockent différents
types d’informations (données). Ces données pouvant être des nombres, des textes, des images
et des vidéos. Un ordinateur ne sait interpréter que les séquences de symboles. Ces symboles
doivent être représentés en binaire. Le codage peut être défini étant un formalisme permettant
la représentation de l’information sous une forme compréhensible par l’ordinateur.
L’objective de ce TP est de vous familiariser avec le codage de l’information et les base de
compression de données en utilisant le codage d’image comme exemple.

Partie 1 (étude du codage d’images) :

Vous devez tout d’abord démarrer Matlab et copier dans Current Directory le répertoire de
travail suivant : "tp_compr_image".

Nous disposons de trois images non compressées représentées par des pixels codés en niveaux
de gris. Ces images sont au format PGM (Portable GrayMap).
Les fonctions suivantes permettent de charger puis de visualiser les images disponibles :

image1 = pgmload(‘mandrill_512.pgm’) ;
figure
imshow(image1,[0 255]) ; ([0 255])

Charger dans les variables image1, image2 et image3 les trois images mandrill_512.pgm,
peppers_512.pgm et lena_512.pgm puis les visualiser.
NB : On rappelle que pour afficher le contenu d’une variable, il faut écrire le nom de cette
variable dans la fenêtre de commandes.
1. Pour chaque variable image1, image2 et image3 :
a. Quelle est la nature de la variable ?
b. Quelle est sa taille ?
2. Que représente chaque élément de la variable ?
3. Quelles sont les valeurs possibles de chaque élément ?
4. D’après la question précédente, calculer le nombre de kilo-octets nécessaires au
stockage de chaque variable image1, image2 et image3 ?
5. Sortir de Matlab et aller dans le répertoire où sont stockées les trois images. Pour chaque
image, aller dans ‘propriétés’ et relever la taille du fichier en octets et la taille du fichier
sur le disque dur en octets. Reporter dans un tableau pour chaque image le nombre
d’octets nécessaires au stockage de la variable, le nombre d’octets du fichier et le
nombre d’octets occupés sur le disque.
6. Expliquer les résultats obtenus.

Partie 2 (Compression d’image) :


Lorsque l’on effectue la compression d’une image ou d’un son avec perte, il en résulte
automatiquement une diminution de la qualité (visuelle ou auditive) du fichier compressé. Un
moyen permettant de définir la qualité d’une image compressée est d’en calculer son PSNR en
dB (Power Signal to Noise Ratio). Ce calcul consiste à comparer l’image originale avec l’image
compressée.
La fonction donnant le résultat de ce calcul est :
snr = psnr(image_compressée, image_non_compressée)

Débit d’une image : Un paramètre important utilisé en compression d’image est le débit. Le
sens de ce terme est différent de celui utilisé en transmission. En effet dans notre cas, un débit
s’exprime en bit/pixel. Il représente le nombre de bits total de l’image compressée sur le nombre
de pixels de l’image originale.

1. Réduction du nombre de niveaux de gris :

Cette méthode de compression consiste à réduire le nombre de niveaux de gris.


On souhaite tout d’abord réduire le nombre de niveaux de gris de 256 à 128. Pour cela, on divise
par deux tous les éléments de l’image.
Taper les deux instructions suivantes :
Image1_a = image1/2;
Image1_b = floor(image1/2);

1.1. Comparer les résultats image1_a et image1_b afin de déduire le rôle de la fonction
floor().

Comparer les deux images image1 et image1_b en écrivant :


figure,
imshow(image1, [0,255])
figure,
imshow(image1_b, [0,255])

1.2. Remarquez-vous une différence visuelle entre les deux images ?


1.3. En visualisant les valeurs des deux variables image1 et image1_b. Que remarquez-
vous ?
1.4. Quelles sont les valeurs possibles des éléments des deux variables image1 et
image1_b ?
1.5. Calculer le nombre d’octets nécessaires au stockage des deux variables image1 et
image1_b ?

Taper l’instruction suivante :


image1_c =2* floor(image1/2);
Comparer les deux images image1 et image1_c en écrivant :
figure,
imshow(image1, [0,255])
figure,
imshow(image1_c, [0,255])

1.6. Remarquez-vous une différence visuelle entre les deux images ?


1.7. En visualisant les valeurs des deux variables image1 et image1_c. Que remarquez-
vous ?
1.8. Quelles sont les valeurs possibles des éléments des deux variables image1 et
image1_c ?
1.9. Calculer le nombre d’octets nécessaires au stockage des deux variables image1 et
image1_c ?
1.10. Quels sont les débits des images image1 et image1_c ? que déduirez-vous ?
1.11. Calculez le PSNR de l’image image1_c ?

On veut compresser encore plus l’image1 :


1.12. Quelles modifications proposez-vous dans le programme pour obtenir un débit de 6,
5, 4, 3, 2 et 1 bits par pixel ?
1.13. Appliquez ces modifications et calculez PSNR de l’image compressée dans chaque
cas. Rassembler les résultats dans un tableau.
1.14. A partir de quel débit la dégradation de l’image vous semble-t-elle réellement visible ?

2. Réduction du nombre de données par sous-échantillonnage :

Cette technique de compression consiste à ne garder, par exemple, qu’un pixel sur deux. L’effet
immédiat est une diminution de la taille de l’image d’un facteur 2 dans chaque dimension. La
fonction imresize() permet d’agrandir ou de réduire la taille d’une image. Ainsi, pour réduire le
pas d’échantillonnage de l’image d’un facteur 2 dans chaque dimension, on peut utiliser la
commande suivante :
image1_b = floor(imresize(image1, 0.5, ‘bicubic’));
figure,
imshow(image1_b, [0 255])
figure,
imshow(image1, [0 255])

Comparer les deux images image1 et image1_b :

2.1. Remarquez-vous une différence visuelle entre les deux images ?


2.2. En visualisant les valeurs des deux variables image1 et image1_b. Que remarquez-
vous ?
2.3. Quelles sont les valeurs possibles des éléments des deux variables image1 et
image1_b ?
2.4. Calculer le nombre d’octets nécessaires au stockage des deux variables image1 et
image1_b ?

Taper l’instruction suivante :


image1_c = imresize(image1_b, 2, ‘nearest’);

Comparer les deux images image1 et image1_c en écrivant :


figure,
imshow(image1, [0,255])
figure,
imshow(image1_c, [0,255])

2.5. Remarquez-vous une différence visuelle entre les deux images ?


2.6. En visualisant les valeurs des deux variables image1 et image1_c. Que remarquez-
vous ?
2.7. Quelles sont les valeurs possibles des éléments des deux variables image1 et
image1_c ?
2.8. Calculer le nombre d’octets nécessaires au stockage des deux variables image1 et
image1_c ?
2.9. Quels sont les débits des images image1 et image1_c ? que déduirez-vous ?
2.10. Calculez le PSNR de l’image image1_c ?
On veut compresser encore plus l’image1 :
2.11. Quelles modifications proposez-vous pour obtenir une réduction d’un facteur 4, 8, 16,
32 dans chaque dimension ?
2.12. Appliquez ces modifications et calculez le débit et le PSNR de l’image compressée
dans chaque cas. Rassembler les résultats dans un tableau.
2.13. A partir de quel débit la dégradation de l’image vous semble-t-elle réellement visible?

3. Conclusion sur les deux méthodes de compression :

Pour un débit de 2 bits par pixel, comparer les images obtenues avec chaque méthode.
3.1. Laquelle vous semble de meilleure qualité ?
3.2. Comparer les valeurs du PSNR avec chaque méthode et conclure.
Visualiser les images les plus dégradées de chaque méthode.
3.3. Laquelle vous semble de meilleure qualité ?
3.4. Comparer les valeurs du PSNR avec chaque méthode et conclure

Matlab dispose d’un codeur JPEG que vous pourrez utiliser pour coder une image avec une
qualité Q3 exprimée en %. Pour cela, écrire la commande suivante :
imwrite(uint8(image1),'nom_du_fichier.jpeg','jpg', 'Quality', Q3);

Le fichier nom_du_fichier.jpeg se retrouve alors dans le répertoire de travail.


3.5. Comparez la taille des fichiers pour les qualités de 100%, 80%, 60%, 40%, 20%, ainsi
que la qualité visuelle.

Vous aimerez peut-être aussi