Ondes Cours
Ondes Cours
Ondes Cours
2 Premières définitions 11
2.1 Définition 1 : Ondelette . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2 Exemples d’ondelettes mères : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.1 Ondelette de Haar : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.2 Ondelette ”chapeau mexicain” : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.3 Ondelette de Morlet : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3 Transformation en ondelettes 13
3.1 Transformation en ondelette continue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2 Transformation en ondelettes discrète. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3 Comparaison avec la transformation de Fourier . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
8 Description du code 40
8.1 Le fichier ondelettes.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
8.1.1 La classe Matrice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
8.1.2 La classe MatriceImage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
8.2 Le fichier ondelettesGUI.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
8.2.1 La classe Appli . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
8.2.2 La classe DialogScale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
8.2.3 La fonction main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
8.3 Le fichier bench.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
8.3.1 La fonction image gen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
8.3.2 La fonction randomize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
8.3.3 La fonction bench square . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
8.3.4 La fonction fasthaar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
8.3.5 La fonction main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
8.4 Le fichier serveur.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
8.4.1 La fonction main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
8.4.2 La fonction recvImage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
8.4.3 La fonction fasthaar srv . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
8.4.4 La fonction sendCoef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
8.5 Le fichier client.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
8.5.1 La fonction main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
8.5.2 La fonction sendImage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
8.5.3 La fonction askcompress . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
8.5.4 La fonction storeImage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
8.5.5 La fonction askcoeff . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
8.6 Le fichier ondeletttesCL.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
8.6.1 La classe Climage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
8.6.2 Les fonctions gettl, gettr, getll et getlr . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
2
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
9 Conclusion 45
11 Annexes 46
11.1 Fichier ondelettes.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
11.2 Fichier ondelettesGUI.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
11.3 Fichier bench.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
11.4 Fichier serveur.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
11.5 Fichier client.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
11.6 Fichier ondelettesCL.py . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
11.7 Fichier haar.cl . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
11.8 Images utilisées pour les performances de haar.cl . . . . . . . . . . . . . . . . . . . . . . . . . 62
11.8.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
3
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
4
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
en notation trigonométrique ;
les an et bn étant donnés par les relations
Z 2π
1
an = f (t) cos(nt)dt
π 0
Z 2π
1
bn = f (t) sin(nt)dt
π 0
Le cours de mathématiques (plus particulièrement le théorème de Dirichlet) nous donne alors le résultat bien
connu suivant, avec les hypothèses sur f données plus haut :
On peut ainsi très facilement décomposer un signal périodique en une somme infinie de sinusoı̈des.
5
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
Le signal ”carré” en noir est la somme de toutes les sinusoı̈des représentées, la sinusoı̈de rouge d’amplitude
majeure étant appelée fondamentale et les autres sinusoı̈des étant les harmoniques.
Bien évidemment, la plupart des signaux que l’on peut rencontrer sont non-périodiques et il est impossible
d’obtenir une décomposition analogue à celle décrite ci-dessus. Dans le cas général et dans la limite de la
possibilité de le faire, on effectue une transformation de Fourier.
Notons toutefois que l’on peut donner plusieurs versions de définitions : nous avons ici choisi la définition
plus ”physicienne”, car on y voit directement les paramètres de temps (t) en s et de pulsation (ω) en rad.s−1 .
Notons aussi qu’il est possible de définir la transformée de Fourier pour des fonctions qui ne sont pas forcément
dans L1 (R).
R
1. continues par morceaux et telles que ∃M ∈ R, ∀I ⊂ R, f (x) ≤ M
I
6
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
— Propriété de translation :
Soit a ∈ R et f ∈ L1 (R) de la variable t. En effectuant le changement de variable u = t − a, on obtient
la transformée de Fourier de la fonction d’expression f (t − a). En effet :
Z ∞ Z ∞
F[f (t − a)] = f (t − a)e −iωt
dt = e −iωa
f (u)e−iωu du = e−iωa .fˆ(ω)
−∞ −∞
eix − e−ix
directement par intégration de l’exponentielle complexe et en tenant compte de la relation sin x = ,
2i
−x2
2. une fonction en e 2 .
7
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
F(Π)(ω) = sinc( ω2 ). 3
La fonction étant réelle, son spectre de phase correspond à la fonction nulle et son spectre d’amplitude est le
suivant :
On comprendra que la très grande majorité des signaux sont numériques et que les définitions mathématiques
données jusqu’à présent ne sont pas adaptées au domaine du discret.
sin x
3. la fonction sinc (sinus cardinal) est au premier sens mathématique la fonction définie sur R* par sinc(x) = x
.
8
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
1.3.1 Définition
Nous nous placerons dans le cas complexe (le cas réel en découle) sur un intervalle de temps fini corres-
pondant à N échantillons. Quand N tend vers l’infini, on peut penser que l’on s’approche du cas continu
mais il faut garder à l’esprit que la TFD suppose que le signal est périodique de période N .
Nous proposons la définition de la TFD d’un point de vue de l’algèbre linéaire, qui semble plus schématique :
On définit ainsi la TFD comme un endomorphisme de CN ayant pour matrice dans la base canonique de CN
1 jk
la matrice S de terme général sj,k = e−2iπ N , où j, k ∈ {0, 1, ..., N − 1}.
N
La TFD s’applique ainsi à des suites de longueur N (ou de période N) et on peut d’ailleurs remarquer
que la TFD est périodique de période N.
On obtient ainsi, en l’appliquant à un vecteur f = (f0 , ..., fN −1 ) de CN de matrice F ∈ MN,1 (C), le vecteur
g = (g0 , ..., gN −1 ) de matrice G = S× F .
On a clairement de la définition et du produit matriciel :
N −1
X 1 −2iπ jk
∀j ∈ {0, 1, ..., N − 1} , gj = e N f
k
N
k=0
N
X −1
∀j ∈ {0, 1, ..., N − 1} , gj = W kj fk
k=0
(1)
2. La compression de données.
On applique sur les signaux la TFD pour réduire leur complexité. La suite des coefficients obtenus (en
appliquant la formule (1) est alors quantifiée avec des pas de quantification plus élevés pour les hautes
fréquences, considérées comme négligeables pour la perception humaine. Le gain en compression vient
de la réduction de précision de ces coefficients (voire leur suppression totale) : cela nécessite de ce fait
moins de bits pour le codage.
2iπ
−
4. W = e N
9
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
En outre, l’algorithme FFT nécessite que N soit une puissance de 2 à cause de l’architecture récursive
du programme. De plus, les algorithmes type FFT que l’on programme ne sont pas toujours efficaces au
niveau de la mémoire et de la rapidité car on doit tenir compte des matrices et des nombres complexes que
le logiciel de programmation ne connaı̂t a priori pas.
On verra dans ce qui suit une transformation des fonctions/signaux plus performante, la transformation
par les ondelettes qui est capable de détecter les portions du signal qui varient plus rapidement que d’autres.
10
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
2 Premières définitions
La transformation en ondelettes est apparue pour la première fois dans le domaine de la géophysique vers
1980 pour l’analyse des données sismiques. Elle aura été formalisée par Morlet, Grassmann et Goupillard.
De manière analogue à la théorie des séries de Fourier, les ondelettes sont principalement utilisées pour la
décomposition de fonctions. La décomposition d’une fonction en ondelettes consiste à l’écrire comme une
somme pondérée de fonctions obtenues à partir d’opérations simples effectuées sur une fonction principale
appelée ondelette-mère. Ces opérations consistent en des translations et dilatations de la variable. Selon que
ces translations et dilatations sont choisies de manière continue ou discrète, on parlera d’une transformée
en ondelettes discrète ou continue. Le travail suivant fera l’objet du cas particulier de la transformation en
ondelettes unidimensionnelle.
Z +∞ Z +∞
1
f= Cψ−1 2
hf, ψ a,b iψa, bda · db
−∞ −∞ a
Z ˆ 2
|ψ(ω)|
Le coefficient Cψ , si donc il existe, est donné par : Cψ = 2π dω < ∞
R |ω|
De manière plus « imagée », l’ondelette doit osciller localement autour de l’axe des abscisses. Il existe
une infinité de fonctions d’ondelettes car toute fonction oscillante localisée est une ondelette-mère possible.
Différentes familles d’ondelettes peuvent être utilisées en fonction du problème à résoudre. C’est un des
nombreux avantages de la transformée en ondelettes par rapport à la transformée de Fourier (qui est liée
exclusivement aux fonctions sinus et cosinus) que de pouvoir choisir l’ondelette à utiliser pour l’analyse.
11
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
12
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
3 Transformation en ondelettes
La transformée en ondelettes est une transformée linéaire qui décompose un signal en fréquences en
conservant une certaine localisation spatiale. Concrètement, le signal de départ est projeté sur un ensemble
de fonctions de base qui varient en fréquence et en espace.
Z
hf |gi = f (x)g(x)dx
R
Avec la condition d’admissibilité donnée en première page, la transformée en ondelette continue de la fonction
f est définie à facteur constant près comme le produit scalaire de f et de ψ.
Z +∞
1 t−b
W(a,b) (f ) = √ f (t) · ψ( ) · dt avec a ∈ R∗+ , b ∈ R
a −∞ a
Notons que a permet de donner l’échelle (c’est le coefficient de dilatation, de fréquence) et b détermine
la position de l’ondelette sur l’axe des temps.
√1 est le facteur de normalisation de l’énergie nécessaire pour que le signal transformé ait la même énergie
a
à toutes les échelles.
13
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
14
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
Il est intéressant de considérer des familles orthogonales d’ondelettes formant une base hilbertienne de
L2 (R) alors
Xtoute fonction f de cet espace peut s’écrire
f= fk,p ψ k,p où les fk,p = hf |ψk,p i sont appelés coefficients d’ondelettes.
(k,p)∈Z2
La transformation en ondelettes discrète est presque naturellement associée à des algorithmes plus efficaces
et plus rapides que des algorithmes du type FFT qui utilisent la transformée de Fourier.
Une famille d’ondelettes par exemple couramment utilisée dans la transformation en ondelettes discrète
est la famille infinie des ondelettes orthogonales de Daubechies : c’est une des familles d’ondelettes les plus
performantes.
Le graphique suivant (Fig.10), représentant l’application W(a; b) appliquée en la fonction (ou signal en
1D) f = Π (définie dans la première section de ce dossier) et utilisant l’ondelette mère de Morlet (définie
plus haut), illustre la richesse de la transformation en ondelettes continue.
A partir d’une ondelette mère, on peut créer une pluralité d’ondelettes ”filles” qui vont fournir, par rapport à
la transformation classique de Fourier, une plus grande précision dans le traitement des signaux de fréquences
constamment changeantes.
15
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
La figure 11 montre les résultats de deux compressions de la même image de départ, l’une utilisant la trans-
formation de Fourier (à gauche), l’autre utilisant la transformation en ondelettes (à droite).
Enfin, le coût d’un algorithme utilisant les ondelettes, c’est-à-dire le nombre d’opérations à effectuer, est
en O(N ), ce qui est mieux que le coût des meilleurs algorithmes type FFT en O(N log N ).
16
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
. − 2m n
1
Par suite, la famille √ ψ forme une base orthonormée de L2 (R).
2m 2m
Les espaces Wk pour k ∈ Z sont appelés espaces des détails. Ils ne forment pas une famille d’espaces
emboı̂tés mais les propriétés d’échelles et d’invariance par translation sont conservées. En effet, pour k ∈
M
Z, Wk−1 est orthogonal à Vk−1 , d’où Wk−1 orthogonal à Wk en vertu de l’égalité L2 (R) = k∈Z Wk .
F (R,R), ensemble des fonctions réelles à valeurs réelles, est un R-espace vectoriel et on montre facilement
que Kp est un sous-espace vectoriel de F (R, R).
S
De plus, pour p ∈ N, on a K0 ⊂ K1 ⊂ .. ⊂ Kp ⊂ Kp+1 ⊂ ... ce qui montre Kp est un sous-espace
p∈N
vectoriel de F (R, R).
À partir de la fonction de Haar H, on définit la fonction Hp,k par Hp,k (x) = H(2p x − k).(p, k) ∈ N2 .
p
[Pour alléger l’écriture et les calculs, on peut comme ici choisir d’omettre le facteur 2 2 devant H(2p x−k).]
(avec h définie comme la fonction de Haar mais associant 1 quel que soit x ∈ [0, 1].).
17
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
— Si k 6= k 0 : Z 1 Z 1
hhp,k |hp,k0 i = hp,k (x) · hp,k0 (x) = 0 · dx = 0
0 0
— Si k = k 0 :
Z 1
hhp,k |hp,k0 i = (hp,k (x))2 dx
0
Z xk Z xk+1 Z 1
= (hp,k (x))2 dx + (hp,k (x))2 dx + (hp,k (x))2 dx
0 xk xk+1
Z xk Z xk+1 Z 1
= 02 dx + 12 dx + 02 dx = 0 + [x]xxk+1
k
+ 0 = xk+1 − xk
0 xk xk+1
1
=
2p
Ainsi la base (hp,0 , hp,1 , ..., hp,2p −1 ) est une base orthogonale ; ce qui fait des espaces Kp des espaces
euclidiens.
Démonstration :
— Existence :
— Si F = {0E }, on a E = F ⊕ E de manière immédiate. De plus, si y ∈ F, y = 0E et ∀x ∈ E, hx|0E i =
0. D’où E est un supplémentaire orthogonal à F .
Soit x ∈ E.
p
X p
X
∃(λ1 , ..., λp ) ∈ Rp , x = λk ek + (x − λ k ek )
k=1 k=1
18
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
Or le premier vecteur de la somme est dans F . Donc le second entre parenthèses appartient à F ⊥
si et seulement si
p
X
∀k ∈ [|1, p|], hek |x − λk ek i = 0, c’est-à-dire λk = hek |xi
k=1
Avec x écrit de la manière suivante, on établit ainsi que E = F + F ⊥ .
Xp Xp
x= hek |xi · ek + (x − hek |xi · ek )
k=1 k=1
On a aussi immédiatement F ∩ F ⊥ = {0E }, ce qui établit E = F ⊕ F ⊥ et ainsi l’existence d’un
supplémentaire orthogonal à F
— Unicité :
Soit G un sous-espace vectoriel supplémentaire de F dans E et orthogonal à F .
On a déjà G ⊂ F ⊥ puisque tous les vecteurs de G sont
( orthogonaux à tous les vecteurs de F .
E = F ⊕ F⊥
De plus, dim G = dim E− dim F = dim F ⊥ car ; on en déduit G = F ⊥ et l’unicité
E =F ⊕G
du supplémentaire orthogonal.
Z 1
hhp,k |Hp,k0 i = hp,k (x) · Hp,k0 (x) · dx
Z0 xk Z xk+1 Z xk0
= 0dx + 1 · 0dx + 0dx+
0 xk xk+1
x 0 +x 0
k k +1
Z 2
Z xk0 +1 Z 1
0 · 1dx + x 0 +x 0
0(−1)dx + 0.dx
k k +1
xk 0 2 xk0 +1
=0
— Si k = k 0
19
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
Z 1
hhp,k |Hp,k0 i = hp,k (x) · Hp,k0 (x) · dx
0
Z xk Z xk+1 Z 1
= 0dx + 1 · Hp,k (x)dx + 0 · dx
0 xk xk+1
x 0 +x 0
k k +1
Z 2
Z xk0 +1
= 1dx + x 0 +x 0
−1dx
k k +1
xk 0 2
= 0.
De ce qui précède, il résulte que (hp,1 , hp,0 , ..., hp,2p −1 , Hp,0 , Hp,1 , ..., Hp,2p −1 ) forme une base orthogonale
de Kp+1 .
Alors le système (Hp,0 , Hp,1 , ..., Hp,2p −1 , ) est une base orthogonale de l’orthogonal Sp de Kp dans Kp+1 .
De plus, on peut déjà remarquer :
Z 1 Z xk0 +x2 k0 +1 Z xk0 +1
2 1
hHp,k |Hp,k i = (Hp,k (x)) · dx = 12 · dx + x 0 +x 0 (−1)2 · dx = p
0 xk0 k
2
k +1 2
-Soit un signal Ψp ∈ Kp .
p
2X −1
2p
Alors ∃!(Ψp,0 , Ψp,1 , ..., Ψp,2p −1 , ) ∈ R , Ψp = Ψp,k hp,k .
k=0
Puisque Kp = Kp−1 ⊕ Sp−1 , ∃!(Ψp−1 , dp−1 ) ∈ Kp−1 × Sp−1 , Ψp = Ψp−1 + dp−1 .
Premières égalités L’orthogonalité de la base (hp,1 , hp,0 , ..., hp,2p −1 , Hp,0 , Hp,1 , ..., Hp,2p −1 ) avec Ψp =
Ψp−1,k dp−1,k
Ψp−1 +dp−1 et les résultats précédents sur les produits scalaires amène à : hΨp |hp−1,k i = 2p−1 et hΨp |Hp−1,k i = 2p−1 .
Démonstration On a
hΨp |hp−1,k i = hΨp−1 |hp−1 i + hdp−1 |hp−1,k i par linéarité du produit scalaire.
X 2p−1
X−1
= Ψp−1,i hhp−1,i |hp−1,k i + Ψp−1,k hhp−1,k |hp−1,k i + dp−1,i hHp−1,i |hp−1,k i
i6=k i=0
p−1
2X −1
X Ψp−1,k Ψp−1,k
= Ψp−1,i · 0 + p−1 + dp−1,i · 0 = p−1
2 i=0
2
i6=k
20
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
Et on a
Z 1 Z xk+1
Démonstration On a hhp,k |hp−1,k0 i = hp,k (x) · hp−1,k0 (x) · dx = hp−1,k0 (x) · dx
0 xk
D’où :
Z xk+1
1 k0 k0 + 1
hhp,k |hp−1,k0 i =
1 · dx = p si p−1 ≤ xk ≤ xk+1 ≤ p−1 , ou encore k ∈ {2k 0 , 2k 0 + 1}
x 2 2 2
Z xk k+1
/ {2k 0 , 2k 0 + 1}
hhp,k |hp−1,k0 i =
0 · dx = 0 si k ∈
xk
On a de même Z 1 Z xk+1
hhp,k |Hp−1,k i =
0 hp,k (x) · H p−1,k0 (x) · dx = Hp−1,k0 (x) · dx
0 xk
On sait par définition que
k 0 k 0 + 21
1 si x ∈ [
; ]
2p−1 2p−1
Hp−1,k0 (x) = k0 + 1 k0 + 1
−1 si x ∈ [ p−12 ; p−1 ]
2 2
0 sinon
D’où :
k0 + 1
Z xk+1
1 k0
hhp,k |Hp−1,k0 i = 1 · dx = p si p−1 ≤ xk ≤ xk+1 ≤ p−12 , ou encore k = 2k 0
xk 2 2 2
0 1
Z xk+1
1 k + k0 + 1
hhp,k |Hp−1,k0 i = −1 · dx = − p si p−12 ≤ xk ≤ xk+1 ≤ p−1 , soit k = 2k 0 + 1
x 2 2 2
Z xk k+1
/ {2k 0 , 2k 0 + 1}
hhp,k |Hp−1,k0 i = 0 · dx = 0 si k ∈
xk
À partir de cela, il est facile de décomposer comme suit et d’obtenir les résultats :
21
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
—
p
2X −1
hΨp |hp−1,k i = h Ψp,k hp,k |hp−1,k i
k=0
X X
= Ψp,i hhp,i |hp−1,k i + Ψp,i hhp,i |hp−1,k i
i∈{2k
/ 0 ,2k 0 +1} i∈{2k
/ 0 ,2k 0 +1}
1 1
= 0 + Ψp,2k · + Ψp,2k+1 · p
2p 2
—
p
2X −1
hΨp |Hp−1,k i = h Ψp,k hp,k |Hp−1,k i
k=0
X X
= Ψp,i hhp,i |Hp−1,k i + Ψp,i hhp,i |hp−1,k i
i∈{2k
/ 0 ,2k 0 +1} i∈{2k
/ 0 ,2k 0 +1}
1 −1
= 0 + Ψp,2k · p
+ Ψp,2k+1 · p
2 2
Conclusion On obtient finalement avec les égalités encadrées les équations d’échelles suivantes.
Ψp,2k + Ψp,2k
Ψp−1,k =
k(Ψp−1,k )k∈[|0;2p−1 −1|] est la famille des coefficients d’approximation à la résolution2p−1
2
Ψp,2k − Ψp,2k
k(dp−1,k )k∈[|0;2p−1 −1|] est la famille des coefficients d’ondelettes
d
p−1,k =
2
Ainsi, lorsqu’on connaı̂t les coefficients d’ondelettes à un niveau de résolution p, on peut aisément
déterminer ceux du niveau p − 1 et l’égalité des sous-espaces vectoriels en somme directe se comprend par :
Kp = Kp−1 ⊕ Sp−1
|{z} | {z } | {z }
Signal à la résolution 2p Signal à la résolution 2p−1 Détails (ou pertes)
L’intérêt principal de cet algorithme est qu’il permet de passer d’un échantillon de taille 2p à un nouvel
échantillon principal de taille 2p−1 et un échantillon de taille 2p−1 en utilisant que des sommes ou des
différences.
Il s’ensuit une deuxième partie appelée synthèse, qui correspond à l’opération inverse de l’analyse. Dans
cette partie, les coefficients d’ondelettes « omis » dans l’analyse entraı̂nent des erreurs.
22
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
Notons toutefois que l’algorithme posé par Stéphane Mallat se fonde sur la notion d’analyse multirésolution
de L2 (R) (qui a été d’ailleurs introduite afin de construire des bases orthogonales d’ondelettes). Il s’agit
toutefois comme ici d’une suite de sous-espaces vectoriels fermés de l’espace L2 (R) mais vérifiant certaines
propriétés plus générales.
5.4.1 Exemple
On nomme M2 une matrice 4 ∗ 4 quelconque associée à une famille de pixels.
a b c d
e f g h
M2 = i j
k l
m n o p
Alors on obtient la nouvelle matrice de pixels (représentant la résolution moitié) en effectuant le produit
M2 × H2 .
On obtient a+b c+d a−b c−d
2 2 2 2
e+f g+h e−f g−h
M1 = M1 × H2 = 2
i+j
2
k+l
2
i−j
2
k−l
2 2 2 2
m+n o+p m−n o−p
2 2 2 2
On obtient alors en première moitié verticale de la matrice le nouvel échantillon principal et en seconde
moitié les coefficients représentants les nouveaux détails.
On réitère ensuite le processus et on obtient finalement à partir d’une matrice initiale de pixels Mp les
matrices Mp−1 , Mp−2 , . . . M1 , M0 avec la relation de récurrence Mk−1 = Mk × Hp (k ∈ {p, p − 1, . . . , 1} et Hp
23
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
désigne la matrice carrée 2p ∗ 2p spécifique à l’algorithme de Haar, choisie de telle sorte que son nombre p de
colonnes et de lignes soit celui des colonnes et lignes de la matrice initiale de pixels).
En reprenant l’exemple précédent, il resterait à calculer M0 = M1 × H2 .
On obtiendrait a+c−(b+d) a+b−(c+d) a+b−(b+c)
a+b+c+d
4 4 4 4
e+f +g+h e+g−(f +h) e+f −(g+h) e+h−(f +g)
M0 =
4 4 4 4
i+j+k+l i+k−(j+l) i+j−(k+l) i+l−(j+k)
4 4 4 4
m+n+o+p m+o−(n+p) m+n−(o+p) m+p−(n+o)
4 4 4 4
Mais en pratique, pour chaque matrice Mk calculée, on ne garde que les coefficients supérieurs à une
certaine précision choisie on effectue une compression. Les coefficients d’ondelettes inférieurs à cette précision
sont remplacés par des 0. Lors de l’étape inverse de décompression ou synthèse, pour réobtenir la matrice
initiale Mp , il suffit de calculer les nouvelles matrices M10 , M20 , . . . , Mp0 par la relation de récurrence suivante :
0
Mk+1 = Mk0 × (Hp )−1 , avec k ∈ {0, 1, . . . , p − 1}, (Hp )−1 désigne la matrice inverse de Hp et M00 = M0
En reprenant l’exemple précédent, on aurait :
1 1 0 0
0 0 1 1
(H2 )−1 = 1 −1 0 0
0 0 1 −1
Bien sûr, la matrice finale Mp0 se quelque peu différente de la matrice Mp puisque certains coefficients
sont devenus des 0.
24
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
25
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
Matrice R
Transformation DWT
Matrice B
Transformation DWT
Suppression
des coefficients
Matrice des coefficients négligeables
d’ondelette (colonnes)
26
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
La figure 16 représente le même détail de l’image une fois que la compression a été appliquée avec un
seuil assez petit pour garder la plupart des détails importants de l’image mais assez grand pour compresser
les «aplats» de couleur, les ombres, etc. L’image compressée occupe 35% de mémoire en moins par rapport à
l’image de départ. Ce qui montre que la compression par ondelettes est plutôt efficace et que notre algorithme
est fonctionnel.
Sur la figure 17, on peut voir le même détail quand l’image a été compressée avec le seuil maximal. Ici,
tous les détails ont été éliminés. Cela revient simplement à diviser la résolution de l’image par deux.
27
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
28
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
La figure 19 montre les menus de l’application, qui permettent de choisir entre toutes les actions décrites
ci-dessus.
La figure 20 montre le sélecteur de seuil, qui apparaı̂t lorsqu’on choisit «Compresser» ou «Compresser
(new)» dans les menus.
29
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
30
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
7.5.1 Fonctionnement
L’algorithme découpe l’image en carrés de 4 pixels, qu’il va traiter à la suite, colonne par colonne. Comme
montré sur la figure 21
Analyse : Pour chaque carré de 4 pixels, l’algorithme applique la transformation par ondelettes discrète.
On commence par stocker les valeurs RGB des 4 pixels dans un tableau. Nous allons, pour l’exemple, utiliser
les 4 pixels mis en valeur sur la figure 21. Le tableau créé est montré par la figure 22.
R G B
171 147 137 109 109 86
169 140 135 102 107 79
L’algorithme remplace ensuite les valeurs des colonnes de gauche de chaque couleur par la moyenne de
chaque ligne et les valeurs des colonnes de droite par la différence divisée par deux. Ce qui nous donne le
tableau de la figure 23. Les coefficients d’ondelette sont surlignés.
31
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
R G B
160 11 123 14 97.5 11.5
154.5 14.5 118.5 16.5 93 14
Enfin, l’algorithme remplace la case en haut à gauche de chaque couleur par la moyenne des lignes et la
case en bas à gauche par la différence divisée par deux. Le résultat est montré par la figure 24.
R G B
157.25 11 120.75 14 95.25 11.5
2.75 14.5 2.25 16.5 2.25 14
Compression et synthèse : Après la phase d’analyse vient la phase de compression. On va supprimer les
coefficients d’ondelettes inférieurs à un certain seuil. Pour l’exemple, nous allons choisir un seuil de 12.
Après compression, le tableau est celui de la figure 25.
R G B
157.25 0 120.75 14 95.25 0
0 14.5 0 16.5 0 14
Ensuite, l’algorithme reconstitue l’image avec les coefficients restants. On effectue d’abord pour la colonne
de gauche de chaque couleur une addition pour retrouver le coefficient du haut, et une soustraction pour le
coefficient du bas. Ce qui nous donne le tableau de la figure 26. Puisque les coefficients étaient égaux à 0, les
pixels ne sont pas changés.
R G B
157.25 0 120.75 14 95.25 0
157.25 14.5 120.75 16.5 95.25 14
L’algorithme effectue ensuite les mêmes opérations sur les lignes. Le résultat est donné par la figure 27
R G B
157.25 157.25 134.75 106.75 95.25 95.25
171.75 143 137.25 104.25 109.25 81.25
Enfin, on arrondit les valeurs à l’entier le plus proche. Le tableau final est donné par la figure 35. La figure
29 montre une comparaison entre l’état des pixels avant traitement, et l’état des pixels après.
Les pixels peuvent sembler réellement différents après traitement, mais la valeur moyenne des couleurs
est conservée, ce qui, au final, donnera le même rendu quand les pixels seront à leur taille normale.
32
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
R G B
157 157 135 107 95 95
172 143 137 104 109 81
33
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
Coût en mémoire : Cet algorithme est peu coûteux en mémoire, par rapport à la version matricielle. En
effet, ce dernier devait stocker plusieurs matrices contenant l’image, les coefficients d’ondelettes, les différentes
couleurs, etc. fasthaar, quant à lui, ne stocke que l’image et les valeurs de 4 pixels. Un pixel est un tuple
contenant 3 entiers codés sur 8 bits (= 1 octet).
Soient L et l la longueur et la largeur de l’image à traiter. La place de l’algorithme fasthaar en mémoire
est donc de 3 × l × L + 4 × 3 octets.
Coût temporel : Vu le principe de fonctionnement de fasthaar, on peut deviner que celui-ci a un coût en
O(l · L) (ou O(n2 ) pour une image carrée de côté n). Nous avons créé un fichier bench.py servant à mesurer
le temps que prend l’algorithme à traiter des images de différentes tailles. L’algorithme génère une image
d’une taille donnée avec des pixels aléatoires puis lui applique fasthaar en chronométrant.
La figure 30 représente le temps de traitement d’une image (en secondes) en fonction de sa taille (pixels
d’un côté divisé par 2). On vérifie donc que le coût est bien quadratique.
35
30
Temps de compression (s)
25
20
15
10
0
0 100 200 300 400 500 600 700 800 900 1000
Taille de l’image (px/2)
34
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
Étape 2 Le serveur ouvre l’image qu’il vient de réceptionner pour la compresser et stocker les coefficients
d’ondelette. Il applique pour cela une version modifiée de fasthaar qui ne garde que les coefficients d’ondelette
et les encode en binaire grâce à struct pour les enregistrer dans un fichier.
Étape 3 Le client reçoit un signal de la part du serveur indiquant si oui ou non le tranfert et la compression
se sont bien déroulés. Si c’est le cas, le client crée une nouvelle image, de dimensions L2 et 2l et la remplit
avec la moyenne des carrés de 4 pixels de l’image de départ (coefficients d’approximation).
35
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
Étape 2 Le client demande les coefficients d’ondelette au serveur en spécifiant le nom de l’image. Le serveur
lit le fichier qui contient les coefficients qu’il avait enregistrés et envoie directement les données au client.
Étape 3 Le client décode les données binaires reçues et opère la transformation inverse en remplaçant les
pixels de chaque carré par les valeurs qu’il obtient. Ensuite, il peut afficher l’image ou la stocker.
36
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
Le GPU, ou Graphical Processing Unit Un ordinateur comporte un processeur, aussi appelé CPU,
pour Central Processing Unit. Mais les ordinateurs modernes possèdent aussi des puces dédiées à l’affichage,
qu’il soit 2D ou 3D. Ce sont les GPU.
Un CPU est une puce servant à effectuer rapidement des tâches non ou très peu parallélisées. Il comporte
généralement plusieurs ”coeurs”, qui sont relativement peu nombreux (2 voire 4 pour des processeurs grand
public). Il est possible d’effectuer des tâches simultanément sur tous ces coeurs, c’est ce qui est fait naturel-
lement par le système d’exploitation, qui répartit les tâches entre les coeurs. Par exemple, lors de l’affichage
d’une page web contenant une vidéo, le décodage de la vidéo peut être effectué par un coeur, tandis qu’un
autre s’occupera de l’affichage de la page elle-même.
Un GPU, au contraire, est une puce fortement parallélisée, se trouvant sur les cartes graphiques, ou plus
récemment dans une partie du CPU dédiée à l’affichage. Elle contient une multitude de petits ”processeurs
de flux” (plusieurs centaines pour des cartes graphiques modernes), effectuant tous la même tâche au même
moment. Ceci est très utile pour l’affichage 3D, pour la compression vidéo, ou encore pour le traitement du
son, grâce à des technologies telles que TrueAudio.
37
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
Le calcul sur GPU Il est donc possible d’utiliser le GPU pour le traitement d’images, et donc pour notre
transformation en ondelettes, puisqu’il s’agit de traiter une multitude de pixels de la même manière. s Les
gains possibles sont importants, en effet, prenons l’exemple d’une image de 12 mégapixels (résolution classique
pour un appareil photo moderne) et d’un GPU AMD Pitcairn (présent dans les cartes graphiques Radeon
HD séries 7800) comportant 1024 processeurs de flux avec une fréquence de 1000MHz. Notre algorithme
travaille sur des ”blocs” de 4 pixels (comme vu plus haut) et fait environ une dizaine d’opérations de calcul
sur ceux-ci, soit probablement un millier d’opérations élémentaires au niveau matériel environ.
Cela nous donne donc un temps de traitement théorique de l’ordre de T = 12 · 106 ∗ 103 /4/1024/1 · 109 =
3 · 10−3 s. Ce qui est relativement faible en comparaison avec les temps obtenus avec un CPU. On peut donc
bien parler ”d’accélération” matérielle.
38
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
Nous avons également surveillé l’activité du GPU lors du traitement à l’aide du logiciel MSI Afterburner.
39
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
8 Description du code
Ce qui suit est une description du code de tous nos programmes.
La fonction init Cette fonction prend en argument la taille de la matrice et le premier élément qu’elle
doit contenir pour ensuite créer un tableau de tableaux contenant ce premier élément. Elle enregistre aussi
les dimensions de la matrice dans l’objet créé.
La fonction transpose Comme son nom l’indique, elle transforme la matrice en sa transposée. Elle est
utilisée lors de la transformation par ondelettes de Haar.
La fonction add Elle permet l’addition de matrices. La matrice sur laquelle est appelée la fonction est
replacée par le résultat de l’addition. Elle n’est pas utilisée dans ce programme, mais pour que notre classe
soit réutilisable dans d’autres projets, il fallait qu’elle soit créée.
La fonction multiply Cette fonction est analogue à la fonction add pour la multiplication.
La fonction copy Cette fonction transorme la matrice en celle qui est passée en argument.
La fonction update Cette fonction met à jour les dimensions de la matrice si le tableau a changé de taille.
Les fonctions save et save1 Elles permettent de sauvegarder l’état de la matrice dans un tableau auxil-
liaire.
La fonction restore Elle remet en place le tableau sauvegardé par la fonction save.
La fonction init Cette fonction prend en argument l’emplacement d’une image et la charge à l’aide de
PIL. Elle crée puis remplit une Matrice avec les informations des pixels de l’image (cf. fonction fill).
La fonction fill Cette fonction stocke les pixels de l’image dans la Matrice.
40
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
Les fonctions getmatrixred, getmatrixgreen et getmatrixblue Créent des tableaux dans l’objet et
les remplissent avec les composantes RGB (respectivement) de l’image. Cela permet de traiter chaque couleur
séparément.
La fonction save Elle prend en argument une chaı̂ne de caractère et sauvegarde l’image sous ce nom dans
le dossier courant.
La fonction ondelette haar Cette fonction prend en argument un tableau de valeurs et le nombre de
récursions qu’elle doit faire. Elle renvoie le tableau des coefficients d’approximation ainsi que le tableau des
coefficients d’ondelette.
Les fonctions getcolonne et getligne Ces fonctions servent à récupérer une liste contenant les données
d’une colonne/d’une ligne, pour pouvoir ensuite être traitées par la fonction ondelette haar.
La fonction setcolonne Elle permet de remettre une colonne dans une matrice après traitement.
Les fonctions apply haar lig et apply haar col Ces fonctions appliquent la transformation avec l’on-
delette de haar à toutes les lignes/toutes les colonnes d’une matrice.
La fonction haar grayscale Cette fonction convertit une image en nuances de gris, puis applique la
transformation par ondelettes sur l’image. Elle l’applique d’abord sur les lignes, puis transpose la Matrice,
puis la réapplique sur les lignes.
La fonction update Elle est similaire à celle qui a été décrite plus haut.
La fonction create coef matrix Elle crée les tableaux nécessaires à la mise en mémoire des coefficients
d’ondelette de chaque couleur.
La fonction haar Elle a le même effet que la fonction haar\_{}grayscale, mais elle s’applique aux 3
composantes de l’image.
La fonction makeimage Cette fonction crée une image à partir des matrices des coefficients d’approxi-
mation.
La fonction compression Cette fonction, une fois que les matrices de coefficients d’ondelette ont été
créées, permet de supprimer les coefficients qui sont inférieurs au epsilon passé en paramètre.
La fonction clearimage Elle supprime toutes les données d’une image en la remplissant d’une couleur
définie.
La fonction fasthaar Cette fonction permet d’appliquer la transformation par ondelettes sans passer par
les matrices. Pour cela elle prend tous les «carrés» de 4 pixels d’une image et leur applique la transformation
et la compression. Elle est plus rapide que les autres fonctions, mais l’inconvénient est que la récursivité n’est
pas permise. Elle est donc utilisée pour compresser légèrement une image. Les résulats restent tout de même
impressionnants puisqu’elle peut faire gagner jusqu’à 45% d’espace en seulement quelques secondes.
41
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
La fonction init Cette fonction définit simplement l’instance de la fenêtre en appelant la fonction initUI
décrite plus bas.
La fonction initUI Cette fonction crée tous les éléments de la fenêtre (le titre et les menus, entre autres).
La fonction askopenfilename Cette fonction ouvre une boı̂te de dialogue demandant quel fichier ouvrir.
La boite de dialogue est incluse dans l’installation de Tkinter. Une fois que le fichier a été choisi, la fonction
crée la zone où l’image sera affichée.
La fonction asksaveasfilename Cette fonction ouvre une boı̂te de dialogue demandant où enregistrer le
fichier qui a été modifié.
Les fonctions askcompression et askcompression2 Elles servent à ouvrir une boı̂te de dialogue du
type DialogScale (défini plus bas) pour demander à l’utilisateur le seuil de compression à utiliser lors de
l’appel des fonctions compression ou compression2.
Les fonctions compression et compression2 Ces fonctions utilisent respectivement les fonctions haar
et fasthaar de ondelettes.py pour réaliser la compression de l’image avec le seuil donné par les fonctions
askcompression et askcompression2. L’ancienne image est ensuite effacée de l’écran et la nouvelle est
affichée grâce à displayimage ;
La fonction grayscale Elle utilise les fonctions de ondelettes.py pour convertir l’image en nuances de
gris.
La fonction displayimage Elle crée une zone pour afficher la nouvelle image qui a été créée par compres-
sion, puis l’affiche dans cette zone.
La fonction onExit Elle est appelée lors de la fermeture de l’application et est là pour être sûr que tout
est fermé correctement.
La fonction initUI Cette fonction crée le texte de la boı̂te de dialogue, la réglette qui permet de choisir
la compression, et le bouton «Ok».
La fonction onScale Elle est appelée lorsque l’utilisateur modifie la position de la réglette. Elle stocke la
position de celle-ci en mémoire.
La fonction ok Elle est appelée lorsque l’utilisateur clique sur le bouton «ok». Elle sauvegarde la valeur
de la position de la réglette, puis ferme la boı̂te de dialogue.
42
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
43
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
44
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
9 Conclusion
La théorie des ondelettes symbolise en quelque sorte l’évolution des sciences mathématiques induite par
l’introduction de l’outil informatique.
Bien que l’analyse par les ondelettes soit encore loin de nous donner une réponse universelle et finale
au problème de la représentation et du codage des signaux, elle se révèle être un outil mathématique parti-
culièrement performant dans plusieurs domaines, comme l’aura très nettement montré notre implémentation
informatique. D’ailleurs, nous aurons nous-mêmes pu exploiter la richesse des ondelettes dans le domaine de
transferts-échanges de fichiers en proposant un service qui permet la compression d’images et leur affichage
grâce à la connexion à un ordinateur distant.
45
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
11 Annexes
Tout le code de ce projet est sous licence Creatice Commons BY-SA (voir p.45).
46
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
47
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
130 return c o l
131
132 def s e t c o l o n n e ( s e l f , m a t r i c e , tab , num) :
133 f o r i in range ( len ( tab ) ) :
134 m a t r i c e [ num ] [ i ] = tab [ i ]
135
136 def g e t l i g n e ( s e l f , tab , num) :
137 return tab [ num ]
138
139 def a p p l y h a a r l i g ( s e l f , m a t r i c e , c h i f f r e ) :
140 f o r i in range ( len ( m a t r i c e ) ) :
141 matrice [ i ] = s e l f . ondelette haar ( matrice [ i ] , 1 ) [ c h i f f r e ]
142
143 def a p p l y h a a r c o l ( s e l f , m a t r i c e ) :
144 f o r i in range ( len ( m a t r i c e [ 0 ] ) ) :
145 c o l = s e l f . getcolonne ( matrice , i )
146 col = s e l f . ondelette haar ( col , 1 ) [ 0 ]
147 s e l f . s e t c o l o n n e ( matrice , col , i )
148
149 def makeimagegray ( s e l f , m a t r i c e i m a g e ) :
150 m a t r i c e i m a g e . update ( )
151 im = Image . new ( ”RGB” , ( m a t r i c e i m a g e . x , m a t r i c e i m a g e . y ) , ” w h i t e ” )
152 p i x = im . l o a d ( )
153
154 f o r i in range ( m a t r i c e i m a g e . x ) :
155 f o r j in range ( m a t r i c e i m a g e . y ) :
156 pix [ i , j ] = ( int ( matriceimage . tableau [ i ] [ j ] ) , int ( matriceimage . tableau [ i ] [ j ] ) ,
int ( matriceimage . tableau [ i ] [ j ] ) )
157 return im
158
159 def h a a r g r a y s c a l e ( s e l f ) :
160 s e l f . grayscalemeanmatrix ( )
161
162 self . a p p l y h a a r l i g ( s e l f . matrixgray . tableau , 0 )
163 self . m a t r i x g r a y . update ( )
164 self . matrixgray . transpose ( )
165 self . m a t r i x g r a y . update ( )
166 self . a p p l y h a a r l i g ( s e l f . matrixgray . tableau , 0 )
167 self . m a t r i x g r a y . update ( )
168 self . matrixgray . transpose ( )
169 self . i m a g e h a a r g r a y = s e l f . makeimagegray ( s e l f . m a t r i x g r a y )
170
171 def update ( s e l f ) :
172 s e l f . s i z e x = matrice . x
173 s e l f . s i z e y = matrice . y
174
175 def c r e a t e c o e f m a t r i x ( s e l f ) :
176 s e l f . matrixcoefr = Matrice ( s e l f . matrixred . x , s e l f . matrixred . y , 0 )
177 s e l f . matrixcoefg = Matrice ( s e l f . matrixred . x , s e l f . matrixred . y , 0 )
178 s e l f . matrixcoefb = Matrice ( s e l f . matrixred . x , s e l f . matrixred . y , 0 )
179 s e l f . m a t r i x c o e f r . copy ( s e l f . m a t r i x r e d )
180 s e l f . m a t r i x c o e f g . copy ( s e l f . m a t r i x g r e e n )
181 s e l f . m a t r i x c o e f b . copy ( s e l f . m a t r i x b l u e )
182
183
184 def haar ( s e l f ) :
185
186 f o r i in [ s e l f . m a t r i x r e d , s e l f . m a t r i x g r e e n , s e l f . m a t r i x b l u e ] :
187 s e l f . a p p l y h a a r l i g ( i . tableau , 0 )
188 i . update ( )
189 i . save ( )
190 i . transpose ()
191 i . update ( )
192 s e l f . a p p l y h a a r l i g ( i . tableau , 0 )
193 i . update ( )
194 i . transpose ()
195
196 f o r i in [ s e l f . m a t r i x c o e f r , s e l f . m a t r i x c o e f g , s e l f . m a t r i x c o e f b ] :
48
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
197 i . save1 ( )
198 s e l f . a p p l y h a a r l i g ( i . tableau , 1 )
199 i . update ( )
200 i . save ( )
201 i . update ( )
202 i . restore ()
203 s e l f . a p p l y h a a r l i g ( i . tableau , 0 )
204 i . update ( )
205 i . transpose ()
206 i . update ( )
207 s e l f . a p p l y h a a r l i g ( i . tableau , 1 )
208 i . update ( )
209 i . transpose ()
210
211
212
213 def makeimage ( s e l f ) :
214 im = Image . new ( ”RGB” , ( s e l f . m a t r i x r e d . x , s e l f . matrixred . y ) , ” white ” )
215 p i x = im . l o a d ( )
216
217 f o r i in range ( s e l f . m a t r i x r e d . x ) :
218 f o r j in range ( s e l f . m a t r i x r e d . y ) :
219 pix [ i , j ] = ( int ( s e l f . matrixred . tableau [ i ] [ j ] ) , int ( s e l f . matrixgreen . tableau [ i
] [ j ] ) , int ( s e l f . matrixblue . tableau [ i ] [ j ] ) )
220 return im
221
222 def c o m p r e s s i o n ( s e l f , e p s i l o n ) :
223 f o r tab in [ s e l f . m a t r i x c o e f r . t a b l e a u , s e l f . m a t r i x c o e f g . t a b l e a u , s e l f . m a t r i x c o e f b .
tableau ] :
224 f o r i in tab :
225 f o r j in range ( len ( i ) ) :
226 i f abs ( i [ j ] ) < e p s i l o n :
227 i[j] = 0
228
229 f o r tab in [ s e l f . m a t r i x c o e f r . t a b l e a u 2 , s e l f . m a t r i x c o e f g . t a b l e a u 2 , s e l f . m a t r i x c o e f b .
tableau2 ] :
230 f o r i in tab :
231 f o r j in range ( len ( i ) ) :
232 i f abs ( i [ j ] ) < e p s i l o n :
233 i[j] = 0
234
235 def s y n t h e s e l i g n e s ( s e l f ) :
236 f o r i in range ( s e l f . s i z e x / 2 ) :
237 f o r j in range ( s e l f . s i z e y / 2 ) :
238 s e l f . pix [ 2 ∗ i , 2 ∗ j ] = ( int ( s e l f . matrixred . tableau [ i ] [ j ] + s e l f . m a t r i x c o e f r .
tableau [ i ] [ j ] ) , int ( s e l f . matrixgreen . tableau [ i ] [ j ] + s e l f . matrixcoefg .
tableau [ i ] [ j ] ) , int ( s e l f . matrixblue . tableau [ i ] [ j ] + s e l f . matrixcoefb .
tableau [ i ] [ j ] ) )
239 s e l f . p i x [ 2 ∗ i +1 ,2∗ j ] = ( i n t ( s e l f . m a t r i x r e d . t a b l e a u [ i ] [ j ] − s e l f . m a t r i x c o e f r .
tableau [ i ] [ j ] ) , int ( s e l f . matrixgreen . tableau [ i ] [ j ] − s e l f . matrixcoefg .
tableau [ i ] [ j ] ) , int ( s e l f . matrixblue . tableau [ i ] [ j ] − s e l f . matrixcoefb .
tableau [ i ] [ j ] ) )
240
241 def s y n t h e s e c o l o n n e s ( s e l f ) :
242
243 f o r y in range ( len ( s e l f . m a t r i x c o e f r . t a b l e a u 2 [ 0 ] ) ) :
244
245 f o r x in range ( len ( s e l f . m a t r i x c o e f r . t a b l e a u 2 ) ) :
246
247 s e l f . pix [ x , 2 ∗ y ] , s e l f . pix [ x ,2∗ y + 1 ] = ( int ( s e l f . pix [ x , 2 ∗ y ] [ 0 ] + s e l f .
m a t r i x c o e f r . tableau2 [ x ] [ y ] ) , int ( s e l f . pix [ x , 2 ∗ y ] [ 1 ] + s e l f . matrixcoefg .
tableau2 [ x ] [ y ] ) , int ( s e l f . pix [ x , 2 ∗ y ] [ 2 ] + s e l f . matrixcoefb . tableau2 [ x ] [
y ] ) ) , ( int ( s e l f . pix [ x , 2 ∗ y ] [ 0 ] − s e l f . m a t r i x c o e f r . tableau2 [ x ] [ y ] ) , int (
s e l f . pix [ x , 2 ∗ y ] [ 1 ] − s e l f . matrixcoefg . tableau2 [ x ] [ y ] ) , int ( s e l f . pix [ x
,2∗ y ] [ 2 ] − s e l f . matrixcoefb . tableau2 [ x ] [ y ] ) )
248
249 def c l e a r i m a g e ( s e l f ) :
250 f o r i in range ( s e l f . s i z e x ) :
49
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
251 f o r j in range ( s e l f . s i z e y ) :
252 s e l f . pix [ i , j ] = (255 ,0 ,0)
253
254 def f a s t h a a r ( s e l f , e p s i l o n , xa , xb , ya , yb ) :
255
256 f o r x in range ( xa / 2 , xb / 2 ) :
257
258 f o r y in range ( ya / 2 , yb / 2 ) :
259 #c o p i e r l e s 4 p i x e l s dans un c a r r e
260
261 carres = [ ]
262
263 f o r i in range ( 3 ) :
264 c a r r e s . append ( [ [ s e l f . pix [2∗ x ,2∗ y ] [ i ] , s e l f . pix [2∗ x ,2∗ y + 1 ] [ i ] ] , [
s e l f . p i x [ 2 ∗ x +1 ,2∗ y ] [ i ] , s e l f . p i x [ 2 ∗ x +1 ,2∗ y + 1 ] [ i ] ] ] )
265
266 ##ANALYSE
267 o n d l h a u t = [ ( c a r r e s [ i ] [ 0 ] [ 0 ] − c a r r e s [ i ] [ 1 ] [ 0 ] ) /2 f o r i in range ( 3 ) ]
268 o n d l b a s = [ ( c a r r e s [ i ] [ 0 ] [ 1 ] − c a r r e s [ i ] [ 1 ] [ 1 ] ) /2 f o r i in range ( 3 ) ]
269
270 f o r i in range ( 3 ) :
271 c a r r e s [ i ] [ 0 ] [ 0 ] = ( c a r r e s [ i ] [ 0 ] [ 0 ] + c a r r e s [ i ] [ 1 ] [ 0 ] ) /2
272 c a r r e s [ i ] [ 0 ] [ 1 ] = ( c a r r e s [ i ] [ 0 ] [ 1 ] + c a r r e s [ i ] [ 1 ] [ 1 ] ) /2
273
274 ondlmix = [ ( c a r r e s [ i ] [ 0 ] [ 0 ] − c a r r e s [ i ] [ 0 ] [ 1 ] ) /2 f o r i in range ( 3 ) ]
275
276 f o r i in range ( 3 ) :
277 c a r r e s [ i ] [ 0 ] [ 0 ] = ( c a r r e s [ i ] [ 0 ] [ 0 ] + c a r r e s [ i ] [ 0 ] [ 1 ] ) /2
278
279 ##SYNTHESE
280 f o r i in range ( 3 ) :
281 i f abs ( ondlmix [ i ] ) < e p s i l o n :
282 carres [ i ] [ 0 ] [ 1 ] = carres [ i ][0][0]
283 else :
284 carres [ i ] [ 0 ] [ 1 ] = carres [ i ] [ 0 ] [ 0 ] − ondlmix [ i ]
285 carres [ i ] [ 0 ] [ 0 ] = carres [ i ] [ 0 ] [ 0 ] + ondlmix [ i ]
286
287 i f abs ( o n d l h a u t [ i ] ) < epsilon :
288 carres [ i ] [ 1 ] [ 0 ] = carres [ i ] [ 0 ] [ 0 ]
289 else :
290 carres [ i ] [ 1 ] [ 0 ] = c a r r e s [ i ] [ 0 ] [ 0 ] − ondlhaut [ i ]
291 carres [ i ] [ 0 ] [ 0 ] = c a r r e s [ i ] [ 0 ] [ 0 ] + ondlhaut [ i ]
292
293 i f abs ( o n d l b a s [ i ] ) < e p s i l o n :
294 carres [ i ] [ 1 ] [ 1 ] = carres [ i ][0][1]
295 else :
296 carres [ i ] [ 1 ] [ 1 ] = carres [ i ] [ 0 ] [ 1 ] − ondlbas [ i ]
297 carres [ i ] [ 0 ] [ 1 ] = carres [ i ] [ 0 ] [ 1 ] + ondlbas [ i ]
298
299 f o r i in [ 2 ∗ x , 2 ∗ x + 1 ] :
300 f o r j in [ 2 ∗ y , 2 ∗ y + 1 ] :
301 s e l f . p i x [ i , j ] = ( c a r r e s [ 0 ] [ i −2∗x ] [ j −2∗y ] , c a r r e s [ 1 ] [ i −2∗x ] [ j −2∗y ] ,
c a r r e s [ 2 ] [ i −2∗x ] [ j −2∗y ] )
302
303
304
305 def main ( ) :
306
307 image = MatriceImage ( ” images / c h a t . j p g ” )
308 s t a r t = time . time ( )
309
310 image . f a s t h a a r ( 2 , 1 0 , image . s i z e x , 0 , image . s i z e y )
311
312 end = time . time ( )
313 print end − s t a r t
314 image . image . s a v e ( ” c h a t . j p g ” , ’JPEG ’ , q u a l i t y = 1 0 0 )
315
316 if name == ’ main ’:
50
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
317 main ( )
51
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
63 s e l f . l a b e l i m g . image = s e l f . imgtk
64 s e l f . l a b e l i m g . p l a c e ( x = 0 , y=0)
65 s e l f . l a b e l i m g . pack ( )
66
67
68 s e l f . p a r e n t . geometry ( s t r ( s e l f . m a t r i c e i m a g e . s i z e x +5)+” x ”+s t r ( s e l f . m a t r i c e i m a g e . s i z e y
+5)+”+100+300” )
69
70 def a s k s a v e a s f i l e n a m e ( s e l f ) :
71
72 filename = tkFileDialog . asksaveasfilename ( d e f a u l t e x t e n s i o n = ” jpg ” )
73
74 s e l f . image . s a v e ( f i l e n a m e , ’JPEG ’ , q u a l i t y = 1 0 0 )
75
76 def a s k c o m p r e s s i o n ( s e l f ) :
77 global c om pr e ss
78 f e n = Tk ( )
79 f e n . geometry ( ” 300 x100 +300+300” )
80 box = D i a l o g S c a l e ( f e n )
81 f e n . mainloop ( )
82 fen . destroy ()
83 s e l f . compression ( )
84
85 def a s k c o m p r e s s i o n 2 ( s e l f ) :
86 global c om pr e ss
87 f e n = Tk ( )
88 f e n . geometry ( ” 300 x100 +300+300” )
89 box = D i a l o g S c a l e ( f e n )
90 f e n . mainloop ( )
91 fen . destroy ()
92 s e l f . compression2 ( )
93
94 def c o m p r e s s i o n ( s e l f ) :
95
96 self . matriceimage . getmatrixblue ( )
97 self . matriceimage . getmatrixgreen ( )
98 self . matriceimage . getmatrixred ( )
99 self . matriceimage . c r e a t e c o e f m a t r i x ( )
100 self . m a t r i c e i m a g e . haar ( )
101 self . m a t r i c e i m a g e . c o m p r e s s i o n ( c om pr e ss )
102 self . matriceimage . s y n t h e s e l i g n e s ( )
103 self . matriceimage . synthesecolonnes ( )
104 self . labelimg . destroy ()
105
106 s e l f . displayimage ()
107
108 def c o m p r e s s i o n 2 ( s e l f ) :
109
110
111 s e l f . m a t r i c e i m a g e . f a s t h a a r ( compress , 0 , s e l f . m a t r i c e i m a g e . s i z e x , 0 , s e l f .
matriceimage . s i z e y )
112
113 s e l f . labelimg . destroy ()
114
115 s e l f . displayimage ()
116
117 def g r a y s c a l e ( s e l f ) :
118 s e l f . matriceimage . grayscalemeanmatrix ( )
119 s e l f . image = s e l f . m a t r i c e i m a g e . makeimagegray ( s e l f . m a t r i c e i m a g e . m a t r i x g r a y )
120 s e l f . m a t r i c e i m a g e . image = s e l f . m a t r i c e i m a g e . makeimagegray ( s e l f . m a t r i c e i m a g e .
matrixgray )
121 s e l f . labelimg . destroy ()
122
123 s e l f . displayimage ()
124
125 def d i s p l a y i m a g e ( s e l f ) :
126 s e l f . imgtk = ImageTk . PhotoImage ( s e l f . m a t r i c e i m a g e . image )
127 s e l f . l a b e l i m g = L a b e l ( s e l f , image= s e l f . imgtk )
52
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
53
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
9 # Licence : CC−BY−SA
10 #−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
11
12
13 import Image
14 import time
15 import random
16 from o n d e l e t t e s import ∗
17
18
19 def i m a g e g e n ( x ) :
20 im = Image . new ( ”RGB” , ( x , x ) , ” w h i t e ” )
21 return im
22
23
24 def randomize ( pix , x ) :
25 f o r i in range ( x ) :
26 f o r j in range ( x ) :
27 p i x [ i , j ] = ( random . r a n d r a n g e ( 2 5 5 ) , random . r a n d r a n g e ( 2 5 5 ) ,
28 random . r a n d r a n g e ( 2 5 5 ) )
29
30
31 def b e n c h s q u a r e ( ran ) :
32
33 f o r i in ran :
34 image = i m a g e g e n ( 2 ∗ i )
35 p i x = image . l o a d ( )
36 randomize ( pix , 2 ∗ i )
37 s t a r t = time . time ( )
38 f a s t h a a r ( pix , 0 , 0 , 2 ∗ i , 0 , 2 ∗ i )
39 end = time . time ( )
40 print s t r ( i ) + ” ” + s t r ( end − s t a r t )
41
42
43 def f a s t h a a r ( pix , e p s i l o n , xa , xb , ya , yb ) :
44
45 f o r x in range ( xa / 2 , xb / 2 ) :
46
47 f o r y in range ( ya / 2 , yb / 2 ) :
48
49 carres = [ ]
50
51 f o r i in range ( 3 ) :
52 c a r r e s . append ( [ [ p i x [ 2 ∗ x , 2 ∗ y ] [ i ] , p i x [ 2 ∗ x , 2 ∗ y + 1 ] [ i ] ] ,
53 [ pix [2 ∗ x + 1 , 2 ∗ y ] [ i ] , pix [2 ∗ x + 1 , 2 ∗ y + 1 ] [ i ] ] ] )
54
55 ondlhaut = [ ( c a r r e s [ i ] [ 0 ] [ 0 ] − c a r r e s [ i ] [ 1 ] [ 0 ] ) / 2
56 f o r i in range ( 3 ) ]
57 ondlbas = [ ( c a r r e s [ i ] [ 0 ] [ 1 ] − c a r r e s [ i ] [ 1 ] [ 1 ] ) / 2
58 f o r i in range ( 3 ) ]
59
60 f o r i in range ( 3 ) :
61 carres [ i ] [ 0 ] [ 0 ] = ( carres [ i ] [ 0 ] [ 0 ] + carres [ i ] [ 1 ] [ 0 ] ) / 2
62 carres [ i ] [ 0 ] [ 1 ] = ( carres [ i ] [ 0 ] [ 1 ] + carres [ i ] [ 1 ] [ 1 ] ) / 2
63
64 ondlmix = [ ( c a r r e s [ i ] [ 0 ] [ 0 ] − c a r r e s [ i ] [ 0 ] [ 1 ] ) / 2
65 f o r i in range ( 3 ) ]
66
67 f o r i in range ( 3 ) :
68 carres [ i ] [ 0 ] [ 0 ] = ( carres [ i ] [ 0 ] [ 0 ] + carres [ i ] [ 0 ] [ 1 ] ) / 2
69
70 f o r i in range ( 3 ) :
71 i f abs ( ondlmix [ i ] ) < e p s i l o n :
72 carres [ i ] [ 0 ] [ 1 ] = carres [ i ][0][0]
73 else :
74 carres [ i ] [ 0 ] [ 1 ] = carres [ i ] [ 0 ] [ 0 ] − ondlmix [ i ]
75 carres [ i ] [ 0 ] [ 0 ] = carres [ i ] [ 0 ] [ 0 ] + ondlmix [ i ]
76
54
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
55
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
56
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
105
106 hote = ’ ’
107 p o r t = 13337
108
109 c o n n e x i o n = s o c k e t . s o c k e t ( s o c k e t . AF INET , s o c k e t .SOCK STREAM)
110 c o n n e x i o n . bind ( ( hote , p o r t ) )
111 while 1 :
112 connexion . l i s t e n (5)
113
114 m s g r e c u = b” ”
115 print ” a t t e n t e d ’ un c l i e n t ”
116 c o n n e x i o n c l i e n t , i n f o s c o n n e x i o n = connexion . accept ( )
117
118 print ” c l i e n t c o n n e c t e d ”
119
120 while m s g r e c u != b” s t o p ” :
121 time . s l e e p ( 0 . 1 )
122 msg = m s g r e c u . de co de ( )
123
124 i f msg . s t a r t s w i t h ( ’ sendimg ’ ) :
125 print ” image en c o u r s de r e c e p t i o n ”
126 r e c v I m a g e ( c o n n e x i o n c l i e n t , msg )
127 i f msg . s t a r t s w i t h ( ’ c om p re ss ’ ) :
128 f a s t h a a r s r v ( c o n n e x i o n c l i e n t , msg )
129 i f msg . s t a r t s w i t h ( ’ c o e f ’ ) :
130 s e n d C o e f ( c o n n e x i o n c l i e n t , msg )
131
132
133 msg recu = c o n n e x i o n c l i e n t . recv (1024)
134
135
136
137
138 print ( ” E x i t i n g ” )
139 connexion client . close ()
140 connexion . c l o s e ( )
141
142 if name == ” main ”:
143 main ( )
57
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
58
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
90 f o r i in range ( dim [ 0 ] ) :
91 f o r j in range ( dim [ 1 ] ) :
92 tab = unpacker . unpack ( c o e f s [ ( i ∗dim [ 1 ] + j ) ∗ unpacker . s i z e : ( i ∗dim [ 1 ] + j +1)∗
unpacker . s i z e ] )
93
94 px [ 2 ∗ i , 2 ∗ j ] = ( p i x [ i , j ] [ 0 ] + tab [ 0 ] + tab [ 3 ] , p i x [ i , j ] [ 1 ] + tab [ 1 ] + tab [ 4 ] ,
p i x [ i , j ] [ 2 ] + tab [ 2 ] + tab [ 5 ] )
95 px [ 2 ∗ i +1 ,2∗ j ] = ( p i x [ i , j ] [ 0 ] + tab [ 0 ] − tab [ 3 ] , p i x [ i , j ] [ 1 ] + tab [ 1 ] − tab [ 4 ] ,
p i x [ i , j ] [ 2 ] + tab [ 2 ] − tab [ 5 ] )
96 px [ 2 ∗ i , 2 ∗ j + 1 ] = ( p i x [ i , j ] [ 0 ] − tab [ 0 ] + tab [ 6 ] , p i x [ i , j ] [ 1 ] − tab [ 1 ] + tab
[ 7 ] , p i x [ i , j ] [ 2 ] − tab [ 2 ] + tab [ 8 ] )
97 px [ 2 ∗ i +1 ,2∗ j +1] = ( p i x [ i , j ] [ 0 ] − tab [ 0 ] − tab [ 6 ] , p i x [ i , j ] [ 1 ] − tab [ 1 ] − tab
[ 7 ] , p i x [ i , j ] [ 2 ] − tab [ 2 ] − tab [ 8 ] )
98
99
100 print ” e n r e g i s t r e m e n t ”
101 im . s a v e ( ’ 2 ’ + nom , ’JPEG ’ , q u a l i t y = 1 0 0 )
102 conn . send ( b ’ ok ’ )
103
104
105 def main ( a r g ) :
106
107 c o n n e x i o n = s o c k e t . s o c k e t ( s o c k e t . AF INET , s o c k e t .SOCK STREAM)
108 i f ’ r ’ in a r g [ 1 ] :
109 try :
110 connexion . connect ( ( argv [ 3 ] , 13337) )
111 except :
112 c o n n e x i o n . c o n n e c t ( ( ’ s r v . o r d i c l i c . eu ’ , 1 3 3 3 7 ) )
113 else :
114 connexion . connect ( ( ’ l o c a l h o s t ’ , 13337) )
115
116 if ’ s ’ in a r g [ 1 ] :
117 sendImage ( c o n n e x i o n , a r g [ 2 ] )
118 askcompress ( connexion , ’ sr v ’ + arg [ 2 ] )
119 storeImage ( arg [ 2 ] )
120 if ’ d ’ in a r g [ 1 ] :
121 a s k c o e f f ( connexion , arg [ 2 ] )
122
123 c o n n e x i o n . send ( b” s t o p ” )
124 connexion . c l o s e ( )
125
126
127 if name == ” m a i n ”:
128 main ( s y s . a r g v )
59
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
20
21 f = open ( ’ haar . c l ’ , ’ r ’ )
22 f s t r = ”” . join ( f . readlines () )
23 s e l f . program = c l . Program ( s e l f . c o n t e x t , f s t r ) . build ()
24 f . close ()
25
26 def e x e c u t e ( s e l f , e p s i l o n ) :
27
28 tabstl = s e l f . gettl ()
29 t l r = numpy . a r r a y ( t a b s t l [ 0 ] , dtype = numpy . i n t 3 2 )
30 t l g = numpy . a r r a y ( t a b s t l [ 1 ] , dtype = numpy . i n t 3 2 )
31 t l b = numpy . a r r a y ( t a b s t l [ 2 ] , dtype = numpy . i n t 3 2 )
32
33 tabstr = s e l f . gettr ()
34 t r r = numpy . a r r a y ( t a b s t r [ 0 ] , dtype = numpy . i n t 3 2 )
35 t r g = numpy . a r r a y ( t a b s t r [ 1 ] , dtype = numpy . i n t 3 2 )
36 t r b = numpy . a r r a y ( t a b s t r [ 2 ] , dtype = numpy . i n t 3 2 )
37
38 tabsll = s e l f . g e t l l ()
39 l l r = numpy . a r r a y ( t a b s l l [ 0 ] , dtype = numpy . i n t 3 2 )
40 l l g = numpy . a r r a y ( t a b s l l [ 1 ] , dtype = numpy . i n t 3 2 )
41 l l b = numpy . a r r a y ( t a b s l l [ 2 ] , dtype = numpy . i n t 3 2 )
42
43 tabslr = s e l f . getlr ()
44 l r r = numpy . a r r a y ( t a b s l r [ 0 ] , dtype = numpy . i n t 3 2 )
45 l r g = numpy . a r r a y ( t a b s l r [ 1 ] , dtype = numpy . i n t 3 2 )
46 l r b = numpy . a r r a y ( t a b s l r [ 2 ] , dtype = numpy . i n t 3 2 )
47
48 s t a r t = time . time ( )
49 f o r i in [ [ t l r , t r r , l l r , l r r ] , [ t l g , t r g , l l g , l r g ] , [ t l b , trb , l l b , l r b ] ] :
50 mf = c l . m e m f l a g s
51 t l b u f = c l . Buffer ( s e l f . context , mf .READ WRITE | mf . COPY HOST PTR,
h o s t b u f=i [ 0 ] )
52 t r b u f = c l . Buffer ( s e l f . context , mf .READ WRITE | mf . COPY HOST PTR,
h o s t b u f=i [ 1 ] )
53 l l b u f = c l . Buffer ( s e l f . context , mf .READ WRITE | mf . COPY HOST PTR,
h o s t b u f=i [ 2 ] )
54 l r b u f = c l . Buffer ( s e l f . context , mf .READ WRITE | mf . COPY HOST PTR,
h o s t b u f=i [ 3 ] )
55 e p s i l o n = numpy . i n t 3 2 ( e p s i l o n )
56
57 s e l f . program . haar ( s e l f . queue , i [ 0 ] . shape , None , t l b u f , t r b u f ,
ll buf , lr buf , epsilon )
58
59
60 c l . e n q u e u e r e a d b u f f e r ( s e l f . queue , t l b u f , i [ 0 ] ) . w a i t ( )
61
62 c l . e n q u e u e r e a d b u f f e r ( s e l f . queue , t r b u f , i [ 1 ] ) . w a i t ( )
63 c l . e n q u e u e r e a d b u f f e r ( s e l f . queue , l l b u f , i [ 2 ] ) . w a i t ( )
64 c l . e n q u e u e r e a d b u f f e r ( s e l f . queue , l r b u f , i [ 3 ] ) . w a i t ( )
65
66 end = time . time ( )
67
68 print end − s t a r t
69
70 f o r i in range ( s e l f . x / 2 ) :
71 f o r j in range ( s e l f . y / 2 ) :
72 t = s e l f . y /2∗ i + j
73
74 self . pix [2∗ i ,2∗ j ] = ( t l r [ t ] , t l g [ t ] , t l b [ t ] )
75 self . p i x [ 2 ∗ i +1 ,2∗ j ] = ( t r r [ t ] , t r g [ t ] , t r b [ t ] )
76 self . p i x [ 2 ∗ i , 2 ∗ j +1] = ( l l r [ t ] , l l g [ t ] , l l b [ t ] )
77 self . p i x [ 2 ∗ i +1 ,2∗ j +1] = ( l r r [ t ] , l r g [ t ] , l r b [ t ] )
78
79
80 def s a v e ( s e l f , a ) :
81
82 s e l f . image . s a v e ( a , ’JPEG ’ , q u a l i t y = 1 0 0 )
60
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
83
84
85 def g e t t l ( s e l f ) :
86
87 t a b r , tabg , tabb = [ ] , [ ] , [ ]
88 f o r i in range ( s e l f . x / 2 ) :
89 f o r j in range ( s e l f . y / 2 ) :
90 t a b r . append ( s e l f . p i x [ 2 ∗ i , 2 ∗ j ] [ 0 ] )
91 tabg . append ( s e l f . p i x [ 2 ∗ i , 2 ∗ j ] [ 1 ] )
92 tabb . append ( s e l f . p i x [ 2 ∗ i , 2 ∗ j ] [ 2 ] )
93 return t a b r , tabg , tabb
94
95 def g e t t r ( s e l f ) :
96
97 t a b r , tabg , tabb = [ ] , [ ] , [ ]
98 f o r i in range ( s e l f . x / 2 ) :
99 f o r j in range ( s e l f . y / 2 ) :
100 t a b r . append ( s e l f . p i x [ 2 ∗ i +1 ,2∗ j ] [ 0 ] )
101 tabg . append ( s e l f . p i x [ 2 ∗ i +1 ,2∗ j ] [ 1 ] )
102 tabb . append ( s e l f . p i x [ 2 ∗ i +1 ,2∗ j ] [ 2 ] )
103 return t a b r , tabg , tabb
104
105 def g e t l l ( s e l f ) :
106
107 t a b r , tabg , tabb = [ ] , [ ] , [ ]
108 f o r i in range ( s e l f . x / 2 ) :
109 f o r j in range ( s e l f . y / 2 ) :
110 t a b r . append ( s e l f . p i x [ 2 ∗ i , 2 ∗ j + 1 ] [ 0 ] )
111 tabg . append ( s e l f . p i x [ 2 ∗ i , 2 ∗ j + 1 ] [ 1 ] )
112 tabb . append ( s e l f . p i x [ 2 ∗ i , 2 ∗ j + 1 ] [ 2 ] )
113 return t a b r , tabg , tabb
114
115
116 def g e t l r ( s e l f ) :
117
118 t a b r , tabg , tabb = [ ] , [ ] , [ ]
119 f o r i in range ( s e l f . x / 2 ) :
120 f o r j in range ( s e l f . y / 2 ) :
121 t a b r . append ( s e l f . p i x [ 2 ∗ i +1 ,2∗ j + 1 ] [ 0 ] )
122 tabg . append ( s e l f . p i x [ 2 ∗ i +1 ,2∗ j + 1 ] [ 1 ] )
123 tabb . append ( s e l f . p i x [ 2 ∗ i +1 ,2∗ j + 1 ] [ 2 ] )
124 return t a b r , tabg , tabb
125
126
127 def main ( a r g s ) :
128 img = Climage ( a r g s [ 1 ] )
129
130 img . e x e c u t e ( 1 0 )
131
132 img . s a v e ( a r g s [ 2 ] )
133
134
135 if name == ” m a i n ”:
136 main ( s y s . a r g v )
61
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
9 tl [ i ] = ( tl [ i ] + tr [ i ]) /2;
10 ll [ i ] = ( ll [ i ] + lr [ i ]) /2;
11 i n t ondlmix = ( t l [i ] − l l [ i ] ) /2;
12 tl [ i ] = ( tl [ i ] + ll [ i ]) /2;
13
14 i f ( abs ( ondlmix ) < e p s i l o n ) { o n d l h a u t = 0 ; } ;
15 i f ( abs ( o n d l b a s ) < e p s i l o n ) { o n d l b a s = 0 ; } ;
16 i f ( abs ( o n d l h a u t ) < e p s i l o n ) { ondlmix = 0 ; } ;
17
18 l l [ i ] = t l [ i ] − ondlmix ;
19 t l [ i ] = t l [ i ] + ondlmix ;
20
21 t r [ i ] = t l [ i ] − ondlhaut ;
22 t l [ i ] = t l [ i ] + ondlhaut ;
23
24 l r [ i ] = l l [ i ] − ondlbas ;
25 l l [ i ] = l l [ i ] + ondlbas ;
26 }
62
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
63
Introduction à la théorie des ondelettes Xavier Friederich et Gaétan Bahl
64