Vous êtes sur la page 1sur 7

Adriana Kanashiro Da Costa

Zangré Ibrahim

Rapport de TP - Séance 4
Initiation au traitement de signal et applications
(Responsable : M F. Sur)

Compression avec pertes

2. Compression brutale de son


Ici on cherche à écrire une fonction Matlab ’dct_compression.m’ qui permet de compresser un
signal sonore : cela consiste à calculer sa Tranrformée Discrète en Cosinus (en Anglais DCT ), de
mettre à zéro tous les cefficients dont le module est en dessous d’un certain seuil S, et de le décom-
presser en calculant sa DCT inverse à l’aide des fonctions Matlab ’dct.m’ et ’idct.m’. La fonction
prendra en entrées, le signal, la valeur de S et retourne le taux de compression (rapport entre le
nombre de coefficients mis à zéro et le nombre initial) et le signal décompressé.

Algorithme Matlab :

function [Sortie,taux]=compression1(Signal,Seuil);
[n,m]=size(Signal);

s1=dct(Signal);
indic=(abs(s1)>Seuil);
s2=s1.*indic;
s3=idct(s2);
Sortie=s3;
taux=length(find(abs(s2)<Seuil))/length(Signal);

On applique ensuite ce compresseur à signal sonore ’foryoublue.wav’ et on observe le taux de com-


pression à partir duquel le signal se dégrade. On fait déjà un essai avec un seuil S = 0.5

1
Commande Matlab :

>> [w1,Fs,nbits]=wavread(’foryoublue.wav’);
>> [sonCompresse,taux]=dct_compression(w1,0.5);
>> taux
taux =

0.4205

Avec ce seuil, on a un taux de compression d’environ 42% ; en auditionnant, le son compréssé, on


ne perçoit pas encore de dégradation notable.
On augmente progressivement le seuil, et à partir de S = 5, c’est à dire à partir d’un taux de
compression d’environ 68%, le son devient plus grave (ce qui correspond aux basses fréquences,
les coefficients de haute fréquence ayant été annulés), et un phénomène de pré-écho ; cela est aux
discontinuités des percussions, entrainant un effet de Gibbs.
à partir d’un taux de 80% le signal est fortement dégradé et le phénomène de pré-écho s’accentue.

3. Etude expérimentale de la compression JPEG


On essaie de compresser des images au format JPEG, en faisant varier le paramètre quality de
la compression, et d’observer leur dégradation ; la commande Matlab utile est :

>> imwrite(uint8(Image),’ImageCompressee.jpg’,’quality’,100 )

On dispose des images ’lettres.tif’ et ’boat.tif’ suivantes :

50
20
100

40 150

200
60
250

300
80
350

100 400

450
120
500
20 40 60 80 100 120 50 100 150 200 250 300 350 400 450 500

Quand on diminue le paramètre ’quality’ de la compression, la dégradation des images devient


perceptible à partir de la valeur 80 (le taux de compression augmente quand ce paramètre diminue).
La dégradation se fait d’abord sentir au niveau des contours au niveau desquels le contraste est très
élevé : on a un saut brusque du signal. Les zones supportant mieux les forts taux de compression
sont donc les celles éloignées des bords, où il ya une continuité du niveau de gris.
On observe deux types de phénomènes qui accompagnent cette dégradation de l’image :

2
50
20
100

40 150

200
60
250

300
80
350

100 400

450
120
500
20 40 60 80 100 120 50 100 150 200 250 300 350 400 450 500

Figure 1 – Lettres : quality=5 Figure 2 – Boat : quality=5

Le Block effect :

La méthode de compression du format JPEG est entre autre basée sur le découpage des canaux
de l’image en blocks 8 × 8, et ensuite l’application de la DCT sur ces blocks ; de ce fait, lorsque le
taux de compression augmente, chaque block est pratiquement remplacé par sa moyenne ; l’image
resultante présente donc des blocks chacun de couleur uniforme, comme on peut l’observer sur la
figure 2 ci-dessus.

Le Ringing effect :

C’est un effet dû à l’effet de Gibbs : les sauts de niveau de gris provoquent des ’oscillations rési-
duelles’ de la transformée par DCT ; on observe donc sur l’image résultante une sorte de sinusoides
au niveau des contours (lieu des contrastes).

Si on augmente la taille des blocks, avec un fort taux de compression,on obtient une mosaïque ;
la resolution dimunie fortement.
On fait la même expérience sur une image en couleur ’GrandTeton.jpg’ :

On observe les effets de blocks et de ringing sur l’image en couleur compressée ; on observe aussi
une dérive des couleurs : cela est dû à l’effet de block sur les canaux de chrominance.

4. Sur échantilonnage par zero padding


Le sur échantillonnage consiste à augmenter la taille d’une image ; si une image est de taille N × N ,
on veut l’interpoler en une image kN × kN .
Les méthodes possibles sont :

4.a Duplication des pixels


Elle consiste à multiplier chaque pixel pour obtenir un block k × k ; appliquons la méthode sur
l’image ’lena.tif’ avec k = 2 :

Commande Matlab

3
50 50

100 100

150 150

200 200

250 250

300 300

350 350

50 100 150 200 250 300 350 400 450 500 50 100 150 200 250 300 350 400 450 500

Figure 3 – quality=100 Figure 4 – quality=5

>> lena =double(imread(’lena.tif’));


>>N=size(lena);% N pair
>>lenaDouble=zeros(2*N,2*N);
>>lenaDouble(1:2:2*N,1:2:2*N)=lena;
>>lenaDouble(1:2:2*N,2:2:2*N)=lena;
>>lenaDouble(2:2:2*N,1:2:2*N)=lena;
>>lenaDouble(2:2:2*N,2:2:2*N)=lena;
>>figure,colormap(gray),imagesc(lena)
>>figure,colormap(gray),imagesc(lenaDouble)

50

100

150
50

200
100

250

150
300

200
350

250 400
50 100 150 200 250

450

Figure 5 – Image initiale 500


50 100 150 200 250 300 350 400 450 500

Figure 6 – Image dupliquée

4
4.b Par zero -padding (FFT)
Cette méthode consiste à prendre la matrice des coefficients de la transformmée de Fourier et
la compléter par des zeros pour avoir une matrice de taille 2N × 2N et de prendre ensuite la trans-
forméé inverse :

Commande Matlab
>> Image=double(imread(’boat.tif’));
>> N=size(Image); % N pair
>> fftImage=fftshift(fft2(Image));
>> fftImage2=zeros(2*N);
>> fftImage2(N/2+1:3*N/2,N/2+1:3*N/2)=fftImage;
>> Image2fft=ifft2(ifftshift(fftImage2));
>> figure
>> colormap(gray)
>>imagesc(real(Image2fft))

4.c Par zero -padding (DCT)


C’est le même prcédé que le précédent,on remplace juste la FFT par une DCT ;

Commande Matlab
>> Image=double(imread(’boat.tif’));
>> N=size(Image); % N pair
>> dctImage=dct(dct(Image)’);
>> dctImage2=zeros(2*N);
>> dctImage2(1:N,1:N)=dctImage;
>> Image2dct=idct(idct(dctImage2)’);
>> figure
>> colormap(gray)
>> imagesc(real(Image2dct))
On obtient avec les deux méthodes sur l’image ’boat.tif’, les images suivantes :

100 100

200 200

300 300

400 400

500 500

600 600

700 700

800 800

900 900

1000 1000
100 200 300 400 500 600 700 800 900 1000 100 200 300 400 500 600 700 800 900 1000

Figure 7 – Par DCT Figure 8 – Par FFT

5
On a l’apparition d’une effet de Gibbs au niveau des contours avec la méthode de la transformée
de fourier : en effet on a placé la transformée de l’image au centrée d’une matrice pleine de zeros ;
ce qui revient en quelque sorte à annuler des coefficients hautes fréquences.

Comparaison avec la méthode de duplication :

On observe dégradation de l’image au niveau des contours avec la méthode de duplication, et l’effet
de Gibbs (perceptible au niveau des contours et du bord de l’image) est moins prépondérant dans
la méthode DCT que dans DFT : avantage certain de la DCT par rapport à la DFT.

Appliquons les deux méthodes précédentes sur une image en couleur (’GrandTeton.jpg’) dont on
traite les canaux de couleurs indépendamment.
On obtient les canaux de couleurs Y CbCr avec la commande Matlab suivante (où Y CbCr est un
tenseur N × N × 3) :

>>Image=uint8(imread(’GrandTeton.jpg’));
>> YCrCb=rgb2ycrcb(Image);
>>Y=YCrCb(:,:,1);
>>Cb=YCrCb(:,:,2);
>>Cr=YCrCb(:,:,3);

On applique donc les deux méthodes précédentes sur les canaux Y , Cb et Cr.

>> [N,M]=size(Y); % N,M pairs


>> dctY=dct(dct(Y)’);
>> dctCb=dct(dct(Cb)’);
>> dctCr=dct(dct(Cr)’);
%----------------------------------
>> dctY2=zeros(2*N,2*M);
>> dctCb2=zeros(2*N,2*M);
>> dctCr2=zeros(2*N,2*M);
%----------------------------------
>> dctY2(1:N,1:M)=dctY;
>> dctCb2(1:N,1:M)=dctCb;
>> dctCr2(1:N,1:M)=dctCr;
%----------------------------------
>> Y2dct=idct(idct(dctY2)’);
>> Cb2dct=idct(idct(dctCb2)’);
>> Cr2dct=idct(idct(dctCr2)’);
%----------------------------------
>> YCrCb_Final(:,:,1)=Y2dct
>> YCrCb_Final(:,:,2)=Cb2dct
>> YCrCb_Final(:,:,3)=Cr2dct
%----------------------------------
>>Image_Finale=ycbcr2rgb(YCrCb_Final);
>>figure, colormap(gray)
>>imagesc(Image_Finale)

En affichant les différents canaux, on obtient :

6
50 50

100 100

150 150

200 200

250 250

300 300

350 350

50 100 150 200 250 300 350 400 450 500 50 100 150 200 250 300 350 400 450 500

Figure 9 – Y Figure 10 – Cb Figure 11 – Cr

L’image resultante duppliquée est la suivante : (un problème survenu lors de la transformation
par DCT empêche la reconstitution de toutes les couleurs, à vrai dire on ne sait pas où est le pro-
blème !) :

100

200

300

400

500

600

700

100 200 300 400 500 600 700 800 900 1000

Figure 12 – Image dupliquée

Vous aimerez peut-être aussi