Feuille de TP n°5 - Institut de Mathématiques de Toulouse

Transcription

Feuille de TP n°5 - Institut de Mathématiques de Toulouse
Feuille de TP n°5
Licence 3 MApI3, module Signal, Fourier, image
1
Ondelettes
Pour ce TP, on utilisera la bibliothèque supplémentaire pywavelets disponible sur le site http://www.
pybytes.com/pywavelets/.
Listing 1 – Installation de la librairie pywavelets
1
2
3
R é c u p é r e r get p i p . py d e p u i s h t t p : / / p i p . r e a d t h e d o c s . o r g / en / l a t e s t / i n s t a l l i n g . html
Taper dans un t e r m i n a l : python get p i p . py
user
Taper dans un t e r m i n a l : p i p i n s t a l l PyWavelets
user
Exercice 1 – Codage des ondelettes de Daubechies. L’objet de ce premier exercice est de coder la transformée en ondelettes de Daubechies à 2 et 4 moments nuls. On rappelle que les ondelettes de Daubechies ont la
propriété de constituer un jeu d’ondelettes orthogonales. On rappelle également que les ondelettes orthogonales
sont construites à partir de deux filtres h et g de RN (que l’on suppose périodisés en dehors de f0; ; N 1g)
ayant les propriétés
jh^ k j2 + jh^ k+N=2 j2 = 2
et
gm = (
Alors, l’ensemble
fhm 2l gl2f0;:::; N2
m) h
(1
1)
1
m;
m 2 f0; ; N
g:
1
g [ fgm 2l gl2f0;:::; N2 1g est une base orthogonale de RN .
1
Les ondelettes de Daubechies à deux moments nuls sont construites à partir des coefficients
c0 = p
1 1+
On a alors
2
p
4
3
; c1 = p
1 3+
2
p
4
3
; c2 = p
1 3
2
p
3
4
; c3 = p
p
1 1
4
2
3
:
h =t (c0 ; c1 ; c2 ; c3 ; 0; ; 0) 2 RN ;
et
g =t ( c1 ; c0 ; 0; ; 0; c3 ; c2 ) 2 RN :
Partant d’un signal u 2 RN , la décomposition en ondelettes revient à le scinder en deux sous-signaux (résumé
et détails) définis par
u1m = (h u)2m et u2m = (g u)2m , pour m 2 f0; : : : ;
où on note hm
=
N
g;
1
2
h m.
1) En considérant un signal à 8 composantes, représenter ces deux opérations sous la forme d’un système
linéaire.
2) En déduire un algorithme pour réaliser cette transformation sur un signal à
3) Vérifier que partant de
h et g, on a bien une base d’ondelettes orthogonale.
N
composantes.
4) La décomposition en ondelettes revient à appliquer l’algorithme de la question 2 au résumé et de recommencer cette transformation jusqu’à ce que l’on ne puisse plus procéder à cette étape. Construire une fonction
qui fabrique la décomposition en ondelettes jusquà un certain niveau, puis une fonction pour la décomposition
complète. On stockera le résultat dans les deux cas dans un vecteur de RN .
5) Charger la librairie fournie ondelettes.py et utiliser la fonction MakeSignal(n) pour créer un signal à
composantes. Attention au format de retour de cette fonction. Représenter ce signal.
1
n
6) Appliquer la transformation en ondelettes au signal créé. Pour représenter cette décomposition, on dessinera
plusieurs subplot les uns sous les autres. Le premier (en partant du haut) contiendra la représentation du
signal de longueur N . La deuxième figure et les suivantes contiendront les détails calculés aux différents niveaux
(première, puis seconde, puis troisième, décomposition). Attention, dans cette représentation, les détails
contiennent deux fois moins de points que les précédents. Il est donc nécessaire de prendre en compte ce
paramètre pour la représentation.
7) Que constatez-vous ?
8) On souhaite maintenant pouvoir recomposer le signal d’origine à partir de la décomposition en ondelettes.
Pour la recomposition, on note
u~m =
1
On note
(
u1m2
0
, si
, si
m est pair,
m est impair,
u~m =
2
et
(
u2m2
0
u = h u~1 + g u~2
, si
, si
m est pair,
m est impair,
(1)
qui est le résultat de la recomposition.
Fabriquer une fonction Python qui fabrique cette recomposition. Vérifier votre fonction en essayant de retrouver
votre signal de départ.
9) Reprendre les questions précédentes en considérant les coefficients du polycopié du cours qui correspondent
aux coefficients des ondelettes de Daubechies à 4 moments nuls. On reproduit le jeux de coefficients ci-dessous
8
0:230377813309
>
>
>
>
0:714846570553
>
>
>
>
>
0:630880767930
>
>
>
>
< 0:027983769417
hm = > 0:187034811719
>
>
0:030841381836
>
>
>
>
0:032883011667
>
>
>
>
>
>
: 0 0:010597401785
,
,
,
,
,
,
,
,
,
si m = 0;
si m = 1;
si m = 2;
si m = 3;
si m = 4;
si m = 5;
si m = 6;
si m = 7;
sinon.
Exercice 2 – Ondelettes de Daubechies pour les images. L’obtention de la décomposition en ondelettes
pour les images se réalise comme pour la transformée de Fourier à deux dimensions :
2
— on décompose avec une décomposition en ondelettes 1D toutes les lignes de l’image u 2 RN et on met
N
N
les résultats dans les lignes de deux images u1 2 RN 2 et u2 2 RN 2 ;
— puis on décompose avec une décomposition en ondelettes 1D toutes les colonnes des deux images u1 et
N 2
N 2
N 2
N 2
u2 pour obtenir quatre images de coefficients u11 2 R( 2 ) , u12 2 R( 2 ) , u21 2 R( 2 ) et u22 2 R( 2 ) .
1) Fabriquer une fonction Python qui réalise une étape de la décomposition en ondelettes pour une image.
Pour la décomposition 1D, on obtenait le résumé et les détails. On obtient maintenant quatre sous-matrices,
une pour le résumé, et trois pour les détails. Le résultat devra être renvoyé sous la forme d’une image de même
taille. On s’inspirera pour cela de l’illustration de la figure 1.
2) Visualiser les résumés successifs d’une décomposition en ondelettes d’une image 2D (on pourra prendre à
titre d’exemple lena ou barbara).
3) Fabriquer une fonction Python qui réalise la décomposition en ondelettes jusqu’à un certain niveau d’une
image puis une deuxième fonction qui réalise la décomposition complète.
4) Utiliser la fonction Affiche_Dec_Ondelettes(u,k) de la librairie ondelettes.py pour afficher le résultat
de la décomposition en ondelettes d’une image (que l’on aura stocké dans la variable u) à k niveaux.
5) Fabriquer des fonctions Python qui effectuent la transformation inverse de la décomposition à niveau et
globale en ondelettes et les tester.
2
Figure 1 – Algorithme permettant le calcul des coefficients d’ondelettes 2D.
2
Débruitage
Lors de l’acquisition d’une image, plusieurs défauts peuvent parasiter le résultat final. L’un des défauts
majeurs est l’apparition de bruit (par exemple lors de poses longues ou des photos sous faible luminosité). On
considère un modèle simple de bruit pour les images
U = u0 + W
où u0 est une image déterministe composée de N pixels et W un bruit gaussien distribué suivant N (0; 2 IdN ),
~ de u0 qui ne dépend
où 2 est la variance du bruit. Le but du débruitage est de définir un estimateur U
~
que de U , c’est à dire U = (U ), où est potentiellement une application non linéaire. Bien que u0 soit une
~ sont des variables aléatoires. Le but du débruitage est de réduire autant que
image déterministe, à la fois U et U
possible l’erreur de débruitage en utilisant quelques connaissances a priori sur l’image inconnue u0 . Une manière
~
mathématique de mesurer cette erreur est de borner l’erreur quadratique EW (kU
u0 k2 ), où l’espérance est
calculée par rapport au bruit W .
Dans les applications réelles, on n’a pas accès à l’image de départ u0 . Cependant, on suppose ici que u0 est
connue et que u = u0 + w est générée en utilisant une seule réalisation du bruit w qui est issu de W . On définit
l’estimation de l’image déterministe comme u
~ = (u) qui est une réalisation de l’image aléatoire u
~.
Exercice 3.
1) Définir un écart type
de valeur 0:08.
2) Charger une image (lena ou barbara) et ajouter un bruit de variance 2 . On prendra soin avant d’ajouter
le bruit de normaliser l’image pour que les valeurs de chaque pixel soient comprises dans l’intervalle [0; 1]. On
pourra utiliser la commande
u = u0 + sigma*random.standard_normal(u0.shape)
pour ajouter le bruit.
On va dans un premier temps considérer la suppression du bruit par moyenne locale. Cela consiste à faire subir
une modification aux valeurs des pixels. L’opération la plus simple consiste à remplacer la valeur a de chaque
pixel par la moyenne de a et des 8 valeurs b,c,d,e,f,g,h,i des 8 pixels voisins de a. Les valeurs des pixels
sont positionnées comme suit :
0
1 0
1
g c h
@ b a dA = @192
79
54
47
190
153
166
189
203
f e i
a par
a+b+c+d+e+f +g+h+i
A
On obtient ainsi une image modifiée en remplaçant
9
3
:
= 141 4
En effectuant cette opération pour chaque pixel, on supprime une partie du bruit.
3) Construire une fonction python qui réalise le débruitage par moyenne. On supposera que les images sont
périodiques.
4) Tester votre fonction sur plusieurs images bruitées. Que constatez-vous ? Tester avec une moyenne sur un
plus grand nombre de points (25, 49, 81).
5) Plutôt que d’utiliser la moyenne des pixels voisins, on choisit maintenant d’utiliser la médiane. Répéter les
questions préćedentes. Que constatez vous ?
On souhaite utiliser maintenant la décomposition en ondelettes pour réaliser le débruitage. Il est possible
d’utiliser les fonctions qui ont été développées précédemment. Cependant, elles sont assez lentes et les optimiser
prendrait du temps. Dorénavant, on utilisera les fonctions python pour le calcul par ondelettes : pour décomposer
une image en ondelette, on utilisera la commmande v=db_fwd_2D_pywt(u) et pour recomposer une image, on
tapera u=db_bck_2D_pywt(v).
Débruitage par troncature dure
Un estimateur non linéaire de débruitage simple mais efficace est obtenu en tronquant les coefficients de u
dans une base orthogonale bien choisie. Nous choisissons dans ce TP les bases d’ondelettes de Daubechies.
L’opérateur de troncature dure avec un niveau T 0 appliqué à une image u est défini par
ST0 (u) =
X
j<u; m >j>T
< u; m > m =
avec
s0T () =
L’estimateur de débruitage et alors défini par
0
X
m
s0T (< u; m >) m
si jj > T;
sinon:
u~ = ST0 (u).
6) Définir une fonction Python thresh_hard(a,T) qui prend en entrée des coefficients d’ondelettes a d’une
image u et un niveau T et qui renvoie les coefficients d’ondelettes que l’on aura tronqués suivant la méthode
ci-dessus.
7) La valeur du coefficient de troncature T doit être proportionnelle au niveau de bruit . On prendra par
exemple T = 3 . Appliquer la fonction thresh_hard aux coefficients d’ondelettes d’une image bruitée et afficher
la recomposition à partir de ce nouveau jeu de coefficients et interpréter.
Débruitage par troncature douce
L’image estimée u
~ obtenue par troncature dure peut souffrir de plusieurs artefacts. Il est possible d’améliorer
le résultat en utilisant une troncature douce définie par
ST1 (u) =
avec
X
m
s1T (< u; m >) m
sT () = max
1
;
0 1
T
jj :
8) Définir une fonction Python thresh_soft(a,T) qui prend en entrée des coefficients d’ondelettes a d’une
image u et un niveau T et qui renvoie les coefficients d’ondelettes que l’on aura tronqué suivant la méthode
ci-dessus.
9) La valeur du coefficient de troncature T doit être proportionnel au niveau de bruit . On prendra par
exemple T = (3=2) . Appliquer la fonction thresh_hard aux coefficients d’ondelettes d’une image bruitée et
afficher la recomposition à partir de ce nouveau jeu de coefficients et interpréter.
On peut prouver que si l’erreur d’approximation non linéaire ku0 ST (u0 )k2 décroit rapidement vers 0 quand
T décroit, alors l’erreur quadratique E(kU~ ST (u)k2 ) décroit aussi vers 0 quand décroit. Pour quepce résultat
soit vrai, il est nécessaire de sélectionner la valeur de troncature comme la valeur universelle T = 2 log N .
10)On souhaite déterminer la meilleure valeur de troncature T à la fois pour le débruitage à troncature douce
et à troncature dure. Tester pour cela plusieurs valeurs de T dans l’intervalle [:8; 4:5 [ et afficher l’erreur SNR
(Signal to Noise Ratio) 10 log10 (ku0 u
~ k=ku0 k). Que peut-on en conclure ?
4
3
Compression
Exercice 4.
Les fonctions développées à l’exercice précédent permettent aussi de compresser des images.
1) Réaliser la décomposition en ondelettes d’une image et stocker le résultat dans la variable a.
2) Recomposer en ne conservant que le résumé et quelques niveau de détails de a. Afficher l’image et interpéter
a et recomposer l’image. Afficher l’image et interpéter
Appliquer le filtre de débruitage à troncature douce à a et recomposer l’image. Afficher l’image et interpéter
3) Appliquer le filtre de débruitage à troncature dure à
4)
5