Compte-rendu de traitement d`images
Transcription
Compte-rendu de traitement d`images
Compte-rendu de traitement d'images TP1:Histogramme, binarisation et quantication LAMBERT VELLER Sylvain LECHEVALIER David M1 STIC Université de Bourgogne 2010-2011 Table des matières 1 Introduction 2 2 Présentation 3 2.A Le but . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.B Les traitements possibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 2.C L'interface graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 Conception des traitements 5 3.A Lancement de l'acquisition d'images et des traitements . . . . . . . . . . . 5 3.A.1 Le principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.A.2 La conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.B Stopper et quitter l'application . . . . . . . . . . . . . . . . . . . . . . . . 5 3.B.1 Le principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 3.B.2 La conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.C L'inversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.C.1 Le principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.C.2 La conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.C.3 Résultat obtenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3.D L'histogramme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3.D.1 Le principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3.D.2 La conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3.D.3 Résultat obtenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 3.E La binarisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.E.1 Le principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.E.2 La conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.E.3 Résultat obtenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.F La quantication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.F.1 Le principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.F.2 La conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.F.3 Résultat obtenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.G L'étirement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.G.1 Le principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.G.2 La conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.G.3 Résultat obtenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.H L'égalisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.H.1 Le principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.H.2 La conception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.H.3 Résultat obtenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 4 Conclusion 14 A Annexes 15 A.1 Lancement de l'acquisition . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 A.2 Stopper et quitter l'application . . . . . . . . . . . . . . . . . . . . . . . . 16 A.3 L'inversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 A.4 Les histogrammes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 A.5 La binarisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 A.6 La quantication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 A.7 L'etirement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 A.8 L'égalisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 1 Introduction Ce compte-rendu présente les diérents travaux eectués lors du TP 1 de l'unité d'enseignement 'Traitement d'images'.Ce TP permet de nous familiariser avec le logiciel Matlab en réalisant un programme d'interface qui eectue diérents traitements d'images en temps réel. L'acquisition des images se fait grâce à une webcam. Nous allons commencer par une présentation de l'application et ensuite nous vous présenterons les diérentes fonctionnalités et leur phase de conception qui concernent notamment les histogrammes, les binarisations et autres quantications. 2 2 Présentation 2.A Le but Cette application doit permettre de réaliser des traitements sur des images acquis via une webcam en utilisant le logiciel Matlab. L'interface est composée de 4 fenêtres permettant de visualiser la mise en place du traitement choisit. L'utilisateur a la possibilité de choisir le traitement à réaliser grâce à un ensemble de boutons mis à sa disposition. Il est possible à tout moment de stopper l'acquisition ainsi que les traitements et également de quitter l'application. 2.B Les traitements possibles Pour cette application, les diérents traitements possibles sont : Inversion Histogramme manuel et automatique Binarisation Quantication Etirement Egalisation 2.C L'interface graphique L'interface graphique de cette application comporte : des zones de texte statique permettant de savoir à quel traitement correspond chaque fenêtre une fenêtre d'acquisition permettant l'acquisition des images via la webcam sans eectuer de traitement au préalable trois fenêtres de traitements qui permettent de visualiser les traitements possibles des boutons de traitements un bouton pour stopper l'acquisition un bouton pour quitter l'application un champ texte pour choisir le seuil qui réalise la binarisation des images 3 CHAPITRE 2. PRÉSENTATION 4 un slider qui permet de faire varier la valeur de 0 à 100 pour le traitement de quantication 3 Conception des traitements 3.A Lancement de l'acquisition d'images et des traitements 3.A.1 Le principe An de pouvoir acquérir des images dans la fenêtre d'acquisition et de pouvoir réaliser des traitements, nous avons besoin de pouvoir accéder à la webcam qui est reliée à l'ordinateur sur lequel on se trouve. Ensuite, en fonction des boutons qui sont actionnés, on lancera les fonctions adéquates. 3.A.2 La conception Pour réaliser le lancement d'acquisition, nous nous sommes aidé du code source disponible à l'adresse 'http ://depinfo.u-bourgogne.fr/ roudet/enseignement/inversion.m'. Voici les principales étapes à eectuer pour obtenir les images issues de la webcam et réaliser les traitements voulues : Conguration de l'entrée vidéo Fixer les propriétés de l'objet vid qui est une variable utilisée lors de la conguration de l'entrée vidéo Capture des frames à partir de la vidéo appel d'une fonction de traitement si nécessaire Cette fonction est disponible en annexe 1. 3.B Stopper et quitter l'application 3.B.1 Le principe Nous créons un bouton 'stop' et un bouton 'sortie et n'. Ces boutons vont permettre de stopper l'acquisition des images ou fermer l'application. 5 CHAPITRE 3. CONCEPTION DES TRAITEMENTS 6 3.B.2 La conception Le bouton stop Lors de l'acquisition, le bouton stop est à l'état 0. An de pouvoir stopper l'acquisition vidéo, il faut mettre ce bouton stop à l'état 1 et tous les autres boutons à l'état 0 (annexe 2.1). Le bouton sortie et n En ce qui concerne le bouton 'sortie et n', il y a deux possibilités. Dans le premier cas, le bouton stop n'a pas été enclenché et on ne peut pas quitter l'application immédiatement. Dans ce cas, il faut, comme pour le bouton stop, mettre ce bouton stop à l'état 1 et les autres boutons à 0 (annexe 2.2). Dans le second cas, le bouton stop a été enclenché avant. Dans ces conditions, on ferme l'application (annexe 2.2). 3.C L'inversion 3.C.1 Le principe Pour réaliser l'inversion, on doit passer l'image originale en niveaux de gris et on soustrait chaque pixel de l'image obtenue à 255. 3.C.2 La conception Deux fonctions ont été créées pour ce traitement : Une fonction 'inversion' qui est créée lors de l'ajout du bouton nommé inversion. Elle va passer l'état du bouton inversion à 1 et mettre tous les autres à 0. Une autre fonction nommée 'inverser' qui permet de réaliser l'inversion appelée lorsque l'on clique sur le bouton d'inversion. Ces fonctions sont disponibles en annexe 3. CHAPITRE 3. CONCEPTION DES TRAITEMENTS 7 3.C.3 Résultat obtenu 3.D L'histogramme 3.D.1 Le principe Pour acher l'histogramme d'une image en niveaux de gris, il est nécessaire de calculer le nombre de pixels pour chaque niveaux de gris. Une fonction, qui permettra de réaliser et acher l'histogramme, doit être créée. Le résultat sera comparé à l'histogramme réaliser sous Matlab grâce à la fonction imhist(). 3.D.2 La conception Dans la fenêtre de gauche, on ache l'image en niveaux de gris qui va être utilisé pour réaliser les histogrammes manuels et automatique. Dans la fenêtre à sa droite, on ache l'histogramme manuel ou automatique selon le bouton qui est actionné. An de réaliser l'histogramme, nous utilisons la fonction créée à l'ajout du bouton histogramme manuel ou automatique an de mettre à l'état 1 le bouton actionné et à l'état 0 les autres. Ensuite, on ajoute une fonction pour chacune des deux façons de réaliser l'histogramme (manuellement ou en utilisant imhist) qui seront lorsque l'on clique sur le bouton qui correspond. Dans la fonction de calcul d'histogramme manuellement, voici les étapes à réaliser : On récupère la taille de l'image On crée un tableau de 256 cases On parcourt l'image et on remplit le tableau de 256 cases suivant la valeur de la case ou l'on se trouve CHAPITRE 3. CONCEPTION DES TRAITEMENTS 8 Lorsque le parcours est terminé, on ache le tableau sous forme de graphique Cette fonction est disponible en annexe 3.1. Dans la fonction de calcul d'histogramme automatique, on utilise l'image en niveaux de gris et on appelle la fonction imhist avec l'image en niveaux de gris passé en paramètres (annexe 3.2). 3.D.3 Résultat obtenu Histogramme manuel Histogramme avec la fonction imhist Lorsqu'on compare l'histogramme réalisé avec notre propre fonction avec l'histogramme réalisé grâce à la fonction imhist, on remarque que le second histogramme est plus précis dans les valeurs. CHAPITRE 3. CONCEPTION DES TRAITEMENTS 9 Si on change la luminosité, l'histogramme varie également. Avec une faible luminosité, toutes les valeurs de l'histogramme sont proches de la valeur 0. Au contraire, avec une forte luminosité, les valeurs de l'histogramme sont proches de la valeur 255. 3.E La binarisation 3.E.1 Le principe La binarisation consiste à mettre à la valeur 0 tous les pixels dont la valeur n'est pas supérieure à une valeur dénie au préalable et à 255 les pixels dont la valeur est supérieur à ce même seuil. La binarisation peut s'eectuer de deux façon diérentes dans notre cas : Le seuil est choisit par l'utilisateur Le seuil est déterminé par une fonction déjà dénie de Matlab 3.E.2 La conception Nous utilisons les fonctions qui sont créées lors de l'ajout des boutons de binarisation an de mettre à l'état 1 le bouton de binarisation actionné et à l'état 0 les autres. Ensuite, on dénit une fonction pour chaque façon de binariser une image. Dans la fonction où le seuil est choisit par l'utilisateur, voici les étapes : On récupère le seuil entré par l'utilisateur. On crée un tableau qui comporte autant de lignes et de colonnes que l'image d'origine On parcourt l'image d'origine en mettant la valeur 0 ou 255 dans le tableau crée suivant la valeur du pixel On ache l'image d'origine et l'image binarisé Cette fonction est disponible en annexe 4.1. Dans la fonction où le seuil est dénit automatiquement, on renvoit le seuil de l'image grâce à la fonction graythresh() et lorsque ceci est fait, on ache l'image binarisé en utilisant la fonction im2bw() (annexe 4.2). 3.E.3 Résultat obtenu Binarisation avec seuil manuel Ce résultat est obtenu avec un seuil dénit à 20. CHAPITRE 3. CONCEPTION DES TRAITEMENTS 10 Binarisation avec seuil automatique 3.F La quantication 3.F.1 Le principe La quantication permet de coder une image, qui est initialement en 256 niveaux de gris, en n niveaux de gris où n est un paramètre qui peut être modié par l'utilisateur lorsqu'il le souhaite. On découpe les niveaux de gris en intervalles de même amplitude. La valeur qui sera aecté pour chaque intervalle est le centre de l'intervalle. 3.F.2 La conception An de donner la possibilité à l'utilisateur de modier le nombre d'intervalles, on insère un curseur dans l'interface graphique. CHAPITRE 3. CONCEPTION DES TRAITEMENTS 11 On passe ensuite le bouton quantication à l'état 1 et les autres à l'état 0 dans la fonction créée à l'ajout du bouton quantication. Lorsque ceci est réalisé, on crée une fonction qui va eectué la quantication de l'image et l'acher. Voici les étapes de cette fonction : On récupère le nombre d'intervalles On récupère la taille de l'image On calcule les intervalles et leur milieu On parcourt l'image et on calcule les nouvelles valeurs de pixels On ache l'image quantiée La fonction est disponible en annexe 5. 3.F.3 Résultat obtenu Ce résultat a été obtenu avec un nombre d'intervalles égal à 10. 3.G L'étirement 3.G.1 Le principe L'etirement consiste à utiliser au mieux l'échelle de niveaux de gris disponible. On va chercher à étendre l'histogramme an que la valeur du pixel la plus faible soit à zéro et que la valeur la plus haute soit à la valeur 255. Cela permettra une meilleur répartition des valeurs. Cela permet d'augmenter le contraste d'une image. En eet, l'étirement permet de rendre plus clairs ou plus foncés certains pixels. CHAPITRE 3. CONCEPTION DES TRAITEMENTS 12 3.G.2 La conception Comme pour les autres traitements, on passe ensuite le bouton correspondant (ici etirement) à l'état 1 et les autres à l'état 0 dans la fonction créée à l'ajout du bouton etirement.Ensuite, on crée une fonction d'étirement qui permet d'appliquer l'étirement à une image en niveaux de gris et l'ache lorsque c'est terminé. Voici les étapes importantes de cette fonction : On calcule le nombre de lignes et de colonnes de l'image On cherche les valeurs minimum et maximum des pixels de l'image On applique la forme de l'étirement à l'image de départ On ache l'image d'origine et l'image étirée Cette fonction est disponible en annexe 5. 3.G.3 Résultat obtenu 3.H L'égalisation 3.H.1 Le principe L'égalisation consiste à rendre le plus plat possible l'histogramme des niveaux de gris de l'image. Cela permet de répartir de façon équitable les niveaux de luminosité de l'image. Cela vise à renforcer le contraste sur des détails de l'image qui sont masqués par des variations d'intensité de plus grande amplitude et à plus grande échelle. 3.H.2 La conception Dans la fonction ajoutée à la création du bouton égalisation, on passe ce bouton à l'état 1 et les autres boutons à l'état 0. Après cela, on crée la fonction qui réalise l'égalisation et ache l'image obtenue. CHAPITRE 3. CONCEPTION DES TRAITEMENTS 13 Voici les étapes de cette fonction : On calcule le nombre de lignes et de colonnes de l'image On crée des tableaux pour stocker les valeurs des histogrammes On calcule l'histogramme de l'image On calcule son histogramme cumulé de l'image On calcule son histogramme cumulé normalisé On calcule la nouvelle image grâce à l'histogramme cumulatif obtenu précédemment On ache l'image d'origine, l'image égalisé ainsi que l'histogramme de l'image d'origine et son histogramme cumulatif Cette fonction est disponible en annexe 6. 3.H.3 Résultat obtenu 4 Conclusion A travers ces développements, nous avons pu prendre en main le logiciel Matlab. Nous avons pu comparer nos propres développement à des fonctions prédénies dans ce logiciel. Les fonctions étudiées nous ont ainsi permis de commencer à modier les images en se basant sur les histogrammes notamment qui permettent de prendre conscience de la luminosité de l'image. Ces développements seront compléter dans le TP suivant qui se consacre aux contours et corrections de bruits qui peuvent venir s'appliquer sur une image. 14 A Annexes A.1 Lancement de l'acquisition function lancer_Callback(hObject, eventdata, handles) vid = videoinput('winvideo',1, 'RGB24_320x240'); handles.vid = vid; triggercong (handles.vid, 'Manual'); %declenchement manuel pour la capture des frames set(handles.vid, 'FramesPerTrigger',1); %nombre de frames a capturer set(handles.vid, 'TriggerRepeat',Inf); guidata(hObject, handles); %modie le GUIDE avec les nouvelles donnees start (handles.vid); % initialise la capture de frames while 1 trigger (handles.vid); %declenche la capture d une frame (mise en memoire de la frame) if get(handles.stop,'UserData') %si on appuie sur le bouton "Stop" stop(handles.vid); %stopper la capture video axes(handles.axes1);cla;%On eace les cadres axes(handles.axes2);cla; axes(handles.axes3);cla; axes(handles.axes4);cla; delete(handles.vid); clear handles.vid; %eace les frames stockees en memoire else %si on n a pas appuye sur le bouton "Stop", on lance la capture y = (getdata(handles.vid,1, 'uint8' )) ; %acces a la frame stockee en memoire axes(handles.axes1);subimage(y); %on ache la video couleur sur une premiere gure if get(handles.inversion , 'UserData')%Suivant le bouton sur lequel on a clique on va appeler la bonne fonction en lui transmettant le handles et l image y. axes(handles.axes3);cla; axes(handles.axes4);cla; inverser (y,handles); else if get(handles.histogramme\_man,'UserData') axes(handles.axes4);cla; histogramme_man(y,handles); else if get(handles.histogramme\_imhist,'UserData') axes(handles.axes4);cla; histogramme_imhist(y,handles); else if get(handles.binarisation\_man,'UserData') axes(handles.axes4);cla; binarisation_man(y,handles); else if get(handles.binarisation\_auto,'UserData') axes(handles.axes4);cla; binarisation_auto(y,handles); else if get(handles.quantication , 'UserData') axes(handles.axes4);cla; quantication (y,handles); else if get(handles.etirement,'UserData') 15 ANNEXE A. ANNEXES etirement(y,handles); else if get(handles. egalisation , 'UserData') egalisation (y,handles); end end end end end end end end end end A.2 Stopper et quitter l'application le bouton Stop function stop_Callback(hObject, eventdata, handles) set(handles.stop, 'UserData',1) set(handles.inversion , 'UserData',0); set(handles.histogramme_imhist,'UserData',0); set(handles.histogramme_man,'UserData',0); set(handles.binarisation_man,'UserData',0); set(handles.binarisation_auto,'UserData',0); set(handles. quantication , 'UserData',0); set(handles.etirement, 'UserData',0); set(handles. egalisation , 'UserData',0); le bouton Sortie et n function sortie_Callback(hObject, eventdata, handles) if get(handles.stop,'UserData') close(); %Fermer l 'interface else set(handles.stop, 'UserData',1) % On passe le bouton stop a 1; set(handles.inversion , 'UserData',0); set(handles.histogramme_imhist,'UserData',0); set(handles.histogramme_man,'UserData',0); set(handles.binarisation_man,'UserData',0); set(handles.binarisation_auto,'UserData',0); set(handles. quantication , 'UserData',0); set(handles.etirement, 'UserData',0); set(handles. egalisation , 'UserData',0); end A.3 L'inversion 16 ANNEXE A. ANNEXES 17 function inversion_Callback(hObject, eventdata, handles) set(handles.stop, 'UserData',0); set(handles.inversion , 'UserData',1); % On passe le bouton inversion a 1; set(handles.histogramme_imhist,'UserData',0); set(handles.histogramme_man,'UserData',0); set(handles.binarisation_man,'UserData',0); set(handles.binarisation_auto,'UserData',0); set(handles. quantication , 'UserData',0); set(handles.etirement, 'UserData',0); set(handles. egalisation , 'UserData',0); function inverser(y,handles) I4 = rgb2gray(y); %on passe "y" en niveau de gris Inv = 255 − I4; %on realise l inversion en soustrayant la video en niveaux de gris (I4) a 255 axes(handles.axes2);subimage(Inv); %et la video inversee sur une deuxieme gure (axes2) A.4 Les histogrammes L'histogramme manuel function histogramme_man(y,handles) I4 = rgb2gray(y); %on passe "y" en niveau de gris [ ligne ,colonne]=size(I4);%On recupere la taille de l image. histogramme=zeros(1,256);%On cree un tableau de 256 cases for m = 1:ligne%On parcourt l image et on remplit le tableau for n = 1:colonne pixel=I4(m,n); histogramme(1,pixel+1)=histogramme(1,pixel+1)+1;%On incremente la valeur de la case correspondant end end axes(handles.axes2);subimage(I4);%On ache l image en niveau de gris. axes(handles.axes3);plot(histogramme);%On ache le tableau sous forme de graphique L'histogramme avec imhist function histogramme_imhist(y,handles) I4 = rgb2gray(y); %on passe "y" en niveau de gris I4=double(I4); axes(handles.axes2);subimage(uint8(I4));%On ache l image en niveaux de gris axes(handles.axes3);imhist(uint8(I4)) ; %On ache l histogramme de l image en niveaux de gris A.5 La binarisation Seuil denit par l'utilisateur ANNEXE A. ANNEXES function binarisation_man(y,handles) I4 = rgb2gray(y); %on passe "y" en niveau de gris [ ligne ,colonne]=size(I4); seuil =str2num(get(handles.seuil,'string'));%On recupere le seuil entre par l utilisateur . ne=zeros(ligne,colonne); for m = 1:ligne for n = 1:colonne %Suivant le cas on mettra 0 ou 255 pour l image binarise. if I4(m,n)>seuil ne(m,n)=255; else ne(m,n)=0; end end end axes(handles.axes2);subimage(I4);%On ache l image en niveaux de gris axes(handles.axes3);subimage(ne);%On ache l image binarisee Seuil denit automatiquement function binarisation_auto(y,handles) I4 = rgb2gray(y); %on passe "y" en niveau de gris seuil =graythresh(I4);%Renvoie le seuil de l image passee en parametre. axes(handles.axes2);subimage(I4);%On ache l image en niveaux de gris axes(handles.axes3);subimage(im2bw(I4,seuil));%On ache l image binarisee A.6 La quantication function quantication(y,handles) sliderValue = get(handles.slider1, 'Value'); sliderValue= cast(sliderValue , 'uint8' ) ; %On recupere le nombre d intervalle. I4 = rgb2gray(y); %on passe "y" en niveau de gris [ ligne ,colonne]=size(I4);%On recupere la taille de l image. intervalle =256/sliderValue;%On calcule les intervalles et leur milieu. milieu=intervalle /2; I4=double(I4) for i = 1:ligne %On calcule la nouvelle valeur de pixel pour la ligne i et la colonne j for j = 1:colonne pixel=I4(i, j) ; p2=(pixel/intervalle ) ; ne(i , j)=p2∗intervalle+milieu; end end axes(handles.axes2);subimage(uint8(I4));%On ache l image en niveau de gris axes(handles.axes3);subimage(uint8(ne));%On ache l image quantifee A.7 L'etirement 18 ANNEXE A. ANNEXES function etirement(y,handles) I4 = rgb2gray(y); %on passe "y" en niveau de gris [ ligne ,colonne]=size(I4); max=0; min=255; I4=double(I4); for i = 1:ligne %On cherche la valeur maxi et mini des pixels de l image. for j = 1:colonne if (I4( i , j)>max) max=I4(i,j); else if (I4( i , j)<min) min=I4(i,j); end end end end for i = 1:ligne for j = 1:colonne%On applique la forme de l etirement. ne(i , j)=255∗((I4(i,j)−min)/(max−min)); end end axes(handles.axes1);subimage(uint8(I4));%On ache l image en niveaux de gris. axes(handles.axes2);subimage(uint8(ne));%On ache l image etiree axes(handles.axes3);imhist(uint8(I4)) ; %On ache l histogramme de l image en niveaux de gris. axes(handles.axes4);imhist(uint8(ne)); %On ache l histogramme de l image etiree. A.8 L'égalisation function egalisation(y,handles) I4 = rgb2gray(y); %on passe "y" en niveau de gris [ ligne ,colonne]=size(I4); I4=double(I4); histogramme=zeros(1,256); histogrammecumulatif=zeros(1,256); taille =ligne∗colonne; for m = 1:ligne%On calcule l histogramme de l image. for n = 1:colonne pixel=I4(m,n); histogramme(1,pixel+1)=histogramme(1,pixel+1)+1; end end %Puis on calcule son histogramme cumulatif histogrammecumulatif(1,1)=histogramme(1,1); for m = 2:256 histogrammecumulatif(1,m)=(histogrammecumulatif(1,m−1)+histogramme(1,m)); end %Pusi on calcule son histogramme cumulatif normalise. for m = 1:256 histogrammecumulatif(1,m)=histogrammecumulatif(1,m)/taille; end %Puis on transforme l image. for m = 1:ligne for n = 1:colonne pixel=I4(m,n); 19 ANNEXE A. ANNEXES ne(m,n)=255∗histogrammecumulatif(1,pixel+1); end end axes(handles.axes1);subimage(uint8(I4));%On ache l image en niveaux de gris. axes(handles.axes2);subimage(uint8(ne));%On ache l image egalise axes(handles.axes3);plot(histogramme);%On ache l histogramme de l image en niveaux de gris axes(handles.axes4);plot(histogrammecumulatif);%On ache l histogramme cumulatif. 20