Vous êtes sur la page 1sur 4

1

TP 2 Matlab Transforme en ondelettes et compression dimages


Master 2 Pro IIA Module A.I.
Introduction : Les codes Matlab utiliser se trouvent dans matlab_wavelet/ et demo_wavelet/.

La fentre interactive manipulate_dwt.m, permet de manipuler la dcomposition en ondelettes
discrtes (DWT), ainsi que visualiser ses caractristiques au niveau frquentiel, entropique, qualitatif...
Attention :
- Pour que linterface fonctionne, bien dfinir le rpertoire courant comme le rpertoire demo_wavelet
- Afin de limiter les temps de calcul, linterface redimensionne automatiquement les images 128128.



Sur la ligne du haut sont affiches les informations relatives limage dentre I et sa DWT. Il est possible
de choisir le type dondelette utiliser (biorthogonale CDF9/7, Haar, ou sinus cardinal), ainsi que le
nombre de niveaux de dcomposition.
La ligne du bas correspond limage reconstruite R par transforme inverse de Wr, obtenue aprs deux
traitements : application dun pas de quantification T la transforme W, mise zro des coefficients
dondelette de certains cadrans.
La colonne de gauche correspond limage I ou sa reconstruction R, la colonne du milieu sa
transforme W ou Wr. La colonne de droite contient un affichage modifiable : transforme de Fourier de
limage, histogramme des valeurs de limage I (avec lentropie associe), histogramme des valeurs de la
transforme W (avec entropie) ou bien image derreur entre I et R.

Questions dautotest :
1. Pour une dcomposition 1 niveau, quoi correspond chaque cadran ?
2. Pour une dcomposition 2 niveaux (ou plus), quoi correspond chaque cadran ?
3. En observant les histogrammes des valeurs et des coefficients dondelette, mettre en vidence lutilit
de la DWT pour le codage dimages.
4. En observant la DWT et limage derreur, mettre en vidence leffet de la quantification.
5. En mettant zro les cadrans en dessous dune certaine chelle, mettre en vidence le type derreur que
lorsquon commet en fonction du cadran dans lequel cette erreur intervient.
6. Quelles sont les diffrences entre londelette biorthogonale et londelette de Haar ?
7. Pourquoi londelette sinus cardinal (utilisant des filtres parfaits dans le domaine frquentiel) nest-elle
pas utilise en pratique ?
Domaine DWT Domaine spatial Domaine FFT

2
Compression dimages par ondelettes
Lobjectif est de mettre en uvre un codeur par ondelette et dtudier ses caractristiques et performances.
Ce codeur illustre une version simplifie du codage JPEG2000.
I) Dcomposition, visualisation et reconstruction
1. Raliser la dcomposition W de limage I issue du fichier photographe256.png sur 3 niveaux et
calculer sa reconstruction Ir partir de cette dcomposition :

I=double(imread('../images/photographe256.png'));
n=log2(size(I,1));
Jmin=n-3; Jmax=n-1;
options=struct('wavelet_type','biorthogonal'); % ondelette CDF 9/7
W = perform_wavelet_transform(I,Jmin,+1,options);

Le rsultat est reprsent sous la forme dune image W de la mme taille que limage dorigine I.

imagesc(W);

Les diffrents niveaux de la dcomposition ayant des dynamiques diffrentes, la fonction suivante
permet dafficher le rsultat avec adaptation automatique de la dynamique pour chaque niveau :

show_wavelet(W,Jmin,'real');

Il est possible dafficher le cadran de son choix (chelle j et cadran nq) laide de

show_wavelet_cadran(W,Jmin,'real',j,q);

Les conventions utilises pour la numrotation de j et de q sont les suivantes :
- q prend la valeur 0,1,2 ou 3. Le cadran q=0 correspond aux basses frquences (LL), q=1 aux BF
horizontales et HF verticales (LH), q=2 aux HF horizontales et BF verticales (HL), q=3 aux hautes-
frquences (HH).
- j indique le niveau dans la dcomposition hirarchique. Il prend ses valeurs dans [| J
min
J
max
|]. Le
niveau j correspond la dcomposition pour laquelle chaque quadrant est de taille 2
j
2
j
. Ainsi le
niveau j correspond la dcomposition en 4 sous-cadrans du cadran q=0 du niveau j+1.

2. Vrifier que la reconstruction est parfaite, aux approximations numriques prs (essayer sur plusieurs
niveaux de dcomposition) en utilisant cette instruction :

disp(strcat((['Error |I-Ir|/|I| = ' num2str(norm(I(:)-Ir(:))/norm(I(:)))])));

3. Calculer limage I reconstruite partir dune dcomposition W nulle partout sauf pour un seul
coefficient non nul (On pourra utiliser linterface view_dwt en slectionnant Coefficient Simple ).

W=zeros(128,128); Jmin=3;
options=struct('wavelet_type','biorthogonal');
W(15,45) = 255;
Ir = perform_wavelet_transform(W,Jmin,-1,options);

Les images Ir ainsi obtenues correspondent aux formes donde associes chaque coefficient de la
DWT, et qui reprsentent une base orthogonale de lespace des images. Afficher Ir et W cte cte et
tester pour plusieurs choix de la position du coefficient. Discuter lapparence de la forme donde
prsente dans Ir en fonction du cadran de W contenant le coefficient non nul.

subplot 121; show_wavelet(W,Jmin,'real',1); colormap('gray');
subplot 122; imagesc(Ir);

Comparer les rsultats avec ceux obtenus en utilisant une ondelette de Haar

options=struct('wavelet_type','haar');

3
4. Vrifier quavec londelette de Haar, on obtient bien des bases orthogonales en vrifiant la conservation
de lnergie avec ces instructions :

disp(strcat(['Energie du signal = ' num2str(norm(I(:)).^2)]));
disp(strcat(['Energie des coefficients = ' num2str(norm(W(:)).^2)]));

5. On sintresse maintenant approximer limage originale (avec les ondelettes de Haar) en mettant
zro les coefficients damplitude faible et plus particulirement ceux dont lamplitude est infrieure
un seuil. Essayer avec le seuil T = 0.2 de la mme faon quen 1D (plus le seuil est lev et plus la
qualit de lapproximation est faible).

6. Trouver maintenant les seuils T tels que le nombre m de coefficients restants dans W soit :
- 0.05*n^2 (avec n = 256)
- 0.2*n^2
Afficher ensuite les approximations correspondantes ainsi que leur SNR (fonction snr ).

II) Quantification
Afin de pouvoir tre reprsente numriquement sous une forme compacte, les images de la transforme
doivent tre quantifies. Le standard JPEG2000 prvoit lutilisation potentielle dun pas de quantification
spcifique chaque cadran. Dans notre cas, nous simplifierons en utilisant le mme pas de quantification T
pour tous les cadrans.

7. La quantification uniforme de pas T avec zone morte est dfinie par lindex entier k et la valeur
quantifie relle x associes la valeur x :

(
(

<
=
sinon ) signe(
si 0
x
T
x
T x
k

> +
=
<
=
0 si 0.5) (k
0 k si 0
0 si ) 5 . 0 (

k T
k T k
x
Cette quantification, et sa fonction inverse sont fournies par la fonction perform_quantization qui peut
traiter aussi bien des scalaires que des matrices.

x = [-10:0.01:10]; T = 2.0;
[xhat, k] = perform_quantization(x, T, 1);

Tracer le graphe exprimant la valeur quantifie x en fonction de x. Tracer galement le graphe de
lerreur x x x e = ) ( en fonction de x. Illustrer la notion de zone morte.

8. Quantifier les coefficients dondelettes avec zone morte en utilisant le mme pas T pour tous les
cadrans :

[W_quant, W_int] = perform_quantization(W, T);

9. On dfinit lerreur RMS (ou erreur L
2
) comme la racine carre de lerreur quadratique moyenne entre
limage initiale I et limage reconstruite aprs quantification I

=
=
N n
n I n I
N
RMS
.. 1
2
)) ( ) (

(
1

Il est galement courant dutiliser le facteur de qualit PSNR (Peak Signal to Noise Ratio = Rapport
Signal sur Bruit), dfini comme le ratio entre la puissance crte du signal (255
2
dans notre cas) et la
puissance du bruit (erreur entre les images). Exprim en dB :

|
.
|

\
|
=
e
dB
P
PSNR
2
10
255
log 10 avec ( )

=
=
N n
e
n I n I
N
P
.. 1
2
) ( ) (

1


Observer la reconstruction Ir_quant, limage derreur Ir_quant-I, la valeur de lerreur L
2
et le
PSNR pour plusieurs pas de quantification (par exemple 1, 16, 64, 256).

4

Ir_quant = perform_wavelet_transform(W_quant,Jmin,-1,options);
imagesc(Ir_quant); colorbar;
rms_val = norm(I(:)-Ir_quant(:))
psnr_val = psnr(I,Ir_quant)

Quels effets visuels sont introduits par cette quantification ? O se trouvent les dgradations les plus
visibles ?

Tracer la courbe du PSNR en fonction du pas de quantification T pour T variant entre 1 et 256 (une
dizaine de valeurs de T suffisent, justifiez votre faon de les choisir).

10. Enfin comparer leffet de la quantification et du seuillage sur une image, pour T=1.

III) Codage
On tudie prsent la performance de compression obtenue aprs transformation par ondelettes. Pour
simplifier, le codage sera effectu par un parcours simple de la transforme associ une quantification
globale (en pratique le codage est plutt contextuel pour de meilleures performances : EBCOT, EZW).

11. Calculer et afficher lhistogramme de limage originale. Calculer galement lentropie totale et
lentropie par pixel de cette image.

[hI, bins_I]=integerhist(I(:),[0:255]);
bar(bins_I, hI);

[HI, HI_pix] = integerentropy(I(:)); % Entropie de limage I

12. Quantifier la transforme W pour un pas T=5. Calculer et afficher lhistogramme aprs quantification,
ainsi que lentropie totale et par pixel.

T=5;
[W_quant, W_int]=perform_quantization(W, T);

[hW, bins_W]=integerhist(W_int(:));
bar(bins_W, hW);

[HW, HW_pix] = integerentropy(W_int(:)); % Entropie de W_int

13. Comparer lhistogramme et lentropie de limage originale et du rsultat de cette quantification.
Rappeler le lien entre lentropie et les performances de codage afin de conclure sur lintrt de la
transforme en ondelette pour la compression dimages.

14. Coder W_int en utilisant le codeur arithmtique (la squence binaire au format uint8 issue du codage
arithmtique se trouve dans le vecteur y, et le nombre de bits total dans nbits).

[y,nbits] = perform_arithmetic_coding(W_int(:),1); % Nb bits total
nbits_pix = nbits / length(W_int(:)); % Nb bits par pixel

15. Tracer la courbe du PSNR en fonction du nombre de bits par pixel pour T variant entre 1 et 256
(fonction psnr ).

16. Comparer les rsultats sur les images "lena256.png" et "rectangles.png" pour les ondelettes
"biorthogonal" et "haar" (superposer les courbes pour pouvoir les comparer). Discuter ces rsultats.
Faire le lien avec la question 3.

17. Ecrire une fonction dwtcompress qui prend une image carre de taille 2
n
et renvoie un flux binaire
sous la forme dun vecteur dentiers [0..255] (uint8) selon la convention suivante : [n (uint8), Jmin
(uint8), T (uint8), y (squence de uint8)]. La compression utilisera londelette biorthogonale.
Vrifier que la fonction dwtuncompress fournie arrive dcoder votre flux binaire.