You are on page 1of 12

Projet programmation C ou C++: Initiation au

traitement dimages
Master 1 Probabilite, Paris 6
March 18, 2008

1 A lattention des eleves


1.1 objet
Ce projet est a faire a la maison et a rendre pour le 10 Avril au plus tard. Le
travail peut etre effectue en binome ou trinome. Le code fournit en exemple (cf
repertoire src et include) est ecrit en C mais le projet pourra etre ecrit aussi
bien en C++ suivant la convenance du programmeur, il faudra alors adpater le
code propose. Notamment on pourra remplacer les structures par des classes,
les fonctions par des methodes sappliquant aux classes et utiliser la surcharge
doperateurs (pour les fonctions add et mult) et les templates. Les projets
pourront faire lobjet dune note bonus qui sera comptee si elle rehausse la
moyenne de la note finale du module de programmation.

1.2 travail a fournir


Les projets sont a rendre sous forme informatique. On devra envoyer le repertoire
racine du Projet contenant les repertoires src, include, bin, doc, images et obj.
Le repertoire racine devra etre renomme afin de faire apparaitre les noms du
binome ou trinome. Le repertoire est compose comme suit :
. : a la racine figure le fichier Makefile, pour compiler taper make a la racine.
src : contient les .c du programme.
include : contient les .h.
bin : contient lexecutable. Pour executer il faut se placer dans bin et lancer
./ProgPrincipal, ./ProcessImage ou ./GUIsnake en fonction de ce que lon
veux tester.
obj : contient les fichiers temporaires .o.
images : contient les images de test.
doc : contient des documents scientifiques et doit contenir aussi le rapport
de projet.

1
Le repertoire sera zipe et envoye a ladresse suivante avant le 10 Avril: were-
marc@yahoo.fr. Le code devra etre compilable (avec make) et executable. Un
programme generant des erreures a la compilation sera rejete. Le code doit etre
commente et correctement indente.
Le rapport de projet (a placer sous le repertoire doc) est un bref document
de compte rendu (2 a 5 pages) qui doit contenir:

la presentation generale des travaux


la reponse aux questions posees dans ce rapport
la description des difficultes rencontrees et une estimation du temps passe
sur le projet
eventuellement des explications sur certains programmes specifiques en
complement des commentaires inseres dans le code.

1.3 sens de lecture


Ce rapport se decoupe en trois parties de difficultes graduelles. Ce sujet est
accompagne dun repertoire Projet contenant les squelettes des programmes et
des astuces pour les developper. Certaines questions sont presentees comme
[Facultatives], cest a dire quelles devront etre traitees de facon moins pri-
oritaire et si le temps le permet. Dautres questions seront intitulees Pour
approfondir..., celles-ci sont en general plus difficile et son a destination du
lecteur curieux qui voudra creuser la question. Si des solutions valides sont ap-
portees a ces problemes ce sera evidement tres aprecie. Pour toutes recherche
dinformations sur des fonctions c, consultez les pages man (sous le shell man
nom fonction).

2 Introduction
Le traitement dimages est un domaine large qui a de nombreuses applications
notamment dans la compression dimages (format JPEG, MPEG), la surveil-
lance video (reconnaissance de visages, detection de mouvements), linformatique
industriel (controle visuel dans les chaines de production) ou la robotique (as-
servissement visuel et localisation type SLAM). Ce projet propose daborder
quelques unes de ces problematiques, en particulier la compression dimages et
la detection de contour.
Nous verrons dabord comment stoquer une image en memoire et lecrire dans
un fichier. Ensuite seront proposes la programmation de quelques operateurs
simples de traitement dimage et doperateurs plus elabores comme la dct a
lorigine du format JPEG. Enfin, on se focalisera sur le domaine de la detection
de contour en developpant un algorithme de type Snake.

3 PARTIE I: Lecture/Ecriture dune image


3.1 classification des images
Il existe trois grands types dimages numeriques:

2
les images noir et blanc
les images en niveau de gris
les images couleures
On pourrai ajouter a cette liste les images multi-spectrales qui peuvent coder
les informations de plusieurs bandes de frequences mais nous ne chercherons pas
a les representer. Une image numerique est consideree comme une matrice de
pixels, et plus precisement comme un tableau dentiers a 2 dimensions. Pour
les images noir et blanc un pixel est code sur 1 bit :0 pour le noir et 1
pour le blanc. Pour les images en niveau de gris un pixel est code sur 8 bits,
plus precisement, par un entier compris entre 0 (noir) et 255 (blanc). Pour
les images couleurs un pixel est un triplet dentiers codant les trois couleurs
primaires (rouge, vert, bleu) qui permettent en les combinant de representer
toutes les couleures. Chaque couleur primaire peut etre code sur 8 bits ou 16
bits (voir 32 bits) pour les images de qualite superieure. En effet plus la plage
de valeur est grande, plus on peut representer avec finesse la palette de couleurs.

3.2 le format dimage pnm


Le format dimage pnm permet de representer les trois types dimages que nous
avons decrit precedement. Il se decline en trois nominations en fonction de la
nature des images:
image.pbm de type P1 pour les images noir et blanc
image.pgm de type P2 (ascii) ou P5 (raw) pour les images en niveau de
gris
image.ppm de type P3 (ascii) ou P6 (raw) pour les images couleures
Les images au format raw sont codee en binaire (ie code machine) tandis que les
images au format ascii sont codees au format texte. Les images ascii sont plus
couteuses en memoire mais elles peuvent etre lues avec un editeur de texte, nous
allons donc travailler essentiellement avec ces dernieres (c.a.d avec les types P1,
P2 et P3). Le format P4 ne sera pas considere.
En fait, un fichier pnm est structure de la facon suivante:
en premiere ligne, le type de limage: de P1 a P6
apres peuvent figurer plusieures lignes de commentaires precedees par le
symbole #
figure ensuite sur la meme ligne la taille de limage, dabord la largeur et
ensuite la hauteur
la ligne dapres vient la valeur maximale que peut prendre un pixel.
les lignes suivantes representent la liste des pixels, a commencer par la
premiere ligne de limage. Un nombre par pixel pour les images N&B ou
grises, trois nombres par pixels pour les images couleures

3
Question1: Lire limage couleure cosmic.ppm (situee dans im-
ages/) avec un viewer dimage (tapez xv bjork.pgm) puis lire limage avec
xemacs. Que constatez vous ? Quel type dimage est-ce ? Quelle est sa taille ?
Quelle est la couleur du troisieme pixel ?

3.3 chargement dun fichier pnm


Le but est maintenant de lire un fichier pnm et de le stoquer en memoire. Pour
cela on va creer une structure image qui aura la forme suivante:

Structure dun pixel:

struct rgb
{
int r;
int g;
int b;
};

Structure dune image:

struct image
{
int height;
int width;
int type;
int maxval;
rgb** im;
};

im est un tableau de tableau. Le premier tableau fait reference aux lignes de


limage (dont le nombre est height), le second aux colonnes (de nombre width).
Ainsi pour acceder au pixel situe a la ligne i et colonne j il faut appeler im[i][j]

Lallocation dune image est un processus dont nous aurons souvent besoin,
il est utile de pouvoir avoir une fonction qui se charge uniquement de la creation
dune image en memoire pour eviter davoir a recopier ce code plusieurs fois. Une
fonction timage allocate image(int height, int width) qui effectue lallocation
en memoire dune image a ete implementee dans le fichier IoImage.c ainsi quune
fonction qui permet de copier une image a partir dune autre.

Question2: ecrire une fonction readpnm qui prends en entree un nom


de fichier existant et qui charge ce fichier dans une structure image. Un squelette
de cette fonction est definit dans src/IoImage.c. Vous pourrez utiliser fgetc
pour recuperer un seul caractere et fscanf pour recuperer une chaine de car-
acteres. Cette fonction appellera allocate image pour allouer de la memoire
pour limage.

4
3.4 ecriture dun fichier pnm
La partie duale est lecriture du fichier a partir de sa representation memoire.

Question3: ecrire une fonction writepnm qui prends en entree une


structure image et un nom de fichier a creer et qui ecrit limage dans ce fichier.
Un squelette de cette fonction est definit dans src/IoImage.c.

Question4: Testez les fonctions de lecture et decriture dans src/ProgPrincipal.c.


Pour tester vous pouvez charger une image avec readpnm, la sauvegarder sous
un autre nom avec writepnm et comparer les deux images avec le viewer xv.
Faites le test trois fois, pour une image binaire (lena.pbm), une image niveau
de gris(bjork.pgm) et une image couleure (cosmic.ppm).

4 PARTIE II: Operations sur une image


Dans cette partie on va chercher a modifier une image par des operations de
transformee. Ces fonctions vont toutes suivrent le meme procede: prendre en
entree une image imIn, effectuer une operation dessus et renvoyer en sortie une
nouvelle image imOut: int transf orm(timageimIn, timageimOut, parametres eventuelles).
imIn est fournit en entree et ne devra pas etre modifie, imOut est aussi passe
en parametre, cest un pointeur qui devra avoir ete alloue par la fonction
appelante. La fonction transform se charge de remplir limage imOut avec
les donnees isues du traitement de imIn. Cette fonction renvoit 0 si tout cest
bien passe et 1 si un probleme a ete detecte (par exemple si les parametres sont
incoherents, si limages imIn ou imOut sont non allouee, etc).

4.1 Operation Binarize


Cette premiere operation est tres simple, elle consiste a transformer une image
quelconque (niveau de gris ou couleure) en image binaire a laide dun seuil. Le
seuil correspond a la valeur limite du pixel qui separe le noir du blanc.

Question5: ecrire une fonction binarize int binarize(timage imIn, timage


imOut, int seuil), quelques astuces pour ecrire cette fonction sont definies
dans src/TTImage.c. Testez la sur une image niveau de gris et couleure.
Pour effectuer les tests vous pouvez utiliser le programme principal ecrit dans
ProcessImage.c qui permet de specifier limage dentree, limage de sortie et
loperation a effectuer. Modifiez la variable EXEC du makefile afin quelle
pointe sur P rocessImage. Tapez make sous la racine pour recompiler et lancez
le programme de test ./ProcessImage depuis bin. Vous verez safficher une aide
qui vous indiquera comment lutiliser. Un certain nombres doperateurs sont
proposes mais pour linstant ils ne font rien puisque vous ne les avez pas encore
implementes. Seul loperateur bin[param] vous donnera un resultat. Tapez par
exemple ./ProcessImage ../images/bjork.pgn bin 125 ../images/bjork bin125.pbm.

Pour approfondir...: Lire le fichier P rocessImage.c et re-


garder comment sont traites les parametres du programme a travers les variables
argc, argv[]. Ajouter la prise en compte dun mot cle help en parametre du

5
programme qui affiche comment utiliser la classe et en plus rajoute un exem-
ple dutilisation. Ainsi ./ProcessImage help devra afficher une aide detaillee
dutilisation du programme.

4.2 Operation daddition et multiplication par un scalaire


Certaines operations permettent de modifier la luminosite et le contraste dune
image. Nous proposons ici deux operations elementaires qui consistent a modi-
fier la valeur des pixels de limage par ajout dun scalaire ou multiplication par
un scalaire.

Question5bis[Facultative]: Ecrire une fonction mult int mult(timage


imIn, timage imOut, f loat coef, char canal) qui multiplie tous les pixels du
canal specifie en entree par un coefficient reel positif k. Pour specifier un canal
en entree on passera un caractere valant r, g , b ou a si on veux modifier
tous les canaux de limage. Attention, si apres loperation les pixels depassent
la valeur maxval ils doivent etre affecte a maxval.
Ecrire une fonction equivalente add int add(timage imIn, timage imOut, f loat coef, char canal)
qui ajoute a tous les pixels du canal specifie en entree un entier naturel k. Pour
specifier un canal en entree on passera un caractere valant r, g , b pour mod-
ifier un canal ou a si on veux modifier tous les canaux de limage. Attention,
en pus de maxval il faut tester aussi ici le cas ou les pixels sont negatifs, on leur
affectera alors la valeure 0.
Testez ces deux fonctions sur les images bjork.pgm: multiplier limage par 2.0
et 0.5, observez le resultat. Ajouter limage a 50 et -50, observez le resultat.
Selon vous ces operations agissent sur la luminosite de limage, le contraste ou
les deux ? Enfin faites un test de ces deux fonctions sur une image couleure
(cosmic.ppm par exemple) en ne modifiant quun canal (r par exemple).

Pour approfondir...: Pour controler plus finement le contraste


ou la luminosite dune image on agit sur lhistogramme de limage qui donne
le nombre de pixels en fonction de leurs valeurs (entre 0 et 255 pour les im-
ages niveau de gris). On peut ainsi appliquer a limage des fonctions de fil-
trage spectral qui transforment la valeur des pixels et modifient ainsi lallure
de lhistogramme. Ecrire une fonction qui creer un histogramme a partir dune
image et une fonction qui laffiche sous gnuplot. Trouver la f onction : pixel
pixel qui va permettre de diminuer le contraste, c.a.d qui va tasser le spectre
de lhistogramme (les pixels ont tous valeurs proches autour de maxval/2) et
une fonction qui va permetttre daugmenter le contraste, c.a.d qui va etaler le
spectre de lhistogramme (les pixels prennent toutes les valuers possibles entre
0 et maxval).

4.3 Operation Filterize


Loperation de filtrage permet de modeliser aussi bon nombres de phenomenes
comme le flou ou a contrario laccentuation des contours. Cette operation con-
siste a appliquer un filtre (au sens traitement du signal) a une image. Le filtre
est definit comme une fenetre carree de taille N*N quon va appliquer a tous

6
pixels de limage. Ainsi le pixel va etre modifie en fonction des informations de
son voisinage. N est un entier impaire et on pose N = 2 R + 1 ou R est le rayon
du filtre. Si limage et le filtre sont consideres comme des fonction a valeur de
N 2 N alors on peut ecrire:
image : (i, j) [0, length 1] [0, width 1] im(i, j)
f iltre : (m, n) [R, R] [R, R] p(m, n)
X
imagef iltered(i, j) = image(i + m, j + n) f iltre(m, n) (1)
Rm,nR

Cela revient a effectuer un produit de convolution entre image et philtre :

imagef iltered = image f iltre (2)

Question6 : creer une structure tfilter en sinspirant de celle de


timage pour definir un filtre carre de taille N*N. Ajouter la definition de cette
structure dans TTImage.h.

Question7 : ecrire une fonction Filterize : int f iltering(timage


imIn, timage imOut, tf ilter f ilter) qui applique un filtre a une image.
Faites bien attention aux problemes de bords de limage.

Question8 : Testez la fonction sur les filtres suivants avec limage


bjork.pgm.

1/9 1/9 1/9


Filtre 1: Filtre moyen 1/9 1/9 1/9
1/9 1/9 1/9
Selon-vous a quoi correspond le Filtre1 ? Quels sont ses effets sur limage
bjork.pgm ? Utiliser un filtre plus grand 21*21 pour confirmer vos impressions
(en adaptant la valeur des coefficients).

1 0 -1
Filtre 2: Filtre de Prewit en x 1 0 -1
1 0 -1
Selon-vous a quoi correspond le Filtre2 ? Quels sont ses effets sur limage
bjork.pgm ?

1 1 1
Filtre 3: Filtre de Prewit en y 0 0 0
-1 -1 -1
Selon-vous a quoi correspond le Filtre3 ? Quels sont ses effets sur limage
bjork.pgm ? En fait les Filtre2 et Filtre3 ont des effets complementaires sur une
image, on peut combiner leurs effets en ajoutant les energies de leurs deux images
resultantes. ecrire une fonction qui combine deux images par la somme de leurs
energies : int mix image(timage
p imIn1, timage imIn2, timage imOut)
avec imOut(p) = (imIn1(p)2 + imIn2(p)2 ). A partir de cette fonction
ecrire une fonction int N ormalizedGrad(timage imIn, timage imOut)
qui appel la fonction mix image avec les images imIn1 = F iltre2 imIn et
imIn2 = F iltre3 imIn. Cette fonction calcul en fait la norme du gradient
dune image, nous lutiliserons dans la partie3. Visualisez limage en sortie,

7
quobservez-vous ?

0 1 0
Filtre 4: LOG 1 -4 1
0 1 0
Ce dernier filtre est tres utilise, il sappel filtre LOG comme Laplacien-Of-
Gaussians, pouvez-vous expliquer pourquoi porte-t-il ce nom ? Observez ses
effets sur limage bjork.pgm et lena.pgm.

4.4 Operation AddNoise


On parle de bruit dans une image lorsque quelques pixels de limage ont une
valeur modifiee par rapport a limage dorigine. Le bruit peut etre additif, sous-
tractif ou multiplicatif. Ce phenomene qui degrade limage peut etre dut a la
mauvaise qualite des cameras , a des interferences sur les canaux de transmis-
sion ou tout simplement a un bruit naturel de lenvirronnement qui occulte la
zone dinteret recherchee (par exemple la pluie, la neige ou les perturbations
atmospherique).
On va chercher a simuler ce phenomene avec une operation AddN oise qui va
ajouter un bruit blanc (ie gaussien) a une image. Si limage est binaire le bruit
changera la valeur du pixel en son oppoe, si elle est couleure, le bruit sajoutera
a tous les canaux. Le bruit sera modelise par une variable aleatoire gaussienne
ramenee a une valeur entiere. Il sappliquera a tous les pixels de limage.
Le theoreme de la limite centrale nous dit quil est possible de generer une
variable aleatoire gaussienne a partir dune variable aleatoire uniforme pourvu
quon dispose de suffisament de representations de celles ci (un nombre infini
theoriquement). Comme nous ne disposons pas dune puissance de calcul infini,
nous allons utiliser lalgorithme de Box-Muller pour approcher au mieux une
v.a gaussienne bien que dautres algorithmes (transforme inverse, zigurat . . . )
pourront tres bien etre utilises par le lecteur suivant sa convenance. Algorithme
de Box-Muller:
Soient x et y choisits independemment et uniformement dans [1, 1], et
s = x2 + y 2 . Si s > 1, rejetons-le et choisissons a nouveau un couple (x, y),
jusqua ce que s (0, 1]. Pour ces points filtres, calculons ensuite:
r r
2 2
z0 = x. z1 = y. (3)
ln s ln s
Alors z0 et z1 sont independantes et suivent approximativement une loi gaussi-
enne.

Question9 : ecrire une fonction addNoise int addN oise(timage


imIn, timage imOut, intmean, intsigma) ou mean et sigma sont respective-
ment la moyenne et lecart type de la gaussienne. Testez la sur limage niveau
de gris bjork.pgm pour differentes valeurs de mean et sigma. A quelles valeurs
de mean et sigma limage nest plus visuellement de qualite acceptable ?

8
4.5 Operation DCT [Facultatif ]
On parle de filtre passe-bas en traitement du signal lorsquon attenue les hautes
frequences dun signal pour ne laisser passer que les basses. Cest le cas du Fil-
tre1 que nous avons utilise en 4.2. Une image peut etre vue comme un signal 2D
tronque et echantillone. Elle possede donc 2 frequences dites frequence spatiale
fx et fy. Ces frequences sont representatives des contours de limage. Par exem-
ple, un contour vertical franc est un changement brutal de valeur pour les lignes
de limage, c.a.d un fort contraste horizontal qui va induire une forte frequence
spatiale fx dans limage. Pour mieux se rendre compte de ce phenomene, il
existe un outil puissant qui permet de passer de lespace des positions a lespace
des frequences, cest la transforme de Fourier. En pratique, on utilise plutot la
DCT (Discrete Cosinus Transform) pour implementer cette operation:
DCT : im(i, j) : i, j : position imtrasnf (i, j) : i, j : f requencespatiales
p
C(i)C(j) X (2k + 1)j (2l + 1)i
T im(i, j) = 0<k<N 1 cos cos
im(l, k) (4)
N 0<l<N 1 2N 2N
avec :
1 l=0
C(l) = {
2 l 6= 0
N correspond a la taille du bloc sur lequel est effectue loperation. On pren-
dra dans ce qui suit N = length=width=taille dune image carree.

Question10[Facultative] : ecrire une fonction int dct(timage


imIn, timage imOut) qui calcul la dct dune image carree. Calculez la dct de
limage bjork.pgm et observez le resultat. Appliquez le Filtre1 a bjork.pgm
avec pour taille 9*9 et renomez limage en bjorkBlur.pgm. Calculez la dct de
bjorkBlur.pgm, que constatez vous par rapport a la premiere DCT calculee?

De la meme facon, on peut calculer la DCT inverse dune image par la for-
mule: DCT 1 : imtransf (i, j) avec i, j : f requencespatiale im(i, j) :
aveci, j : position

1 X (2j + 1)k (2i + 1)l


im(i, j) = C(l)C(k) cos cos T im(l, k) (5)
N 2N 2N
0<k<N 1
0<l<N 1

Question11[Facultative] : ecrire une fonction int dctinv(timage


imIn, timage imOut) qui calcul la dct inverse dune image. Verifiez bien que
la dct inverse de la dct redonne limage de depart.

Limage issue dune DCT donne un apercu frequentiel de limage dorigine


comme suit:
 
BassesF requences F requencesV erticales
(6)
F requencesHorizontales HautesF requences
IL se trouve que loeil est plus sensible aux basses frequences (zone uni-
formes dans limage) quaux hautes frequences (details de limage). Cette car-
acteristique psychovisuel peut etre mis en evidence grace a la DCT inverse.

9
Question12[Facultative] : Calculez la DCT de bjork.pgm.
Dans cette image transformee, supprimez les coefficients de haute frequence (on
ne conservera que le quart haut gauche de limage). Passez en DCT inverse et
observez le resultat. Que peut-on en conclure ?

Le principe observe est a la base de la compression avec pertes JPEG. Cette


methode couplee a une quantification et un codage entropique permet de reduire
considerablement la taille de limage.

Pour approfondir... Adaptez la methode DCT afin quelle


fonctionne sur des blocs N*N de taille variable. Regardez dans le repertoire
doc, le document intitule codageJPEG.pdf et implementez un algorithme de
compression qui tient compte de la matrice de quantification JPEG.

5 PARTIE III: SNAKES


Nous avons vu au chapitre precedent quil etait possible de faire de la detection
de contours par filtrage (par exemple avec la fonction GRad qui combine Fil-
tre2 et Filtre3). Cette methode a ses limites, en effet les contours issus de ce
filtrage sont representes sous la forme dun nuage de points (ie de pixels) qui
nont pas de liens les uns avec les autres. Il est necessaire deffectuer des traite-
ments supplementaires afin de regrouper les points en segment (segmentation
dimage) et de regrouper les segments en contour (operation de fermeture). Une
autre approche consiste a ne plus travailler sur des points mais sur une struc-
ture ordonne modelisant un contour et a imposer des le debut des contraintes
de continuite sur cette structure, cest le principe des Snakes.
Un Snake est une courbe definit par un ensemble de N points lies les uns aux
autres par des contraintes de regularite. Le principe est le suivant: lutilisateur
designe N points sur son image qui entourent de facon grossiere le contour afin
dinitialiser le snake. Par un procede de minimisation iteratif le snake va evoluer
et se resserer finement autour du contour. La fonction a minimiser, dite fonction
denergie, depend du gradient de limage et dune contrainte de regularite du
I I
contour. Le gradient de limage etant definit par:I(x, y) = ( x , y ). Si on cal-
q
I 2 2
cul sa norme, il vient: k I(x, y) k= x + I
y = N ormalizedGrad(image).
Ainsi on retrouve la fonction NormalizedGrad que nous avons developpe en
partie 2 qui combine le gradient en x et le gradient en y. Tenant compte des
contraintes de regularite, le snake va se deformer afin que lintensite associee a
ses points dans limage NormalizedGrad soit maximale. Il se situera alors sur
un contour.

Question13 : Etudiez le chapitre 1.1 (approche classique) du pdf sur


les snakes (dans doc). Quel est lalgorithme a mettre en oeuvre pour resoudre le
probleme des snakes pour un contour ferme ? Decrire brievement les etapes
de cet algorithme.

Afin dinitialiser le snake, on doit designer N points dans limage dentree.


Une interface graphique en gtk est proposee dans le fichier GUIsnake.c, elle per-
met de saisir les points dans une image et dafficher levolution du snake dans

10
cette image. Cette interface appelle une fonction iterate snake qui est definie
dans un second fichier Snake.h (et implementee dans Snake.c). En programma-
tion on separe toujours le code de linterface graphique de celui de lapplication.
Ainsi, si a lavenir on veut changer dinterface graphique, on peut le faire sans
toucher au code algorithmique du snake.

Question14 : Les fichiers lies aux snakes nont pas ete ajoutes dans
la makefile. Modifiez le makefile afin que celui-ci compile le fichier Snake.c.
Modifiez le makefile afin que celui ci compile le programme principal GUIsnake
au lieu de ProcessImage (attention a ne pas laisser despace, sinon ils sont pris
en compte dans le makefile). Lancez GUIsnake. Il faut avoir la librairie
gtk2 installee sur votre linux ainsi que le package pkgconf ig qui est
utilise par le makefile. Ces paquets sont standards et disponibles sur les CD
dinstall ou sur internet. Une fois que linterface graphique saffiche, cliquez sur
plusieurs points autour de la bouche de bjork. Ces points sont stockes dans
un tableau. Quand vous avez fini dinitialiser le snake, tapez sur la barre es-
pace. Vous verrez alors le snake se deplacer. Ce que vous voyez est leffet de la
fonction iterate snake implementee dans Snake.c qui pour linstant ne fait que
translater les points du snake dans limage. Le but est maintenant de remplacer
ce code fictif par la minimisation iterative decrite dans larticle. Regardez le
code dans GUIsnake.c et modifiez le afin de pouvoir effectuer la procedure sur
une autre image.

Pour approfondir : GTk est une des librairies les plus utilisees
sur linux pour le developpement dinterfaces graphiques. Elle est bien adaptee
au traitement dimage, le logiciel Gimp de traitement dimage utilise dailleurs
gtk. Pour ceux qui sont interesses par la programmation gtk, cette question a
pour but denrichir linterface graphique. Ajoutez cinqs boutons en bas de la
fenetre: un bouton Saisit points qui permet de saisir des points dans limage,
un bouton Step snake qui lancera lalgorithme iterate snake 1 fois, un bouton
Run snake qui lancera lalgorithme N fois (N=100 par exemple), un bouton
Reinit qui supprime les points du snake et repasse en mode saisit points et en-
fin un bouton Load image qui ouvrira une fenetre popup afin de parcourir les
sous repertoires pour designer une nouvelle image a charger. Le bouton Saisit
points devra etre inactif (grise) une fois que lutilisateur aura clique sur Step
Snake ou Run Snake. Au chargement dun nouvelle image on reinitilaisera
automatiquement les points. Le package gtk est livre souvent avec une doc html.
Vous devrez trouver de la doc sur gtk dans le repertoire opt/gnome/share/gtk-
doc/html, le chemin pouvant varier suivant les versions de linux utilisees.

Il est temps maintenant de programmer lalgorithme des snakes...

Question15 : Ecrire les sous fonctions de bases qui vous seront utiles
pour implementer lalgorithme (par exemple le produit matriciel, la creation
des matrices initiales, etc). Implementez lalgorithme du snake. Testez le sur
bjork.pgn pour detecter le contour de sa bouche avec 5 points, 10 puis 30. Testez
dautres contours et dautres images.

Pour approfondir : Lapproche classique connait ses limites


sur des images bruitees ou le contour nest pas vraiment franc. On peut definir

11
des criteres a minimiser plus robustes au bruit en utilisant des modeles prob-
abilistes. Implementez la version statistique du snake decrite dans le chapitre
1.3. On utilisera lalgorithme doptimisation stochastique decrit dans la figure
Fig 1.9. Utilisez le meme jeu de test que pour lapproche classique et comparez
les resultats.

12

You might also like