Académique Documents
Professionnel Documents
Culture Documents
L. Beaudoin - A. Gademer
1 Objectifs du TD
Le premier TD posait, avec le logiciel GIMP, les premices du traitement dimage avec les notions
de dimensions (hauteur, largeur, profondeur) dune image, despaces colorimetriques, dechantillonnage,
dhistogrammes, de ltre de convolution et meme de composition dimages ! Toutes ces operations
ont ete eectuees manuellement par lintermediaire de lIHM du logiciel, il est desormais temps de
plonger au cur du probl`eme et coder nos propres algorithmes.
Dans ce TD, nous allons coder un certain nombre dalgorithmes classiques de traitement
dimage. Le but nest pas de creer un logiciel concurrent `a GIMP mais de comprendre ce qui
se passe `a linterieur an de faire faire au logiciel ce que NOUS voulons.
Comme les annees precedentes, nous avons fait le choix de ne pas mettre laccent sur la concep-
tion ergonomique de lIHM (bien que ce sujet soit tr`es important) mais sur limplementation cor-
recte des algorithmes. Un petit changement pourtant, nous travaillerons cette annee en Java plutot
quen C/GTK. Ce choix sexplique par une simplication de la partie IHM avec une equivalence
au niveau des algorithmes.
Vous trouverez de laide et des explications sur le fonctionnement de toutes les classes utilisees
dans lAPI Java 1.5.
http://java.sun.com/j2se/1.5.0/docs/api/
2 Le projet
Vous trouverez avec ce document une archive .tar.gz contenant un projet Eclipse qui sera le
squelette du TD.
1. Telechargez larchive
2. Decompressez-la
3. Lancer Eclipse
4. Choisissez Import... puis Existing project into Workspace dans longlet General
5. Validez par Next
6. En face de Select Root Directory cliquez sur Browse... et indiquez le repertoire racine conte-
nant le repertoire du projet.
7. Le projet doit apparaitre dans la liste en dessous.
8. Cliquez sur Finish
Dans le repertoire src vous trouverez le package gui qui contient quatre chiers :
Application.java contient la classe principale. Cest elle que lon execute (Run as...) et
cest celle que vous serez amenee `a modier.
ExampleFileFilter.java sert `a acher les menus de choix de chier.
Picture.java etend JPanel. Cest le composant Image de notre IHM.
PictureFrame.java permet dacher les images quelle que soit leur taille grace `a des barres
delement.
Les trois derni`eres classes sont l`a pour lIHM et vous naurez pas `a y toucher. Cependant, si vous
etes un peu curieux, ces classes pourront vous resservir pour developper de nombreuses interfaces.
1
3 LIHM
3.1 Lancement
Si vous lancez Application.java (Click Droit : Run as...)vous devriez voir la Fig 1. Linterface
se compose de deux parties. La partie du haut presente trois champs permettant de selectionner
des images ainsi quune serie de boutons declenchant des operations. La partie du bas, vide pour
linstant permet dacher le resultat de loperation. (Fig 2).
Fig. 1 LIHM au lancement de lapplication.
3.2 Structure de la classe
Comment la classe Application permet-elle tout cela ? La classe poss`ede une structure classique
pour les programme avec une interface base sur Swing, lAPI dIHM de Java.
Elle poss`ede un champ prive nomme mainPane de type JPanel, le conteneur de base de lAPI
Swing ; mainPane va donc contenir lensemble des elements que lon desire acher
`a lecran.
Elle poss`ede un constructeur par defaut (Application()) qui remplit et initialise mainPane.
Elle poss`ede une methode statique createAndShowGUI() qui cree un objet de type JFrame
(objet fenetre), cree une nouvelle instance dApplication quelle associe `a la fenetre puis
ache cette derni`ere.
Enn elle poss`ede la methode main(String[]) qui fait de notre classe un executable et qui
enrobe la methode createAndShowGUI() dans un thread.
Cette architecture logicielle est celle que vous trouverez dans la majorite des exemples fournis
par Sun. Elle a lavantage de separer proprement la denition de linstanciation et de lexecution.
2
Fig. 2 LIHM apr`es lexecution dune operation.
3.3 Assemblage des composants
Revenons rapidement `a linitialisation de mainPane. Allez `a la denition du constructeur Application().
Celle-ci peut paraitre longue et illisible au depart mais vous verrez quelle nest pas si complexe.
Petit rappel de base : tout les objets visibles dans la fenetre du programme se nomment des
Composants. Nous utilisons ici des etiquettes (JLabel), des champs de saisie (JTextBox), des
boutons (JButton) et un cadre pour notre image resultat (PictureFrame). Ces composants sont
organises dans des botes (JPanel) selon dierentes organisations (Layout).
Nous utilisons les JTextBoxs pour ecrire le chemin vers limage selectionnee. Comme cest un
eet visuel, on a desactive ledition de ces champs.
r e s ul t = cal cul at e Mi r oi r V ( ) ;
puis la mise `a jour du cadre dimage,
i mageResul t . ge t Pi c t ur e ( ) . setImage ( r e s ul t ) ;
puis lactualisation du cadre et
i mageResul t . updateUI ( ) ;
enn lachage du cadre.
i mageResul t . s e t Vi s i bl e ( true ) ;
Toute lIHM etant en place, il ne reste plus qua implementer les algorithmes !
4 Pour commencer
4.1 Ouvrir une image
Nous allons commencer par observer la fonction openImage(File fichier) :
Ouvri r l image 1
Creer une image r e s ul t a t de meme t a i l l e que l image 1.
Pour chaque col onne
| Pour chaque l i g ne
| | Prendre l e pi xe l de l image 1 et l envoyer
| | de l aut r e c ote dans l image r e s ul t a t .
Nous verrons cette histoire dautre cote plus tard.
Voyons le code que vous avez pour le moment :
Ouvri r l image 1
Creer une image r e s ul t a t de meme t a i l l e que l image 1.
Pour chaque col onne
| Pour chaque l i g ne
| | Ext r ai r e l e s canaux Rouge , Vert et Bleu du pi xe l de l image 1
| | Cal cul er l a val eur de ni veau de g r i s cor r es pondant e .
| | Ec r i r e l a val eur de l e nt i e r RGB dans l e pi xe l de l image r e s ul t a t
Implementez les deux formules. Voyez-vous une dierence signicative ?
Rappel : en RGB, les niveau de gris sont represente par les triplets dont les trois composantes
sont egales ( [0,0,0], [128,128,128], [255, 255, 255] ).
5.4 Composition coloree
Implementez lalgorithme qui prend trois images en niveau de gris en entree et qui produit une
image o` u la composante bleue est tiree de limage 1, la composante verte est tiree de limage 2 et
la composante rouge est tiree de limage 3.
Faites attention de verier que les trois images aient la meme taille !
Essayez avec les images Meteosat (1 : VIS006, 2 : VIS008, 3 : IR 016). On appelle cette com-
position coloree Fausse couleur. Pouvez-vous dire pourquoi ?
8
5.5 Aerosols
On utilise les compositions colorees avec les images satellites pour mettre en evidence des
phenom`enes que lon veut observer. En utilisant les dierences de valeurs radiometriques dans
certains canaux, on peut faire ressortir lobjet de notre etude.
Pour visualiser les aerosols, cest-`a-dire les particules en suspension dans latmosph`ere (poussi`ere,
sable) on utilise une composition coloree basee sur les canaux IR 087, IR 108 et IR 120 selon la
repartition suivante :
_
_
R = IR 108 IR 087
G = IR 120 IR 108
B = IR 108
(3)
Implementez lalgorithme qui prend trois images en niveau de gris en entree (1 : IR 087, 2 :
IR 108, 3 : IR 120) et qui produit une composition coloree respectant la relation precedente.
Faites attention de verier que les trois images aient la meme taille !
Attention ! Si lon soustrait deux nombres compris dans linterval [0..255], on obtient un
nombre entre... -255 et 255. Il faut donc penser `a rapporter cette valeur dans [0..255].
Il ne faut surtout pas utiliser le modulo, la valeur absolue ou tout traitement
separe des donnees (si... alors) ! En eet, lanalyse visuelle repose sur la coherence des donnees
et lutilisation de fonction non bijective introduirait un repliement des couleurs.
Que faire alors ? Trouvez la fonction ane ax + b qui transforme un interval en lautre. Pour
ce faire il y a une methode tr`es simple :
Soit un interval [m M] de depart et [0 255] `a larrivee.
On uniformise les origines en soustrayant m : [m M] => [0 M-m]
On divise par le coecient proportionel
255
Mm
: [0 M-m] => [0 255]
A vous de jouez !
5.6 NDVI
Le NDVI (Indice de Vegetation base sur la Dierence Normalise) est une valeur entre -1 et 1
denie comme suit :
NDV I =
NIR RED
NIR +RED
(4)
Implementez lalgorithme qui prend deux images en niveau de gris en entree et qui produit une
image en niveau de gris correspondant au NDVI.
On prendra 1 :VIS006 = RED et 2 :VIS008 = NIR.
Attention ! (NIR+RED) peut valoir 0, dans ce cas la convention dit que NDVI est sature `a 1.
Attention ! Le NDVI est une valeur reelle appartenant `a lintervalle [-1..1]. Il faut donc la
ramener ` a une valeur enti`ere sur 1 octet [0..255].
Attention ! Le NDVI [0..255] correspond `a une composante unique. Comme dans le cas du
niveau de gris, utilisez makeRGB(...).
Faites attention de verier que les deux images aient la meme taille !
Bonus : Les valeurs de vegetation caracteristiques se trouvent entre 0,2 et 0,9 de NDVI. Pouvez
vous rajouter un test qui permettrait de colorer en vert les pixels repondant `a ce crit`ere ?
5.7 Convolution
Derni`ere etape !
Voyons voir comment appliquer un ltre de convolution `a notre image.
On parle de convolution dune image par une matrice quand :
9
i=0
N
j=0
i
(col
N
2
i,row
N
2
j)
m
(i,j)
(7)
Attention! Comme vous ne pouvez pas savoir `a lavance, quel est linterval des valeurs possible
en sortie de la convolution, il vous faudra :
soit centrer (+128) et saturer votre resultat (en considerant une matrice dont la somme des
coecient fait 0 (interval [-V..V])).
soit calculer la valeur v
min
et v
max
et projeter les valeurs sur [0..255].
Pour calculer v
min
et v
max
, une methode proposer par Florent Martin et Remi Jacques Le
Seigneur :
I n i t i a l i s e r l e minimum et l e maximum ` a 0
Pour chaque cas e de l a matri ce M
| Si M( i , j ) e s t ne gat i f , aj out e r M( i , j ) 255 au minimum
| Si M( i , j ) e s t po s i t i f , aj out e r M( i , j ) 255 au maximum
6 Conclusion
Bravo ! Si vous etes arrives jusquici, vous etes maintenant prets `a tester par vous-meme tous
les algorithmes possibles et imaginables de traitement dimage !
Faites-vous plaisir !
10