TP3
Quantification de l’image
I. Objectifs
L’objectif de ce TP est de pratiquer le concept de la quantification scalaire sur un signal
numérique bidimensionnel (l’image). Pour cela, le travail à réaliser est divisé en trois parties:
la première partie concerne l’acquisition et la représentation sous format numérique d’une
image, la deuxième partie s’intéresse à la quantification scalaire d’une image et à l’étude de
son effet visuel et quantitatif sur la qualité de l’image obtenue. La dernière partie est réservée
à l’application du concept de la quantification pour réaliser une application spécifique. Dans
ce TP, il s’agit du comptage de nombre de pièces de monnaies dans une image.
II. Format d’une image numérique
Une image numérique est un signal numérique multidimensionnel déjà échantillonné et
quantifié. Ses variables d’évolution sont ses coordonnées spatiales en abscisses x et en
ordonnées y. Chaque échantillon de l’image est un élément graphique appelé PiCture
ELement ou pixel. Un pixel de l’image peut être quantifié sur 1 bit, il s’agit alors d’une image
binaire (0 Noir, 1 blanc). Un pixel peut aussi être codé sur 8 bits, soit 256 nuances de gris,
allant du 0 qui est le noir jusqu’à 255 qui es le blanc (en passant par 128 qui est le gris
moyen). Dans ces deux cas, l’image est un signal scalaire. En effet, une fois les variables
d’évolution fixées, on obtient un seul scalaire représentant le pixel.
Les images vraies couleurs sont, quant à elles, des signaux vectoriels où chaque pixel est
décrit par au moins 3 intensités (amplitudes). Il s’agit d’un vecteur de 3 composantes
traduisant la composition de n’importe quelle couleur selon les trois couleurs de base qui sont
le Rouge, le Vert et le Bleu. Chaque pixel de chaque couleur est codé sur 8 bits.
Dans ce qui suit, vous allez manipuler ces différents formats des images.
1. Lire l’image ‘pouf’ en utilisant la commande [I]=imread('[Link]');
2. Visualisez l’image en utilisant la commande imshow(I).
3. Déterminer sa dimension (nombre de lignes et nombre de colonnes) et le
nombre de bits de quantifications.
4. Refaire la même chose pour l’image ‘[Link]’.
5. Vérifier la notion d’image scalaire et vectorielle et observer les composantes de
l’image vectorielle chacune séparément. Pour ce faire, afficher en niveaux de
gris chaque composante. Interpréter le résultat de l’affichage.
III. Acquisition d’une image à partir d’une webcam sous Matlab
L’acquisition de l’image se fera à partir d’une caméra connectée à votre PC par le port USB
ou bien avec une caméra intégrée dans le PC. La communication entre le PC et la caméra
s’établira à travers un pilote Windows.
Durant ce TP, on utilisera un outil d’acquisition d’image et de vidéo développé sous Matlab et
accessible à travers une interface graphique par la commande imaqtool. Cette interface est
représentée dans la figure 1. Elle comprend, dans la fenêtre en bas à droite, l’ensemble des
commandes relatives aux différentes actions que vous ferez à la souris.
2.
1.
3.
Figure 1. Interface graphique de la plateforme d’acquisition d’image.
1. Réaliser une acquisition d’image grâce à l’outil imaqtool en format 320x240
RGB. Enregistrer cette acquisition sous forme de variable (Im320rgb) dans l’espace
de travail (Export Data).
2. Réaliser deux acquisitions de la même scène que précédemment en niveaux de
gris (une seule composante), avec une taille de 320x240 pixels et 160x120.
Enregistrer ces acquisitions sous formes de variables (Im320 et Im160) dans l’espace
de travail (Export Data).
3. Sélectionner, afficher et ensuite enregistrer en format png une région d’intérêt
à partir de l’image acquise par l’interface imaqtool (Region of Interest).
IV. Quantification des images
La Quantification Scalaire (QS) est la deuxième étape de la numérisation de signaux, elle
permet de transformer un signal continu en amplitudes en un signal discret en amplitude.
D’un point de vue pratique, c’est une règle de correspondance entre le nombre infini ou
grand de valeurs possibles et un nombre fini et relativement petit de valeurs.
Durant ce TP, nous nous intéressons à la quantification scalaire uniforme. Un pixel de
l’image I(x,y) prend ses valeurs dans l'intervalle [0, 255]. Pour réaliser un quantificateur
uniforme à N niveaux, il suffit de partitionner l'intervalle [0, 255] en N intervalles
distincts de même largeur Delta =256/N et de définir le représentant de l'intervalle, par
exemple, son milieu.
Prenons par exemple le cas où le nombre de niveaux de quantification est N=8. Ceci
correspond à une représentation binaire sur 3 bits. Le pas de quantification est
Delta=256/8. L’intervalle [0 255] est partitionné en 8 intervalles dont les bornes sont
successivement 0, 32, 64, 96, 128,160, 192, 224, 255. Les extrêmes 0 et 255 ne sont pas
retenus dans le vecteur PARTITION=[32, 64, 96, 128,160, 192, 224]. Chaque pixel d’un
intervalle (les intervalles sont [0, 31], [32 63], [64 95], [96 127], [128 159], [160 191],
[192 223], [224 255]) est remplacé par une seule valeur qui est le milieu de l’intervalle.
On crée alors, ce qu’on appelle le dictionnaire ou CODEBOOK=[16,
48,80,112,144,176,208,240]. Cette partition et ce dictionnaire sont illustrés dans la figure
2.
Figure 2. Partition et dictionnaire d’un quantificateur à 8 niveaux d’une image en niveaux
de gris.
Pour quantifier une image avec matlab, on utilise la fonction imquantize suivante :
function [q,qindex]=imquantize(x,L)
% image quantization
xmax=max(x(:));
xmin=min(x(:));
range=xmax-xmin;
scale=double(L-1)/double(range);
qindex=round(x*scale);
q=qindex*round(range/L)+round(range/(2*L));
return
1. Comprendre le code matlab de la fonction et expliquer comment l’opération de
quantification est mise en œuvre par un programme aussi simple.
2. Quantifier l’image ‘[Link]’ sur 8 niveaux.
3. Comparer visuellement l’image originale et l’image codée (afficher les deux
images sur la même fenêtre graphique).
4. Calculer l’Erreur Quadratique Moyenne définie par :
1 2
��� = [������� (�, �) − ������ �, � ]
nlig * ncol
Où nlig et ncol désignent respectivement le nombre de ligne et le nombre de colonnes de
l’image.
Remarque : les calculs se font sur le format « double ». L’affichage des images se fait à partir
du format « uint8 »
5. En déduire le rapport Signal à Bruit en dB :
σ2
RSB(dB) = 10 log10 ,
EQM
Où σ 2 est la variance sur l’image que vous pouvez calculer avec la commande matlab
var.
6. On se propose maintenant d’examiner l’impact de la réduction de nombre de bits
alloué pour quantifier l’intensité des pixels de l’image. Pour cela, vous allez
réduire à chaque fois le nombre de bits de quantification de 1 bit et calculer le
RSB.
7. Evaluer la qualité visuelle de chaque image codée.
8. Remplir le tableau suivant et tracer la courbe de variation du RSB en fonction du
nombre de bits de quantification. Déduire la perte moyenne en dB relative à la
réduction d’un bit de quantification à chaque fois.
Nombre de bits de 7 6 5 4 3 2 1
quantification par pixel
RSB
V. Exemple d’application de la quantification
On considère l’image ‘coins’ dont la scène contient des pièces de monnaies. On se propose
dans cette partie du TP de compter le nombre de pièces de monnaies existantes sur une image.
Pour cela, on utilise le principe de la quantification scalaire. En effet, les pièces de monnaies
ont des couleurs spécifiques, le fond de l’image ou les autres objets ont d’autres couleurs
contrastées par rapport aux précédentes. La quantification sur deux niveaux fera ressortir de
façon claire les pièces de monnaies.
1. Réaliser une quantification sur 1 bit l’image des pièces de monnaies pour générer
une image binaire (ImBin).
2. Utiliser la commande matlab imhist pour afficher l’histogramme de l’image.
On rappelle que l’histogramme est une fonction ayant en abscisse les différents
niveaux de gris (0 à 255) et en ordonné l’occurrence de chacune de ces niveaux de
gris sur l’image.
3. Remarquer qu’il y’a deux plages de valeurs. Ainsi, vous pouvez choisir le seuil
adéquat permettant de séparer ces deux plages. L’une correspond aux intensités de
l’arrière plan tandis que la 2ème est relative aux pièces des monnaies.
4. En utilisant le programme suivant (CompteurMonnaie), vérifier que vous avez bien
le nombre de pièces exact sur l’image :
L = bwlabel(ImBin);
stats = regionprops(L,'Area','Centroid');
% Comptage des pièces de monnaies en utilisant la taille des
objets
figure, imshow(ImBin)
hold on
count = 0;
seuil=200; % par exemple
for i = 1:length(stats)
if stats(i).Area > seuil
plot(stats(i).Centroid(1), stats(i).Centroid(2),'*')
count = count+1;
end
end
title(['Il y a ' num2str(count) ' pièces de monnaies dans cette
image.'])
5. Essayer de faire votre propre acquisition avec des pièces de monnaies. Faites
le avec des pièces de monnaies sur un fond uni (la table par exemple). Choisir
le seuil adéquat dans le cas de votre image afin de pouvoir comptabiliser le
nombre des pièces des monnaies.