Professional Documents
Culture Documents
traitement dimages
Master 1 Probabilite, Paris 6
March 18, 2008
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:
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.
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
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 ?
struct rgb
{
int r;
int g;
int b;
};
struct image
{
int height;
int width;
int type;
int maxval;
rgb** im;
};
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.
4
3.4 ecriture dun fichier pnm
La partie duale est lecriture du fichier a partir de sa representation memoire.
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.
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
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.
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.
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
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 ?
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.
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.
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