Sie sind auf Seite 1von 8

Projet 2 : Traitement de limage PROJET DINFORMATIQUE : TRAITEMENT MATLAB DE LIMAGE Objectifs: Dterminer la surface dun objet photographi sur

un fond uniforme, dterminer ses contours, le mesurer, reconnatre ses formes (droites, cercles, par exemple...). I/ Traitement dimages numriques. Les pr-requis : A. acqurir une photo sous forme matricielle avec matlab : On utilisera la fonction mat = imread(nom.format) ; o nom dsigne le nom sous lequel a t enregistr limage et format dsigne le type de fichier (Matlab reconnat les images au format bmp , jpg , gif , tiff , png , etc.) Chaque pixel est cod sur 8 bits et donc par un entier compris entre 0 et 28 1 = 255 . La variable de sortie mat est une matrice de type uint8 , entiers non signs (cest--dire sur lesquels aucune opration arithmtique nest possible) et possde autant de lignes et de colonnes que de pixels. Remarque 1 : si limage est en niveaux de gris, alors la matrice obtenue est une matrice m n et si limage est en couleur, le codage se fait sur 3 niveaux selon le mode RGB (Red, Green, Blue) par une matrice m n 3 . Par exemple, un pixel noir sera (0,0,0), un pixel blanc sera (255,255,255), un pixel rouge sombre (255,0,0), un pixel vert moyen (50,255,50), un pixel bleu clair sera (125,125,255). Remarque 2 : Cette convention permet de travailler sur les fichiers image dans MATLAB comme sur nimporte quel type de matrice Par exemple, dans le cas dune photo en niveaux de gris, vous pouvez slectionner un seul pixel dune matrice image en utilisant lcriture classique mat(2,15) qui retourne la valeur du pixel la ligne 2, colonne 15 de limage Si limage est en couleur, on peut scinder limage en trois, une de chaque couleur en crivant : R=mat( : , : , 1) ; V=mat( : , : , 2) et B=( : , : , 3). Remarque 3 : Le type uint8 ne permettant aucune opration arithmtique (+,-,*,/), si lune dentre elle est ncessaire, on utilisera la fonction double [exemple : B=double(A)] pour obtenir une matrice compose des mmes valeurs mais sur laquelle ce type doprations est possible. B. Trac des images. On ouvre une nouvelle fentre en tapant >> figure (n) ; On choisit le trac en niveaux de gris par : >> colormap ( gray ) ; On retrouve limage par : >> Image(mat) ; Et pour adapter les axes limage on crira : >> axis image ;

C. Transformation dune image en couleur en une image en niveaux de gris. On admettra pour cela la fonction rgb2gris suivante, fournie dans laide de Matlab : function Imagengris = rbg2gris(rgbImage)
% A partir de chaque pixel de l'image originale RGB, cette fonction cre % une pixelisation en gris dans Imagengris en calculant une luminance % monochrome par combinaison des valeurs RGB conformment au % standard NTSC qui applique des coefficients relatifs la sensibilit % oculaire propre aux couleurs RGB...

Imagengris = uint8(.2989 * double(rgbImage(:,:,1)) + .5870 * double(rgbImage(:,:,2)) + .1140 * double(rgbImage(:,:,3))); Remarque 3 : On peut avoir besoin de travailler sur une liste dimages sur lesquelles une mme tude doit tre mene. On pourra pour cela utiliser la fonction suivante qui les convertira en un tableau de matrices directement interprtables par Matlab : function img=liste ; rep=U:\info\...\images ; ext=.jpg ; % o .bmp chemin=fullfile(rep,ext) ; list=dir(chemin); img=imread(fullfile(rep,list(n).name)); II/ Construction dun histogramme. Note : On suppose ici quon travaille sur des images en niveaux de gris. On rappelle que lhistogramme est la reprsentation graphique, souvent en btons, permettant de donner la frquence (ou le nombre) dapparition des diffrents niveaux de gris qui composent limage. En abscisse sont reprsents les niveaux de gris (variant de 0 255) et en ordonns leur frquence (ou leur cardinal) dapparition. Soit Hist le vecteur ligne de 256 colonnes obtenu. 1) Premire application de lhistogramme : Augmentation du contraste. 1) Dterminer le nombre de pixels infrieurs un seuil donn 2) Ecrire une fonction qui permette dobtenir un tableau P / P ( i ) = 3) En dduire un moyen daugmenter le contraste de votre image. 2) Second objectif de lhistogramme : Permettre la binarisation de limage dans le cas dun objet isol, nettement distinct du fond : Le principe consiste transformer le codage en niveau de gris (cod sur 8 bits) en attribuant chacun des pixels de limage la valeur 0 si son niveau de gris est infrieur un seuil quil faudra dterminer, la valeur 1 si son niveau de gris est suprieur ce mme seuil. Lhistogramme prsente lallure gnrale suivante :

Nb(pixels < i ) NbTotalPixels

Pour dterminer un seuil qui permette de distinguer les valeurs des pixels propres lobjet de celles qui constituent le fond, on peut procder de la faon suivante : a) On recherche le pic maximum ainsi que son abscisse en parcourant lhistogramme. Par exemple Hist(i_max) = pic1 ; [dans lexemple, i_max vaut environ 230] b) On recherche le plus grand pic gauche de ce pic1 ; on notera quil sagit non seulement dun maximum local de lhistogramme mais que pour cette valeur : Hist(i) > Hist(i-1) et Hist(i) >= Hist(i+1) avec 0 <= i <= i_max Soit pic_gauche la valeur obtenue, pour une abscisse note i_gauche. c) On recherche par la mme mthode le plus grand pic droite de pic1 ainsi que son abscisse i_droit > i_max. Soit pic_droit ce maximum. d) On dtermine max(pic_gauche,pic_droit) ; Il restera dterminer la valle la plus profonde entre pic1 et ce maximum. Il sagit dun minimum, vrifiant par ailleurs Hist(i) < Hist(i-1) et Hist(i) <= Hist(i+1). e) On pourra considrer que ce minimum constitue le seuil cherch.

III/ Segmentation dune dune image complexe.

a) mthode probabiliste : Il sagit de choisir un seuil t qui permette de distinguer aux mieux deux zones Z0 et Z1 sur limage.
la ime ligne, jme colonne de la matrice image. Soit Z0 = {( i, j ) image / I ( i, j ) t} et Z1 = {( i, j ) image / I ( i, j ) > t}

Posons I ( i, j ) lintensit (comprise entre 0 pour noir et 256 pour blanc) du pixel situ

On considre la var discrte X t gale la valeur moyenne des pixels, respectivement sur la zone Z0 et sur la zone Z1 . Soit - N, le nombre total de pixels de limage. - N0 ( t ) , le nombre de pixels de la zone Z0 - N1 ( t ) , le nombre de pixels de la zone Z1 - m0 ( t ) , la moyenne des niveaux de gris de la zone Z0 . - m1 ( t ) , la moyenne des niveaux de gris de la zone Z1 . - mT , la moyenne des niveaux de gris de limage totale. Alors : N (t ) N (t ) m ( t ) N0 ( t ) + m1 ( t ) N1 ( t ) P ( X t = m0 ( t ) ) = 0 , P ( X t = m1 ( t ) ) = 1 et E ( X t ) = 0 N N N Lobjectif est de maximiser : N (t ) N (t ) 2 2 V ( Xt ) = 0 ( m0 ( t ) E ( X t ) ) + 1 ( m1 ( t ) E ( X t ) ) N N Une mthode possible consiste crer un vecteur ligne de 256 colonnes comportant les valeurs de V ( X t ) pour chacune des valeurs de t allant de 0 255, puis de dterminer le maximum.

b) Mthode locale par utilisation dun masque


Lide consiste calculer la teinte moyenne au voisinage de chaque point. Les points choisis dpendent du masque appliqu en chaque point. A titre dexemple, le tramage suivant semble particulirement adapt aux problmes de seuillages : 1 1 1 1 1 1 1 On parle de trames hexagonales. Le 1 central est plac en mat(i,j) et on calcule la moyenne des valeurs voisines en chacun des points sur lesquels un 1 se superpose, savoir {mat(i-1,j-1) , mat(i-1,j+1) , mat(i,j-2) , mat(i,j), mat(i,j+2), mat(i+1,j-1), mat(i-1,j+1)}. On obtient ainsi 2 matrices : la matrice originale mat et une matrice moyenne M . On fixe alors un paramtre a. En tout point de votre matrice image, si mat(i,j)-M(i,j) < a Alors la matrice binarise prendra pour valeur 255 en (i,j), sinon elle prendra pour valeur 0. Remarque : il semble que a = mat(i,j)-Moy ;o Moy dsigne la moyenne des valeurs de la matrice (3,3) centre en (i,j) soit un seuil automatique satisfaisant.

IV/ TAMISAGE VIRTUEL 1) Traitement des photos. Vous devez penser prendre, toujours au mme endroit sur vos photos, un repre dont la taille est connue et bien suprieure celle des grains dnombrer. Par exemple un carr de cot 1 cm dont la couleur soit distincte de celle du fond. Attention : on prendra soin ce que les bords de ce carr soit parallles ceux de votre photo, une fois recoupe Commencer par effectuer un seuillage de vos photos de telle manire que chaque pixel des grains soit reprsent par un 0 et chaque pixel du fond par un 1 . Recommencer ventuellement lopration jusqu tre compltement satisfait du rsultat. 2) Fonctions annexes Ecrire une fonction permettant de parcourir la matrice de limage seuille ligne par ligne et retournant une matrice colonne contenant la longueur intercepte sur chaque grain. Il sagit de dterminer pour chaque ligne le nombre de zros conscutifs. En dterminant ensuite le maximum de cette matrice, vous obtenez le nombre de pixels conscutifs e1 correspondant une longueur de 1cm. Vous pouvez dsormais talonner votre tamis : imaginons que les mailles se rpartissent entre 1 et 5 000 m (= 0,5 cm) par pas de 50 m. Vous pouvez crer une matrice ligne reprsentant la taille en pixels de chacune de vos mailles en crivant T=(1 :50 :5001)*e1*10^(-4); Votre tamisage est alors prt commencer 3) Effacement des grains Comme dans un tamis rel nous allons commencer par dnombrer les grains les plus gros, cest--dire dont le diamtre, en nombre de pixels, est suprieur T(n) o n dsigne la taille de la matrice T ( a priori on devrait trouver 1 puisque seul le carr-chelle un diamtre suprieur 0,5 cm). Vous parcourez nouveau votre matrice en ne vous arrtant en chaque point de la matrice pour lequel le nombre de 0 est suprieur T(n). On initialise alors un compteur de grain dont le diamtre sera suprieur ou gal T(n). Vous devez alors descendre puis remonter au sein de ce grain afin dobtenir en variable de sortie les coordonnes du rectangle dans lequel il sinscrit. On efface alors ce grain en affectant la valeur 1 chacun des lments de la matrice inscrits dans ce rectangle La fonction se poursuit en prenant cette fois une taille de tamis gale T(n-1). Etc jusqu T(1) 4) Diagramme des frquences cumules. Utiliser les donnes prcdentes pour obtenir les frquences relatives de chaque diamtres ainsi que les frquences cumules. Tracer.

V/ Calcul de distances. On suppose que lobjet dont on cherche faire les mesures est binaris. 1) Le cas dun seul objet : On imagine quon cherche dterminer la plus grande hauteur et largeur dun objet donne. Lide consiste lenfermer dans un rectangle dont la hauteur et la largeur sont les distances cherches. - On parcourt la matrice ligne par ligne et on cr une matrice colonne C dont la ime coordonne vaut 0 si aucun 1 na t rencontr sur la ime ligne de la matrice, 1 sinon. - On parcourt la matrice colonne par colonne et on cr une matrice ligne L dont la jme coordonne vaut 0 si aucun 1 na t rencontr sur la jme colonne de la matrice, 1 sinon. - On parcourt C en recherchant lindice de la premire et de la dernire valeur non nulle quon pourra noter dy(1) et dy(2) ; mme chose pour L, notes cette fois dx(1) et dx(2). - Les deux distances cherches sont alors dy(2)-dy(1) et dx(2)-dx(1) ; Si on souhaite inscrire lobjet dans un rectangle aux bonnes dimensions, on pourra crire : figure(n) colormap(gray) imagesc(Imagengris); axis image hold on r = rectangle('position',[dx(1) d(1) dy(2)-dy(1) dx(2)-dx(1)]); set(r,'edgecolor','r') 2) Le cas de plusieurs objets placs paralllement On imagine une symtrie selon un axe verticale de chacun des objets photographis. La mthode consiste calculer pour tout ( i, j ) 1, Nb _ lignes 1, Nb _ colonnes 1 la diffrence M ( i, j ) M ( i, j + 1) . Cette diffrence sera nul en tout point de la matrice image sauf sur les bords de lobjet qui fera apparatre une diffrence de 1 . Il suffit alors de compter le nombre de zeros successifs entre deux bords dun objet pour avoir, au niveau de la ligne i, la largeur de lobjet. On fait ensuite varier la ligne Une recherche de minimum et de maximum permettra enfin dobtenir la plus petite et la plus grande largeur rencontre. 3) Utilisation de la souris. Il est possible de rcuprer les positions du curseur sur une figure dans deux vecteurs colonnes nomms x et y par la fonction suivante : >> [x,y]=ginput Chaque clic de la souris incrmente les vecteurs x et y dune nouvelle donne ; Il suffit de taper un retour-chariot pour mettre fin la saisie des coordonnes de point.

V/ Extraction de contours. Dans ce cadre, limage est perue comme la reprsentation de la fonction f(x,y) reprsentant lintensit du pixel de coordonnes (x,y). Lorsquune brusque variation de niveaux de gris est dtecte, celle-ci fait lobjet dun contour. Lextraction de contour est particulirement utile pour la reconnaissance dobjets au sein dune photo (par exemple des cercles) Dans le cas discret, les drives partielles de la fonction image peuvent tre approximes par de simples diffrences : f ( i, j ) x f ( i, j ) = f ( i + 1, j ) f ( i, j ) x f ( i, j ) y f ( i, j ) = f ( i, j + 1) f ( i, j ) y 1. oprateur gradient. La norme du gradient sera dans ce cas un bon indicateur des dnivels de la luminance dune image. On le calculera en chaque pixel de limage et on tracera limage de la matrice obtenue (grce imagesc par exemple), les valeurs proches de 0 tant alors trs sombres et les contours tracs en blanc On rappelle que :

grad ( f )( i, j ) =

(x f )

+ y f

et que la direction de la plus grande pente sera donne par : f y = Arc tan f x 2. Oprateurs de Prewitt et Sobel. Les contours des objets sont rarement suffisamment nets pour observer des sauts de luminance sur 1 pixel. Aussi certains auteurs ont-ils dcid de travailler sur le voisinage de chaque pixel, en considrant la matrice 3 3 centre sur chacun dentre eux. ( i 1, j 1) ( i 1, j ) ( i 1, j + 1) i,j ( i, j 1) ( ) ( i, j + 1) ( i + 1, j 1) ( i + 1, j ) ( i + 1, j + 1) Ils remplacent alors les drives partielles au pixel de coordonnes (i,j) par des drives dites directionnelles selon laxe des x et laxe des y . On considre alors les masques 3 3 suivants : 1 0 1 1 c 1 H x = c 0 c et H y = 0 0 0 1 0 1 1 c 1 Pour c = 1 on a les masques de Prewitt et pour c = 2, les masques de Sobel. En multipliant chaque matrice 3 3 prise sur limage tudier par H x (multiplication terme terme et non matricielle), on obtient une drive directionnelle dans la direction des x, en multipliant par H y on obtient une drive directionnelle dans la direction des y

On pose f x = f . H x et f y = f . H y .

1. tracer imagesc( f x ) et imagesc( f y ) et commenter les diffrences obtenues. 2. On approche dsormais en chaque pixel la norme du gradient par :
f ( i, j ) = f x2 ( i, j ) + f y2 ( i, j )

Tracer limage obtenue. Note : On aura toujours pour la direction du contour : fy = Arc tan fx

Das könnte Ihnen auch gefallen