Vous êtes sur la page 1sur 7

Université Constantine 1

Réseau et Télécommunication
Master 1

TP N°3 :

Calcul de la DCT d’une image en niveau de gris

Préparer par :
 Bouchekout Nada
 Boulkerara Oumaima
Introduction :
Le passage par la DCT a été l'idée majeure pour la compression JPEG. En effet ce
processus appartient à une classe d'opérations mathématiques, tout comme la
Transformée de Fourier. Elle permet un changement de domaine d'étude, tout en gardant
exactement la même fonction étudiée. Dans notre cas, on étudie une image, c'est à dire
une fonction à 3 dimensions : X et Y, indiquant le pixel, et Z avec la valeur du pixel en ce
point. Dans le cas d'une image couleur, il faut donc considérer indépendamment 3
fonctions, pour chacun des canaux RGB.
L'application de la DCT, ou d'une Transformée de Fourier fait passer l'information de
l'image du domaine spatial en une représentation identique dans le domaine fréquentiel.
C’est une changement de domaine intéressant parce qu'une image classique admet une
grande continuité entre les valeurs des pixels. Les hautes fréquences étant réservées à des
changements rapides d'intensité du pixel, ceux-ci sont en général minimes dans une
image. Ainsi on parvient à représenter l'intégralité de l'information de l'image sur très peu
de coefficients, correspondant à des fréquences plutôt basses. La composante continue
(valeur moyenne de l'image traitée) ayant une grande importance pour l'oeil. La DCT
s'applique à une matrice carrée. Le résultat fournit est représenté dans une matrice de
même dimension. Les basses fréquences se trouvant en haut à gauche de la matrice, et les
hautes fréquences en bas à droite.
La transformation matricielle DCT étant Orthogonale, elle s'accompagne d'une méthode
d'inversion pour pouvoir revenir dans le domaine spatial. Ainsi après avoir fait des
modifications dans le domaine fréquentiel, éliminer des variations de l'image quasiment
invisibles par l'oeil humain, on retourne à une représentation sous forme de pixels.

Partie 1:

1- Calcule DCT :
Programme :
clear all
clc
A=[140 144 147 140 140 155 179 175;
144 152 140 147 140 148 167 179;
152 155 136 167 163 162 152 172;
168 145 156 160 152 155 136 160;
162 148 156 148 140 136 147 162;
147 167 140 155 155 140 136 162;
136 156 123 167 162 144 140 147;
148 136 155 152 147 174 136 151]
B =dct2(A)
Y = round(B)

2- La valeur de position (0,0) de la matrice DCT représente : La plus grande valeur


de la matrice DCT.

3- On peut identifier les basses et les hautes fréquences dans la matrice DCT :
Après la DCT, les fréquences élevées sont dans le coin droit du bas de la matrice, or
l’œil humain discerne mal ces fréquences. C’est les valeurs qui sont presque nulles
dans la matrice.
B- La quantification :
 On Divise la matrice DCT sur la matrice de quantification :

Programme :
clear all
clc
A=[140 144 147 140 140 155 179 175;
144 152 140 147 140 148 167 179;
152 155 136 167 163 162 152 172;
168 145 156 160 152 155 136 160;
162 148 156 148 140 136 147 162;
147 167 140 155 155 140 136 162;
136 156 123 167 162 144 140 147;
148 136 155 152 147 174 136 151]
B =dct2(A)
Y = round(B)
F=[3 5 7 9 11 13 15 17;
5 7 9 11 13 15 17 19;
7 9 11 13 15 17 19 21;
9 11 13 15 17 19 21 23;
11 13 15 17 19 21 23 25;
13 15 17 19 21 23 25 27;
15 17 19 21 23 25 27 29;
17 19 21 23 25 27 29 31]
c= round(B./F)
 On Multipliée la valeur de la matrice DCT quantifiée par l’élément correspondant de la
matrice de quantification :

Programme:
clear all
clc
A=[140 144 147 140 140 155 179 175;
144 152 140 147 140 148 167 179;
152 155 136 167 163 162 152 172;
168 145 156 160 152 155 136 160;
162 148 156 148 140 136 147 162;
147 167 140 155 155 140 136 162;
136 156 123 167 162 144 140 147;
148 136 155 152 147 174 136 151]
B =dct2(A)
Y = round(B)
F=[3 5 7 9 11 13 15 17;
5 7 9 11 13 15 17 19;
7 9 11 13 15 17 19 21;
9 11 13 15 17 19 21 23;
11 13 15 17 19 21 23 25;
13 15 17 19 21 23 25 27;
15 17 19 21 23 25 27 29;
17 19 21 23 25 27 29 31]
c= round(B./F)
d= round(c*F)
x= idct(d)
• Calcule PSNR :

Programme:
clear all
clc
bloc_a=[140 144 147 140 140 155 179 175;
144 152 140 147 140 148 167 179;
152 155 136 167 163 162 152 172;
168 145 156 160 152 155 136 160;
162 148 156 148 140 136 147 162;
147 167 140 155 155 140 136 162;
136 156 123 167 162 144 140 147;
148 155 136 155 152 147 147 136];
dct=dct2(bloc_a,[8 8])
b=round(dct)
f=[ 3 5 7 9 11 13 15 17;
5 7 9 11 13 15 17 19;
7 9 11 13 15 17 19 21;
9 11 13 15 17 19 21 23;
11 13 15 17 19 21 23 25;
13 15 17 19 21 23 25 27
15 17 19 21 23 25 27 29;
17 19 21 23 25 27 29 31]
bloc_b=round(b./f)
x=bloc_b.*f
aa=idct(x)
zz=0
for i=1:8;
for j=1:8;
mse=(bloc_a(i,j)-aa(i,j))/64
zz=mse+zz;
end
end
psnr=10*log10(255^2/zz)

Résultat:
MSE= 2.0808
PSNR= 28.1526

Partie 2 :
 On Applique la DCT sur image chargée et applique la quantification pour chaque bloc :
Programme :
a=imread('cameraman.tif');
imshow(a);
dct=blkproc(a,[8 8],'dct2');
b=round(dct);
h=imagesc(dct);
f=[3 5 7 9 11 13 15 17;
5 7 9 11 13 15 17 19;
7 9 11 13 15 17 19 21;
9 11 13 15 17 19 21 23;
11 13 15 17 19 21 23 25;
13 15 17 19 21 23 25 27;
15 17 19 21 23 25 27 29;
17 19 21 23 25 27 29 31]
for i=1:8;
for j=1:8;
bloc_b=round(b(i,j)./f)
end
end
for i=1:8;
for j=1:8;
x=bloc_b.*f
end
end
aa=blkproc(a,[8 8],'idct2');
xz=0;
for i=1:256;
for j=1:256;
mse=(dct(i,j)-aa(i,j))^2/(256*256);
xz=xz+msn;
end
end
bloc_b
x
mse
psnr=10*log10(255^2/xz)

 Résultats :

mse=0.0038
psnr= 11.4572

Vous aimerez peut-être aussi