dossier

129

Upload: nada-koya

Post on 13-Aug-2015

114 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Dossier

Université de Bourgogne

1ère année de Master Informatique STIC

Parcours Informatique

Travaux pratiques Traitement d'images

Benjamin Harbelot-Yoan Chabot

2010-2011

Résumé

Ce dossier a pour vocation de présenter le travail e�ectué dans le cadre des travaux pratiques de Traite-ment d'images. Ce dossier présente les résultats obtenues pour les di�érents exercices proposés au cours dusemestre.

Table des matières

1 Introduction 7

2 Matlab et le traitement d'images 7

2.1 Initiation à Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.1.1 Création d'une interface graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.1.2 Création de fonctions et de gestionnaires d'évènements . . . . . . . . . . . . . . . . . . 8

2.2 Acquisition et traitement d'images sous Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . 82.3 Mise en place du squelette de l'application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

3 Histogramme, binarisation et quanti�cation 15

3.1 Histogramme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153.1.1 Utilisation de imhist . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163.1.2 Algorithme maison . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.2 Inversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.3 Binarisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.3.1 Binarisation paramétrable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213.3.2 Binarisation selon la méthode d'Otsu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

3.4 Quanti�cation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263.5 Amélioration d'images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

3.5.1 Étirement d'histogrammes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323.5.2 Égalisation d'histogrammes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

4 Filtrages de bruit et de �ou 37

4.1 Types de bruits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374.1.1 Bruit sel et poivre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374.1.2 Bruit Gaussien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384.1.3 Bruit de Poisson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394.1.4 Mise en place du bruit sous Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

4.2 Filtre médian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.2.1 Utilisation de med�lt2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424.2.2 Algorithme maison . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

4.3 Filtre moyenneur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564.3.1 Utilisation de im�lter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564.3.2 Algorithme maison . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66

4.4 Flou et �ltre de Wiener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674.4.1 Flou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674.4.2 Filtre de Wiener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

1

Page 2: Dossier

5 Détection de contours et segmentation d'images 73

5.1 Détection de contours . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735.1.1 Gradient Simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735.1.2 Gradient de Roberts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 795.1.3 Filtre de Prewitt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855.1.4 Filtre de Sobel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 905.1.5 Filtre de Canny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 965.1.6 Filtre Laplacien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1025.1.7 Seuillage par hystérésis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

5.2 Segmentation à l'aide de la méthode d'agrégation de pixels . . . . . . . . . . . . . . . . . . . 113

6 Conclusion 129

2

Page 3: Dossier

Table des �gures

1 GUIDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 Visualisation des adaptateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Visualisation des informations concernant l'adaptateur winvideo . . . . . . . . . . . . . . . . . . 84 Visualisation des informations concernant les formats supportés par le périphérique d'acquisition 95 Mise en place de l'interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 A�chage de l'histogramme (imhist) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 A�chage de l'histogramme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198 Inversion d'images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 Binarisation d'images paramétrable (seuil=50) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2310 Binarisation d'images paramétrable (seuil=90) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2311 Binarisation d'images paramétrable (seuil=120) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2412 Binarisation d'images paramétrable (seuil=150) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2413 Binarisation d'images selon la méthode d'Otsu . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2614 Quanti�cation d'images (niveaux de gris=3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2915 Quanti�cation d'images (niveaux de gris=5) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3016 Quanti�cation d'images (niveaux de gris=10) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3017 Quanti�cation d'images (niveaux de gris=25) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3118 Quanti�cation d'images (niveaux de gris=50) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3119 Fonction de transformation pour l'étirement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3220 Étirement d'histogrammes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3421 Égalisation d'histogrammes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3622 Bruit �sel et poivre� . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3823 Bruit gaussien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3924 Bruit suivant la loi de Poisson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4025 Fonctionnement d'un �ltre médian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4226 Filtre médian sur un bruit �sel et poivre� (densité : 0.005, 1 passe, taille 3x3) . . . . . . . . . . . 4427 Filtre médian sur un bruit �sel et poivre� (densité : 0.05, 1 passe, taille 3x3) . . . . . . . . . . . . 4528 Filtre médian sur un bruit �sel et poivre� (densité : 0.5, 1 passe, taille 3x3) . . . . . . . . . . . . . 4529 Filtre médian sur un bruit �sel et poivre� (densité : 0.5, 1 passe, taille 7x7) . . . . . . . . . . . . . 4630 Filtre médian sur un bruit �sel et poivre� (densité : 0.5, 1 passe, taille 7x7) . . . . . . . . . . . . . 4631 Filtre médian sur un bruit �sel et poivre� (densité : 0.5, 2 passes, taille 3x3) . . . . . . . . . . . . 4732 Filtre médian sur un bruit �sel et poivre� (densité : 0.5, 5 passes, taille 3x3) . . . . . . . . . . . . 4733 Filtre médian sur un bruit �sel et poivre� (densité : 0.5, 10 passes, taille 3x3) . . . . . . . . . . . 4834 Filtre médian sur un bruit �sel et poivre� (densité : 0.5, 2 passes, taille 5x5) . . . . . . . . . . . . 4835 Filtre médian sur un bruit gaussien (variance :0.001, 1 passe, taille 3x3) . . . . . . . . . . . . . . 4936 Filtre médian sur un bruit gaussien (variance :0.01, 1 passe, taille 3x3) . . . . . . . . . . . . . . . 5037 Filtre médian sur un bruit gaussien (variance :0.05, 1 passe, taille 3x3) . . . . . . . . . . . . . . . 5038 Filtre médian sur un bruit gaussien (variance :0.01, 1 passe, taille 7x7) . . . . . . . . . . . . . . . 5139 Filtre médian sur un bruit gaussien (variance :0.01, 2 passes, taille 3x3) . . . . . . . . . . . . . . 5140 Filtre médian sur un bruit gaussien (variance :0.01, 2 passes, taille 7x7) . . . . . . . . . . . . . . 5241 Filtre médian sur un bruit de Poisson (1 passe, taille 3x3) . . . . . . . . . . . . . . . . . . . . . . 5342 Filtre médian sur un bruit de Poisson (1 passe, taille 7x7) . . . . . . . . . . . . . . . . . . . . . . 5343 Filtre médian sur un bruit de Poisson (2 passes, taille 3x3) . . . . . . . . . . . . . . . . . . . . . 5444 Filtre médian sur un bruit de Poisson (2 passes, taille 7x7) . . . . . . . . . . . . . . . . . . . . . 5445 Fonctionnement d'un �ltre moyenneur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5646 Filtre moyenneur sur un bruit (densité : 0.005, 1 passe, taille 3x3) . . . . . . . . . . . . . . . . . 5847 Filtre moyenneur sur un bruit (densité : 0.005, 1 passe, taille 7x7) . . . . . . . . . . . . . . . . . 5948 Filtre moyenneur sur un bruit (densité : 0.005, 2 passes, taille 3x3) . . . . . . . . . . . . . . . . . 5949 Filtre moyenneursur un bruit gaussien (variance :0.001, 1 passe, taille 3x3) . . . . . . . . . . . . . 6050 Filtre moyenneur sur un bruit gaussien (variance :0.01, 1 passe, taille 3x3) . . . . . . . . . . . . . 6151 Filtre moyenneur sur un bruit gaussien (variance :0.05, 1 passe, taille 3x3) . . . . . . . . . . . . . 6152 Filtre moyenneur sur un bruit gaussien (variance :0.01, 1 passe, taille 7x7) . . . . . . . . . . . . . 6253 Filtre moyenneur sur un bruit gaussien (variance :0.01, 2 passes, taille 3x3) . . . . . . . . . . . . 6254 Filtre moyenneur sur un bruit gaussien (variance :0.01, 2 passes, taille 7x7) . . . . . . . . . . . . 6355 Filtre moyenneur sur un bruit de Poisson (1 passe, taille 3x3) . . . . . . . . . . . . . . . . . . . . 6456 Filtre moyenneur sur un bruit de Poisson (1 passe, taille 7x7) . . . . . . . . . . . . . . . . . . . . 6457 Filtre moyenneur sur un bruit de Poisson (2 passes, taille 3x3) . . . . . . . . . . . . . . . . . . . 6558 Filtre moyenneur sur un bruit de Poisson (2 passes, taille 7x7) . . . . . . . . . . . . . . . . . . . 6559 Flou de mouvement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68

3

Page 4: Dossier

60 Correction de �ou (longueur :15, angle :0, aucun bruit) . . . . . . . . . . . . . . . . . . . . . . . . 7061 Correction de �ou (longueur :35, angle :0, aucun bruit) . . . . . . . . . . . . . . . . . . . . . . . . 7062 Correction de �ou (longueur :15, angle :0, bruit �sel et poivre�) . . . . . . . . . . . . . . . . . . . 7163 Correction de �ou (longueur :15, angle :0, bruit gaussien) . . . . . . . . . . . . . . . . . . . . . . 7164 Correction de �ou (longueur :15, angle :0, bruit de Poisson) . . . . . . . . . . . . . . . . . . . . . 7265 Correction de �ou (longueur :15, angle :45°, aucun bruit) . . . . . . . . . . . . . . . . . . . . . . . 7266 Principe du gradient Simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7367 Détection de contours à l'aide du gradient simple (sans binarisation) . . . . . . . . . . . . . . . . 7668 Détection de contours à l'aide du gradient simple (binarisation de seuil 14) . . . . . . . . . . . . 7669 Détection de contours à l'aide du gradient simple (binarisation de seuil 8) . . . . . . . . . . . . . 7770 Détection de contours à l'aide du gradient simple (binarisation de seuil 3) . . . . . . . . . . . . . 7771 Détection de contours à l'aide du gradient simple (binarisation de seuil 14 et un bruit �sel et

poivre�) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7872 Détection de contours à l'aide du gradient simple (binarisation de seuil 14 et un bruit gaussien) . 7873 Détection de contours à l'aide du gradient simple (binarisation de seuil 14 et un bruit de Poisson) 7974 Principe du gradient de Roberts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8075 Détection de contours à l'aide du gradient de Roberts (seuil : 0.2) . . . . . . . . . . . . . . . . . . 8276 Détection de contours à l'aide du gradient de Roberts (seuil : 0.1) . . . . . . . . . . . . . . . . . . 8277 Détection de contours à l'aide du gradient de Roberts (seuil : 0.05) . . . . . . . . . . . . . . . . . 8378 Détection de contours à l'aide du gradient de Roberts (seuil : 0.01) . . . . . . . . . . . . . . . . . 8379 Détection de contours à l'aide du gradient de Roberts (seuil : 0.05 et bruit �sel et poivre�) . . . . 8480 Détection de contours à l'aide du gradient de Roberts (seuil : 0.05 et bruit gaussien) . . . . . . . 8481 Détection de contours à l'aide du gradient de Roberts (seuil : 0.05 et bruit de Poisson) . . . . . . 8582 Principe du �ltre de Prewitt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8583 Détection de contours à l'aide du �ltre de Prewitt (seuil : 0.2) . . . . . . . . . . . . . . . . . . . . 8784 Détection de contours à l'aide du �ltre de Prewitt (seuil : 0.1) . . . . . . . . . . . . . . . . . . . . 8785 Détection de contours à l'aide du �ltre de Prewitt (seuil : 0.05) . . . . . . . . . . . . . . . . . . . 8886 Détection de contours à l'aide du �ltre de Prewitt (seuil : 0.01) . . . . . . . . . . . . . . . . . . . 8887 Détection de contours à l'aide du �ltre de Prewitt (seuil : 0.05 et bruit �sel et poivre�) . . . . . . 8988 Détection de contours à l'aide du �ltre de Prewitt (seuil : 0.05 et bruit gaussien) . . . . . . . . . 8989 Détection de contours à l'aide du �ltre de Prewitt (seuil : 0.05 et bruit de Poisson) . . . . . . . . 9090 Principe du �ltre de Sobel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9191 Détection de contours à l'aide du �ltre de Sobel (seuil : 0.2) . . . . . . . . . . . . . . . . . . . . . 9392 Détection de contours à l'aide du �ltre de Sobel (seuil : 0.1) . . . . . . . . . . . . . . . . . . . . . 9393 Détection de contours à l'aide du �ltre de Sobel (seuil : 0.05) . . . . . . . . . . . . . . . . . . . . 9494 Détection de contours à l'aide du �ltre de Sobel (seuil : 0.01) . . . . . . . . . . . . . . . . . . . . 9495 Détection de contours à l'aide du �ltre de Sobel (seuil : 0.05 et bruit �sel et poivre�) . . . . . . . 9596 Détection de contours à l'aide du �ltre de Sobel (seuil : 0.05 et bruit gaussien) . . . . . . . . . . 9597 Détection de contours à l'aide du �ltre de Sobel (seuil : 0.05 et bruit de Poisson) . . . . . . . . . 9698 Principe du �ltre de Canny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9799 Principe du �ltre de Canny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97100 Détection de contours à l'aide du �ltre de Canny (seuil : 0.8) . . . . . . . . . . . . . . . . . . . . 99101 Détection de contours à l'aide du �ltre de Canny (seuil : 0.4) . . . . . . . . . . . . . . . . . . . . 99102 Détection de contours à l'aide du �ltre de Canny (seuil : 0.2) . . . . . . . . . . . . . . . . . . . . 100103 Détection de contours à l'aide du �ltre de Canny (seuil : 0.03) . . . . . . . . . . . . . . . . . . . . 100104 Détection de contours à l'aide du �ltre de Canny (seuil : 0.2 et bruit �sel et poivre�) . . . . . . . 101105 Détection de contours à l'aide du �ltre de Canny (seuil : 0.2 et un bruit gaussien) . . . . . . . . . 101106 Détection de contours à l'aide du �ltre de Canny (seuil : 0.2 et un bruit de Poisson) . . . . . . . 102107 Principe du �ltre Laplacien 4-connexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102108 Principe du �ltre Laplacien 8-connexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103109 Détection de contours à l'aide du �ltre Laplacien 4-connexe (aucun bruit) . . . . . . . . . . . . . 105110 Détection de contours à l'aide du �ltre Laplacien 8-connexe (aucun bruit) . . . . . . . . . . . . . 105111 Détection de contours à l'aide du �ltre Laplacien 8-connexe (bruit 'sel et poivre') . . . . . . . . . 106112 Détection de contours à l'aide du �ltre Laplacien 8-connexe (bruit gaussien) . . . . . . . . . . . . 106113 Détection de contours à l'aide du �ltre Laplacien 8-connexe (bruit de Poisson) . . . . . . . . . . . 107114 Détection de contours à l'aide du seuillage par hystéresis (seuil haut : 125, seuil bas : 100, aucun

bruit) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110115 Détection de contours à l'aide du seuillage par hystéresis (seuil haut : 100, seuil bas : 75, aucun

bruit) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110116 Détection de contours à l'aide du seuillage par hystéresis (seuil haut : 100, seuil bas : 25, aucun

bruit) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

4

Page 5: Dossier

117 Détection de contours à l'aide du seuillage par hystéresis (seuil haut : 40, seuil bas : 25, aucunbruit) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

118 Détection de contours à l'aide du seuillage par hystéresis (seuil haut : 100, seuil bas : 25, bruit�sel et poivre�) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

119 Détection de contours à l'aide du seuillage par hystéresis (seuil haut : 100, seuil bas : 25, bruitgaussien) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

120 Détection de contours à l'aide du seuillage par hystéresis (seuil haut : 100, seuil bas : 25, bruitde Poisson) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

121 Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :20) . . . . . . . . . . . . . . . 117122 Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :15) . . . . . . . . . . . . . . . 118123 Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :10) . . . . . . . . . . . . . . . 118124 Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :5) . . . . . . . . . . . . . . . . 119125 Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :20) . . . . . . . . . . . . . . . 122126 Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :15) . . . . . . . . . . . . . . . 122127 Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :10) . . . . . . . . . . . . . . . 123128 Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :5) . . . . . . . . . . . . . . . . 123129 Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :20) . . . . . . . . . . . . . . . 127130 Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :15) . . . . . . . . . . . . . . . 127131 Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :10) . . . . . . . . . . . . . . . 128132 Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :5) . . . . . . . . . . . . . . . . 128

Liste des algorithmes

1 Syntaxe pour la création d'une fonction Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 Syntaxe pour la création d'une fonction Callback Matlab . . . . . . . . . . . . . . . . . . . . . . . 83 Con�guration de l'acquisition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 Démarrage de l'acquisition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 Démarrage de l'acquisition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Fonction principale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 Fonction principale (Suite) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 Fonction principale (Suite) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 Fonction principale (Suite) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1410 Fonction principale (Suite) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1511 Fonction de construction d'histogrammes (imhist) . . . . . . . . . . . . . . . . . . . . . . . . . . 1612 Fonction de construction d'histogrammes (imhist) . . . . . . . . . . . . . . . . . . . . . . . . . . 1813 Fonction d'inversion d'images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2014 Fonction de binarisation paramétrable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2215 Fonction de binarisation selon la méthode d'Otsu . . . . . . . . . . . . . . . . . . . . . . . . . . . 2516 Gestionnaire d'évènements du slider pour la quanti�cation . . . . . . . . . . . . . . . . . . . . . . 2717 Fonction de quanti�cation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2818 Fonction d'étirement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3319 Fonction d'égalisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3520 Fonction d'égalisation (Suite) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3621 Fonction de sélection du bruit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4022 Fonction d'ajout de bruits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4123 Fonction de �ltrage médian (med�lt2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4324 Fonction de �ltrage médian (Algorithme maison) . . . . . . . . . . . . . . . . . . . . . . . . . . . 5525 Fonction de �ltrage moyenneur (im�lter) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5726 Fonction d'application de �ltres moyenneurs (Algorithme maison) . . . . . . . . . . . . . . . . . . 6627 Fonction de création du �ou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6728 Fonction d'application du �ou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6729 Fonction de correction de �ou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6930 Fonction de détection de contours à l'aide du gradient Simple . . . . . . . . . . . . . . . . . . . . 7431 Fonction de détection de contours à l'aide du gradient Simple (Suite) . . . . . . . . . . . . . . . . 7532 Fonction de détection de contours à l'aide du gradient de Roberts . . . . . . . . . . . . . . . . . . 8133 Fonction de détection de contours à l'aide du �ltre de Prewitt . . . . . . . . . . . . . . . . . . . . 8634 Fonction de détection de contours à l'aide du �ltre de Sobel . . . . . . . . . . . . . . . . . . . . . 9235 Fonction de détection de contours à l'aide du �ltre de Canny . . . . . . . . . . . . . . . . . . . . 9836 Fonction de détection de contours à l'aide du �ltre Laplacien . . . . . . . . . . . . . . . . . . . . 10437 Fonction de détection de contours à l'aide du seuillage par hystéresis . . . . . . . . . . . . . . . . 108

5

Page 6: Dossier

38 Fonction de détection de contours à l'aide du seuillage par hystéresis (Suite) . . . . . . . . . . . . 10939 Fonction d'agrégation de pixels selon la distance simple . . . . . . . . . . . . . . . . . . . . . . . 11540 Fonction d'agrégation de pixels selon la distance simple (Suite) . . . . . . . . . . . . . . . . . . . 11641 Fonction d'agrégation de pixels selon la moyenne de région . . . . . . . . . . . . . . . . . . . . . . 12042 Fonction d'agrégation de pixels selon la moyenne de région (Suite) . . . . . . . . . . . . . . . . . 12143 Fonction d'agrégation de pixels selon la moyenne et l'écart type de région . . . . . . . . . . . . . 12544 Fonction d'agrégation de pixels selon la moyenne et l'écart type de région (Suite) . . . . . . . . . 126

6

Page 7: Dossier

1 Introduction

Ce dossier se compose de cinq parties. Dans une première partie, nous présenterons les concepts de basespermettant de réaliser une application Matlab destinée au traitement d'images. La deuxième partie présenteraun ensemble de fonctions permettant notamment la manipulation d'histogrammes. Dans la partie suivante, nousexposerons un ensemble de méthodes permettant de �ltrer les bruits éventuels et de corriger les e�ets de �ous.La cinquième partie de ce dossier s'attardera sur le problème de détection des contours dans une image et surle problème de segmentation. Nous terminerons ce dossier par une brève conclusion.

2 Matlab et le traitement d'images

Cette partie constitue une initiation au développement d'applications dans l'environnement Matlab. Dansun premier temps, nous rappellerons quelques principes et syntaxes propres à Matlab et qui nous serons utilespar la suite. Dans un second temps, nous présenterons les instructions Matlab permettant d'acquérir et detraiter une image. En�n, nous terminerons ce dossier en présentant les étapes nécessaires à la mise en place dusquelette de l'application qui sera complétée lors des travaux pratiques de traitement d'images.

2.1 Initiation à Matlab

2.1.1 Création d'une interface graphique

Nous allons tout d'abord présenter quelques manipulations utiles pour créer l'interface d'une application.Pour se faire, l'outil graphique de création d'interfaces Matlab �Guide� sera utilisé. Cet outil peut être démarréà l'aide du bouton �Guide� présent sur la fenêtre principale de Matlab. Une fois l'outil lancé, nous avons lapossibilité de créer une nouvelle interface graphique (�Create new GUI�) ou d'éditer une interface existante(�Open existing GUI�). Pour créer une nouvelle interface graphique, nous sélectionnons l'option �Blanck GUI�dans l'onglet �Create new GUI�.

Figure 1 � GUIDE

Une boîte à outils contenant les di�érents contrôles se situe dans la partie 1 de l'éditeur. Pour ajouter uncontrôle à notre interface, il su�t de sélectionner un des objets de la boîte à outils et de de le placer dansl'interface située dans la partie 2 de l'éditeur. Les objets suivants seront utilisés dans notre application :

� L'objet �Push Button� sera notamment utilisé pour lancer les di�érents traitements.� Les objets �Check Box�, �Pop-up Menu� et �Radio Button� seront utilisés pour con�gurer des options.� Les objets �Static Text� et �Edit Text� seront utilisés pour l'a�chage et la saisie d'informations.� L'objet �Slider� sera utilisé pour permettre à l'utilisateur de paramétrer des variables numériques.� L'objet �Button Group� sera utilisé pour regrouper les fonctions de l'application par thème.� L'objet �Axes� sera utilisé pour l'a�chage des images, des histogrammes et des fonctions mathématiques.

7

Page 8: Dossier

Une fois qu'un contrôle est présent dans l'interface, il est possible de paramétrer ce dernier en double-cliquantdessus. Nous accédons alors à l'inspector permettant notamment de dé�nir le nom, le contenu ou même lacouleur du contrôle.

2.1.2 Création de fonctions et de gestionnaires d'évènements

A�n d'augmenter la lisibilité de notre code, nous créerons une fonction pour chacun des traitements déve-loppés. Pour déclarer une fonction Matlab, nous utilisons la syntaxe suivante :

Algorithme 1 Syntaxe pour la création d'une fonction Matlab

f unc t i on nomFonction ( paramètres )%Code de l a f on c t i on

Des gestionnaires d'évènements seront également ajouté dans notre code a�n de déterminer le comportementde notre application lorsque l'utilisateur interagit avec les di�érents contrôles de l'interface. Pour se faire, nousutilisons des fonctions �Callback� :

Algorithme 2 Syntaxe pour la création d'une fonction Callback Matlab

f unc t i on nomContrôle_Callback ( hObject , eventdata , handles )%Code du g e s t i o nna i r e

Cette fonction, une fois associée à un contrôle de l'interface, permet de répondre aux évènements correspon-dant à ce dernier.

2.2 Acquisition et traitement d'images sous Matlab

Nous allons maintenant présenter le code nécessaire pour commencer à acquérir des images sous Matlab.

Pour permettre à notre matériel d'acquisition et à Matlab de communiquer ensemble, il nous faut toutd'abord disposer d'un adaptateur. Matlab met à notre disposition plusieurs adaptateurs. La fonction imaqhwinfoest utilisée pour connaître les adaptateurs installés dans notre version de Matlab :

Figure 2 � Visualisation des adaptateurs

L'adaptateur winvideo sera utilisé lors des travaux pratiques. Il nous est possible d'obtenir de plus amplesinformations sur cet adaptateur à l'aide de la fonction imaqhwinfo :

Figure 3 � Visualisation des informations concernant l'adaptateur winvideo

Nous pouvons ensuite connaître les formats vidéos supportés par le périphérique d'acquisition (une webcamen l'occurrence) :

8

Page 9: Dossier

Figure 4 � Visualisation des informations concernant les formats supportés par le périphérique d'acquisition

Plusieurs formats seront utilisés lors des travaux pratiques. Nous utiliserons principalement trois formats :

� Le format RGB24_320x240 et RGB24_160x120 lorsque nous travaillerons dans la salle de l'université(Les webcams de cette salle supporte le mode RGB). Ce mode sera également utilisé à notre domicilepour utiliser une caméra Logitech non intégrée. Ce mode sera utilisé pour les traitements lourds. La faibletaille de l'image permettra de limiter la durée des traitements.

� Les formats RGB24_640x480 lorsque nous travaillerons dans la salle de l'université (Les webcams de cettesalle supporte le mode RGB). Ce mode sera également utilisé à notre domicile pour utiliser une caméraLogitech non intégrée. Ce mode sera utilisé pour les traitements légers. La taille de l'image plus importantepermettra d'améliorer le rendu.

� Le format YUY2_320x240 lorsque nous travaillerons à notre domicile (Utilisation d'une webcam intégréeà un ordinateur portable). Ce mode sera utilisé pour les traitements lourds. La faible taille de l'imagepermettra de limiter la durée des traitements.

� Le format YUY2_1024x768 lorsque nous travaillerons à notre domicile (Utilisation d'une webcam inté-grée à un ordinateur portable). Ce mode sera utilisé pour les traitements légers. La taille de l'image plusimportante permettra d'améliorer le rendu.

Nous pouvons maintenant con�gurer l'acquisition à l'aide du code suivant :

Algorithme 3 Con�guration de l'acquisition

vid = video input ( ' winvideo ' , 1 ,mode ) ;handles . v id = vid ;t r i g g e r c o n f i g ( handles . vid , 'Manual ' ) ;s e t ( handles . vid , ' FramesPerTrigger ' , 1 ) ;s e t ( handles . vid , ' TriggerRepeat ' , I n f ) ;

Nous spéci�ons tout d'abord le nom de l'adaptateur à utiliser pour communiquer avec le périphérique d'ac-quisition (winvideo dans notre cas) et nous l'associons à la caméra n°1 dans un format stocké dans la variablemode. Nous associons ensuite l'entrée vidéo issue du périphérique à l'entrée vidéo de l'interface (handles.vid).Nous con�gurons ensuite l'entrée vidéo de l'interface. Nous �xons tout d'abord le mode de déclenchement descaptures à �Manual�. Nous spéci�ons ensuite qu'une seule image doit être capturée pour chaque déclenchement(trigger). En�n, nous précisons que nous pouvons déclencher la capture autant de fois qu'on le souhaite.

Nous allons maintenant présenter le code permettant de déclencher la capture d'une image (déclenchementdu trigger) :

Algorithme 4 Démarrage de l'acquisition

guidata ( hObject , handles ) ;s t a r t ( handles . v id ) ;t r i g g e r ( handles . v id ) ;y = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;

Nous mettons tout d'abord à jour l'objet handles.vid à l'aide de la fonction guidata. Nous initialisons ensuitela capture à l'aide de la fonction start. Il nous su�t ensuite de déclencher le trigger à l'aide de la fonction trigger.Une image est alors stockée dans l'objet handles.vid. Il nous est possible de récupérer cette image à l'aide de lafonction getdata.

Le code suivant permet de stopper l'acquisition :

9

Page 10: Dossier

Algorithme 5 Démarrage de l'acquisition

stop ( handles . v id ) ;delete ( handles . v id ) ;c l e a r handles . v id ;

Après avoir stoppé la capture à l'aide de la fonction stop, nous e�açons les images stockées en mémoire àl'aide de la fonction clear.

2.3 Mise en place du squelette de l'application

Nous allons maintenant présenter la mise en place du squelette de notre application. Il s'agit notamment demettre en place l'interface qui sera utilisée tout au long des travaux pratiques.

Nous créons l'interface à l'aide de l'outil graphique présenté précédemment pour obtenir le résultat suivant :

Figure 5 � Mise en place de l'interface

Cette interface est composée des sept parties suivantes :

� La partie 1 contient un ensemble de contrôles de type �Axes�. Deux d'entre eux sont utilisés pour visualiserles images en entrée ainsi que les histogrammes correspondant à ces dernières dans la partie �Image ethistogramme en entrée�. La partie �Image traitée� utilise quant à elle trois contrôle de types �Axes�pour a�cher les images traités, les histogrammes correspondant à ces images ainsi que les fonctionsmathématiques caractérisant le traitement lorsque cela est pertinent (égalisation et étirement notamment).

� La partie 2 contient les fonctions généralistes tel que la con�guration du format vidéo ou encore lescontrôles permettant de stopper le traitement en cours.

� La partie 3 contient un contrôle chargé d'a�cher des informations sur le traitement en cours.� La partie 4 regroupe les traitements de modi�cations d'histogrammes, de binarisation et de quanti�cation.� La partie 5 regroupe les traitements de �ltrage de bruit et de �ou.� La partie 6 contient les traitements permettant la détection de contours.� La partie 7 regroupe les traitements permettant la segmentation d'images.

Après avoir créé l'interface, nous allons maintenant mettre en place la fonction principale de notre programme.Cette dernière permettra de lancer le traitement adapté en fonction des actions de l'utilisateur sur les di�é-rents contrôles de l'interface. Cette fonction permet également de gérer les actions sur les boutons �Stopper le

10

Page 11: Dossier

traitement� et �Sortie et �n� :

Algorithme 6 Fonction principale

% −−− Executes on button pr e s s in stop .func t i on stop_Callback ( hObject , eventdata , handles )% hObject handle to stop ( see GCBO)% eventdata r e s e rved − to be de f ined in a fu tu r e ve r s i on o f MATLAB% handles s t r u c tu r e with handles and user data ( see GUIDATA)s e t ( handles . stop , ' UserData ' , 1 ) ;

% −−− Executes on button pr e s s in s o r t i e .f unc t i on sor t i e_Cal lback ( hObject , eventdata , handles )% hObject handle to s o r t i e ( s ee GCBO)% eventdata r e s e rved − to be de f ined in a fu tu r e ve r s i on o f MATLAB% handles s t r u c tu r e with handles and user data ( see GUIDATA)i f get ( handles . stop , ' UserData ' )

c l o s e a l lelse

s e t ( handles . stop , ' UserData ' , 1 ) ;end

%Fonction de t ra i t ement de l ' image . Cette f on c t i on lance l e t ra i t ement%passé en paramètrefunc t i on t ra i t ement ( hObject , eventdata , handles , nomTraitement )

s e t ( handles . stop , ' UserData ' , 0 ) ;%handles : données l i é e s au GUIDE i c i on impose que l e bouton � Stop � s o i t à 0 ( non a c t i v é )%−−−−−−−−−−− Conf igurat ion de l e n t r é e v idéo −−−−−−−−−−−−−−−−−−−−−%Récupérat ion du mode de v i s u a l i s a t i o nmode=get ( handles . l i steMode , ' Value ' ) ;switch mode

case 1mode='YUY2_1024x768 ' ;s e t ( handles . hauteur , ' S t r ing ' , ' 768 ' ) ;s e t ( handles . l a rgeur , ' S t r ing ' , ' 1024 ' ) ;

case 2mode='YUY2_320x240 ' ;s e t ( handles . hauteur , ' S t r ing ' , ' 240 ' ) ;s e t ( handles . l a rgeur , ' S t r ing ' , ' 320 ' ) ;

case 3mode='RGB24_320x240 ' ;s e t ( handles . hauteur , ' S t r ing ' , ' 240 ' ) ;s e t ( handles . l a rgeur , ' S t r ing ' , ' 320 ' ) ;

o therw i s eendvid = video input ( ' winvideo ' , 1 ,mode ) ;%on a s s o c i e l adaptateur ( l o g i c i e l daccès à l a caméra ) au " dev i c e i d "%de l a caméra ( d ev i c e i d = 1)handles . v id = vid ;%on a s s o c i e l e n t r é e v idéo à c e l l e l i é e au GUIDE%−−−−−−−−−−− Fixe l e s p r op r i é t é s de l o b j e t vid −−−−−−−−−−−−−−−−−−−−−t r i g g e r c o n f i g ( handles . vid , 'Manual ' ) ;%déclenchement manuel pour l a capture des framess e t ( handles . vid , ' FramesPerTrigger ' , 1 ) ;%nombre de frames à capturer à chaque f o i s quon lance l a f on c t i on " t r i g g e r " ( i c i nb = 1)

s e t ( handles . vid , ' TriggerRepeat ' , I n f ) ;%on peut u t i l i s e r l a f on c t i on " t r i g g e r " autant de f o i s que lon veutguidata ( hObject , handles ) ;%modi f i e l e GUIDE avec l e s nouve l l e s données%−−−−−−−−−−− Capture des frames à p a r t i r de l a v idéo −−−−−−−−−−−−−−−−−−−−−s t a r t ( handles . v id ) ;

11

Page 12: Dossier

Algorithme 7 Fonction principale (Suite)

%i n i t i a l i s e l a capture de frameswhile 1

t r i g g e r ( handles . v id ) ;%déc lenche l a capture dune frame ( mise en mémoire de l a frame )i f get ( handles . stop , ' UserData ' )

%s i on appuie sur l e bouton "Stop"s e t ( handles . in fosTra i tement , ' S t r ing ' , ' ' ) ;s top ( handles . v id ) ;%stopper l a capture v ideodelete ( handles . v id ) ;c l e a r handles . v id ;%e f f a c e l e s frames s t o ck é e s en mémoirebreak

else

%s i on na pas appuyé sur l e bouton "Stop"%On exécute l a f on c t i on de t ra i t ement adaptéei f ( strcmp ( nomTraitement , ' i n v e r s i o n ' ) )

i n v e r s i o n ( hObject , eventdata , handles ) ;%Mise à jour des in f o rmat i onst i t r e={ ' Inve r s i on ' } ;sautLigne={ ' ' } ;infosComp={ ' Inve r s i on de l ' ' image en ent r é e ( préa lab lement c onv e r t i t en niveau de g r i s ) ' } ;s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;

e l s e i f ( strcmp ( nomTraitement , ' histogrammeImHist ' ) )histogrammeImHist ( hObject , eventdata , handles ) ;%Mise à jour des in f o rmat i onst i t r e={ 'Histogramme ' } ;sautLigne={ ' ' } ;infosComp={ ' Af f i chage de l ' ' histogramme de l ' ' image en ent r é e ( U t i l i s a t i o n

de l a f on c t i on imhi s t ) ' } ;s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;

e l s e i f ( strcmp ( nomTraitement , ' histogrammeMaison ' ) )histogrammeMaison ( hObject , eventdata , handles ) ;%Mise à jour des in f o rmat i onst i t r e={ 'Histogramme ' } ;sautLigne={ ' ' } ;infosComp={ ' Af f i chage de l ' ' histogramme de l ' ' image en ent r é e ( U t i l i s a t i o n d ' ' un

a lgor i thme maison ) ' } ;s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;

e l s e i f ( strcmp ( nomTraitement , ' b inar i sat ionParam ' ) )b inar i sat ionParam ( hObject , eventdata , handles ) ;%Mise à jour des in f o rmat i onst i t r e={ ' B ina r i s a t i on ' } ;sautLigne={ ' ' } ;infosComp={ ' B ina r i s a t i on de l ' ' image en ent r é e s e l on l e s e u i l s a i s i e . U t i l i s e z l e

champ de s a i s i e ' ' S eu i l ' ' . ' } ;s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;

e l s e i f ( strcmp ( nomTraitement , ' b ina r i s a t i onOtsu ' ) )b ina r i s a t i onOtsu ( hObject , eventdata , handles ) ;%Mise à jour des in f o rmat i onst i t r e={ ' B ina r i s a t i on Otsu ' } ;sautLigne={ ' ' } ;infosComp={ ' B ina r i s a t i on de l ' ' image en ent r é e s e l on un s e u i l c a l c u l é à l ' ' a ide

de l améthode d ' 'Otsu ( f on c t i on graythresh ) . ' } ;

s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;e l s e i f ( strcmp ( nomTraitement , ' q u an t i f i c a t i o n ' ) )

q u an t i f i c a t i o n ( hObject , eventdata , handles ) ;%Mise à jour des in f o rmat i onst i t r e={ ' Quant i f i c a t i on ' } ;sautLigne={ ' ' } ;infosComp={ ' Quant i f i c a t i on de l ' ' image en ent r é e . S p é c i f i e z l e nombre de niveaux de

g r i s d é s i r é à l ' ' a ide du s l i d e r . ' } ;s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;

12

Page 13: Dossier

Algorithme 8 Fonction principale (Suite)

e l s e i f ( strcmp ( nomTraitement , ' e t i r ement ' ) )e t i r ement ( hObject , eventdata , handles ) ;%Mise à jour des in f o rmat i onst i t r e={ ' Etirement ' } ;sautLigne={ ' ' } ;infosComp={ ' L i n é a r i s a t i o n de l ' ' image en ent r é e . ' } ;s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;

e l s e i f ( strcmp ( nomTraitement , ' e g a l i s a t i o n ' ) )e g a l i s a t i o n ( hObject , eventdata , handles ) ;%Mise à jour des in f o rmat i onst i t r e={ ' Ega l i s a t i on ' } ;sautLigne={ ' ' } ;infosComp={ ' Ega l i s a t i on de l ' ' image en ent r é e . ' } ;s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;

e l s e i f ( strcmp ( nomTraitement , ' f i l t r eMed i an ' ) )imgBruit=bru i t ( hObject , eventdata , handles ) ;f i l t r eMed i an ( hObject , eventdata , handles , imgBruit ) ;%Mise à jour des in f o rmat i onst i t r e={ ' F i l t r e médian ' } ;sautLigne={ ' ' } ;infosComp={ ' Correc t ion de l ' ' image en ent r é e ( préa lab lement b ru i t é e ) à l ' ' a ide d ' ' un

f i l t r e médian . U t i l i s e z l e champ de s a i s i e ' ' Dens i té ' ' l o r squ ' ' un b ru i t de type' ' Se l e t po iv re ' ' e s t app l iqué . U t i l i s e z l e champ de s a i s i e ' ' Variance ' ' l o r squ ' ' un b ru i tgaus s i en e s t app l iqué . Conf igurez l a t a i l l e du f i l t r e , l e nombre de pas s e s a i n s i que l etype de g e s t i on des bordures à l ' ' a ide des l i s t e s dé rou lante s prévues à ce t e f f e t . ' } ;

s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;e l s e i f ( strcmp ( nomTraitement , ' f i l t r eMoyenneur ' ) )

imgBruit=bru i t ( hObject , eventdata , handles ) ;f i l t r eMoyenneur ( hObject , eventdata , handles , imgBruit ) ;%Mise à jour des in f o rmat i onst i t r e={ ' F i l t r e moyenneur ' } ;sautLigne={ ' ' } ;infosComp={ ' Correc t ion de l ' ' image en ent r é e ( préa lab lement b ru i t é e ) à l ' ' a ide d ' ' un f i l t r e

moyenneur . U t i l i s e z l e champ de s a i s i e ' ' Dens i té ' ' l o r squ ' ' un b ru i t de type ' ' Se l e t po iv re ' 'e s t app l iqué . U t i l i s e z l e champ de s a i s i e ' ' Variance ' ' l o r squ ' ' un b ru i t gaus s i en e s t app l iqué .Conf igurez l a t a i l l e du f i l t r e , l e nombre de pas s e s a i n s i que l e type de g e s t i on desbordures à l ' ' a ide des l i s t e s dé rou lante s prévues à ce t e f f e t . ' } ;

s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;e l s e i f ( strcmp ( nomTraitement , ' f louWiener ' ) )

PSF=crea t i onF lou ( hObject , eventdata , handles ) ;imgFloute=app l i c a t i onF lou ( hObject , eventdata , handles ,PSF ) ;%Si l ' u t i l i s a t e u r souha i t e b r u i t e r l ' image f l o u t é echeck=get ( handles . checkFlouBruit , ' Value ' ) ;i f ( check==1)

imgFloute=bru i t2 ( hObject , eventdata , handles , imgFloute ) ;endf louWiener ( hObject , eventdata , handles , imgFloute ,PSF ) ;%Mise à jour des in f o rmat i onst i t r e={ ' F i l t r e de Wiener ' } ;sautLigne={ ' ' } ;infosComp={ ' Correc t ion de l ' ' image en ent r é e ( préa lab lement f l o u t é e ) à l ' ' a ide du f i l t r e

de Wiener . U t i l i s e z l e s champs de s a i s i e s ' ' Longueur ' ' e t ' ' Angle ' ' ' } ;s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;

e l s e i f ( strcmp ( nomTraitement , ' f i l t r eMedianMaison ' ) )imgBruit=bru i t ( hObject , eventdata , handles ) ;f i l t r eMedianMaison ( hObject , eventdata , handles , imgBruit ) ;t i t r e={ ' F i l t r e médian ' } ;sautLigne={ ' ' } ;infosComp={ ' Correc t ion de l ' ' image en ent r é e ( préa lab lement b ru i t é e ) à l ' ' a ide d ' ' un f i l t r e

médian maison . U t i l i s e z l e champ de s a i s i e ' ' Dens i té ' ' l o r squ ' ' un b ru i t de type' ' Se l e t po iv re ' ' e s t app l iqué . U t i l i s e z l e champ de s a i s i e ' ' Variance ' ' l o r squ ' ' unb ru i t gaus s i en e s t app l iqué . La t a i l l e du f i l t r e e s t f i x é e à 3et l e nombre de pas s e s à 1 . ' } ;

s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;

13

Page 14: Dossier

Algorithme 9 Fonction principale (Suite)

e l s e i f ( strcmp ( nomTraitement , ' f i l t reMoyenneurMaison ' ) )imgBruit=bru i t ( hObject , eventdata , handles ) ;f i l t reMoyenneurMaison ( hObject , eventdata , handles , imgBruit ) ;t i t r e={ ' F i l t r e moyenneur ' } ;sautLigne={ ' ' } ;infosComp={ ' Correc t ion de l ' ' image en ent r é e ( préa lab lement b ru i t é e ) à l ' ' a ide d ' ' un f i l t r e

moyenneur maison . U t i l i s e z l e champ de s a i s i e ' ' Dens i té ' ' l o r squ ' ' un b ru i t de type' ' Se l e t po iv re ' ' e s t app l iqué . U t i l i s e z l e champ de s a i s i e ' ' Variance ' ' l o r squ ' ' unb ru i t gaus s i en e s t app l iqué . La t a i l l e du f i l t r e e s t f i x é e à 3 et l e nombre de pas s e s à 1 . ' } ;

s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;e l s e i f ( strcmp ( nomTraitement , ' g rad ientRobert s ' ) )

grad ientRobert s ( hObject , eventdata , handles ) ;%Mise à jour des in f o rmat i onst i t r e={ ' Gradient de Roberts ' } ;sautLigne={ ' ' } ;infosComp={ ' Détect ion des contours de l ' ' image en ent r é e à l ' ' a ide du grad i ent de Roberts .

U t i l i s e z l e champ de s a i s i e ' ' S eu i l ' ' pour s a i s i r l e s e u i l de dé t e c t i on des contours .U t i l i s e z l e bouton rad io ' ' Appl iquer b ru i t ' ' pour a j ou t e r un bru i t à l ' ' image . ' } ;

s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;e l s e i f ( strcmp ( nomTraitement , ' g rad ientS imple ' ) )

grad ientS imple ( hObject , eventdata , handles ) ;%Mise à jour des in f o rmat i onst i t r e={ ' Gradient Simple ' } ;sautLigne={ ' ' } ;infosComp={ ' Détect ion des contours de l ' ' image en ent r é e à l ' ' a ide du grad i ent Simple .

U t i l i s e z l e champ de s a i s i e ' ' S eu i l ' ' pour s a i s i r l e s e u i l de dé t e c t i on des contours .U t i l i s e z l e bouton rad io ' ' Appl iquer b ru i t ' ' pour a j ou t e r un bru i t à l ' ' image .U t i l i s e z l e bouton rad io ' ' Appl iquer b i n a r i s a t i o n ' ' pour b i n a r i s e r l ' ' image de s o r t i e . ' } ;s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;e l s e i f ( strcmp ( nomTraitement , ' f i l t r e S o b e l ' ) )

f i l t r e S o b e l ( hObject , eventdata , handles ) ;%Mise à jour des in f o rmat i onst i t r e={ ' F i l t r e de Sobel ' } ;sautLigne={ ' ' } ;infosComp={ ' Détect ion des contours de l ' ' image en ent r é e à l ' ' a ide du f i l t r e de Sobel .

U t i l i s e z l e champ de s a i s i e ' ' S eu i l ' ' pour s a i s i r l e s e u i l de dé t e c t i on des contours .U t i l i s e z l e bouton rad io ' ' Appl iquer b ru i t ' ' pour a j ou t e r un bru i t à l ' ' image . ' } ;

s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;e l s e i f ( strcmp ( nomTraitement , ' f i l t r e P r ew i t t ' ) )

f i l t r e P r ew i t t ( hObject , eventdata , handles ) ;%Mise à jour des in f o rmat i onst i t r e={ ' F i l t r e de Prewitt ' } ;sautLigne={ ' ' } ;infosComp={ ' Détect ion des contours de l ' ' image en ent r é e à l ' ' a ide du f i l t r e de Prewitt .

U t i l i s e z l e champ de s a i s i e ' ' S eu i l ' ' pour s a i s i r l e s e u i l de dé t e c t i on des contours .U t i l i s e z l e bouton rad io ' ' Appl iquer b ru i t ' ' pour a j ou t e r un bru i t à l ' ' image . ' } ;

s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;e l s e i f ( strcmp ( nomTraitement , ' f i l t r eCanny ' ) )

f i l t r eCanny ( hObject , eventdata , handles ) ;%Mise à jour des in f o rmat i onst i t r e={ ' F i l t r e de Canny ' } ;sautLigne={ ' ' } ;infosComp={ ' Détect ion des contours de l ' ' image en ent r é e à l ' ' a ide du f i l t r e de Canny .

U t i l i s e z l e champ de s a i s i e ' ' S eu i l ' ' pour s a i s i r l e s e u i l de dé t e c t i on des contours .U t i l i s e z l e bouton rad io ' ' Appl iquer b ru i t ' ' pour a j ou t e r un bru i t à l ' ' image . ' } ;

s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;e l s e i f ( strcmp ( nomTraitement , ' f i l t r e L a p l a c i e n ' ) )

f i l t r e L a p l a c i e n ( hObject , eventdata , handles ) ;%Mise à jour des in f o rmat i onst i t r e={ ' F i l t r e Lap lac i en ' } ;sautLigne={ ' ' } ;infosComp={ ' Détect ion des contours de l ' ' image en ent r é e à l ' ' a ide du f i l t r e Lap lac i en .

U t i l i s e z l e s boutons r ad i o s pour s p é c i f i e r l e type de f i l t r e à u t i l i s e r (4 ou 8−connexe ) .U t i l i s e z l e bouton rad io ' ' Appl iquer b ru i t ' ' pour a j ou t e r un bru i t à l ' ' image . ' } ;

s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;

14

Page 15: Dossier

Algorithme 10 Fonction principale (Suite)

e l s e i f ( strcmp ( nomTraitement , ' s e u i l l a g eHy s t e r e s i s ' ) )imgContour=f i l t r e L a p l a c i e n ( hObject , eventdata , handles ) ;

s e u i l l a g eHy s t e r e s i s ( hObject , eventdata , handles , imgContour ) ;%Mise à jour des in f o rmat i onst i t r e={ ' S e u i l l a g e par Hy s t é r e s i s ' } ;sautLigne={ ' ' } ;infosComp={ ' Détect ion des contours de l ' ' image en ent r é e à l ' ' a ide d ' ' un s e u i l l a g e

par h y s t é r e s i s . U t i l i s e z l e s champs de s a i s i e ' ' Seui lB ' ' e t ' ' Seui lH ' ' pour s p é c i f i e rl e s s e u i l s . U t i l i s e z l e bouton rad io ' ' Appl iquer b ru i t ' ' pour a j ou t e r un bru i t à l ' ' image . ' } ;

s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;%Pause du programmepause ( 3 ) ;

e l s e i f ( strcmp ( nomTraitement , ' a g r e ga t i onP i x e l s ' ) )y = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ( "y" : frame cou l eur )img = rgb2gray (y ) ;%on passe "y" en niveau de g r i simgGradient=grad ientS imple2 ( hObject , eventdata , handles , img ) ;c r i t e r e=get ( handles . c r i t e r eCho i s i , ' S t r ing ' ) ;switch c r i t e r e

case ' d i s tanceS imple 'ag r ega t i onP ixe l sS imp l e ( hObject , eventdata , handles , img , imgGradient ) ;

case ' distanceMoyenne 'agregat ionPixe lsMoyenne ( hObject , eventdata , handles , img , imgGradient ) ;

case ' ecartType 'ag r ega t i onP ixe l sEca r t ( hObject , eventdata , handles , img , imgGradient ) ;

o therw i s eend%Mise à jour des in f o rmat i onst i t r e={ ' Agrégat ion de p i x e l s ' } ;sautLigne={ ' ' } ;infosComp={ ' Segmentantation de l ' ' image en ent r é e à l ' ' a ide de l ' ' ag r égat i on de p i x e l s .

U t i l i s e z l e champ de s a i s i e pour s p é c i f i e r l a d i s t anc e u t i l i s é e pour l ' ' ag r éga t i on .U t i l i s e z l e s boutons r ad i o s pour s p é c i f i e r l e c r i t è r e d ' ' homogénéité à u t i l i s e r . ' } ;

s e t ( handles . in fosTra i tement , ' S t r ing ' , [ t i t r e ; sautLigne ; infosComp ] ) ;%Pause du programmepause ( 3 ) ;

endendend%Après avo i r appuyé sur l e bouton "Stop" , on e f f a c e l e contenu de l a f e n ê t r e de t ra i t ement :axes ( handles . axes1 ) ;c l a ;axes ( handles . axes2 ) ;c l a ;axes ( handles . axes3 ) ;c l a ;axes ( handles . axes4 ) ;c l a ;axes ( handles . axes5 ) ;c l a ;

3 Histogramme, binarisation et quanti�cation

Nous allons maintenant étudier des traitements permettant de manipuler des histogrammes, de binariser etde quanti�er les images.

3.1 Histogramme

Avant de présenter des traitements à proprement parler, nous allons donner deux fonctions permettant devisualiser l'histogramme d'une image. Par dé�nition, un histogramme est un graphe permettant de représenterla répartition d'une variable. Dans le cas d'une image, l'histogramme permet de connaître le nombre de pixels

15

Page 16: Dossier

ayant un niveau de gris donné. Cet outil permet d'obtenir un certain nombres d'indications sur l'image. Il estensuite possible de réaliser un certain nombre de traitements à partir de l'histogramme tel qu'un étirement, uneégalisation ou un seuillage.

3.1.1 Utilisation de imhist

Nous allons tout d'abord présenter une fonction permettant de visualiser l'histogramme de l'image en entréeet utilisant une fonction Matlab prévue à cet e�et : la fonction imhist.

Algorithme 11 Fonction de construction d'histogrammes (imhist)

%Fonction chargée d ' a f f i c h e r l ' histogramme de l ' image en ent r é e%( u t i l i s a t i o n de imhi s t )func t i on histogrammeImHist ( hObject , eventdata , handles )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;%Traitement de l ' imagey = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ("y" : frame cou l eur )I4 = rgb2gray (y ) ;%on passe "y" en niveau de g r i sh i s t o=imhis t ( I4 ) ;%Calcu l de l ' histogramme%Af f i chageaxes ( handles . axes1 ) ;subimage ( I4 ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s t o ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Nous récupérons tout d'abord l'image acquise à l'aide de la fonction getdata vue précédemment. On convertitensuite cette image en niveau de gris à l'aide de la fonction rgb2gray. Nous obtenons alors une image où chaquepixel de l'image est codé à l'aide d'un unique octet (la valeur d'un pixel varie donc de 0 à 255). Nous appelonsensuite la fonction imhist sur l'image I4 a�n d'obtenir l'histogramme de l'image.

On procède ensuite à l'a�chage des images et des histogrammes. Nous plaçons respectivement l'image d'en-trée et son histogramme dans les contrôles �axes1� et �axes2�. La fonction plot est utilisée pour réaliser l'a�chagede l'histogramme tandis que la fonction subimage est utilisée pour réaliser l'a�chage de l'image. On notera l'uti-lisation des fonctions xlabel et ylabel pour nommer les axes de nos di�érents graphiques.

Pour a�cher l'histogramme de l'image d'entrée, il nous su�t désormais de cliquer sur le bouton �Histogrammeimhist� de l'interface présentée un peu plus tôt dans ce dossier. Le résultat obtenu est le suivant :

16

Page 17: Dossier

Figure 6 � A�chage de l'histogramme (imhist)

On note sur l'histogramme que, comme prévu, les niveaux de gris sont compris entre 0 et 255. Nous remar-quons également que notre image n'utilise pas les niveaux de gris de 0 à 40. Le contraste de l'image pourraitdonc être amélioré si l'image utilisait cette plage. Cette modi�cation peut être e�ectuée par un étirement d'his-togrammes. Ce traitement sera explicité un peu plus loin dans ce dossier. En�n, si la luminosité de l'imageaugmente, on pourra observer un déplacement de l'histogramme vers la droite.

3.1.2 Algorithme maison

Nous allons maintenant introduire une fonction implémentant un algorithme de notre cru et permettantégalement de visualiser l'histogramme de l'image en entrée :

17

Page 18: Dossier

Algorithme 12 Fonction de construction d'histogrammes (imhist)

%Fonction chargée d ' a f f i c h e r l ' histogramme de l ' image en ent r é e ( parcours%de l ' image et comptage des p i x e l s )f unc t i on histogrammeMaison ( hObject , eventdata , handles )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;%Traitement de l ' imagey = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ( "y" : frame cou l eur )I4 = rgb2gray (y ) ;%on passe "y" en niveau de g r i s%Calcu l de l ' histogramme%Créat ion d 'un vecteur contenant l e s compteurs de chaque niveau de g r i stabCompteur=0:255;%I n i t i a l i s a t i o n du tab leau de compteursfor p=1:256

tabCompteur (p)=0;end%Parcours de l ' image et comptage des p i x e l sf o r p=1: hauteur

f o r n=1: l a r g eu ri nd i c e=I4 (p , n)+1;tabCompteur ( i nd i c e )=tabCompteur ( i nd i c e )+1;

endend%Af f i chageaxes ( handles . axes1 ) ;subimage ( I4 ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( tabCompteur ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Nous récupérons tout d'abord la hauteur et la largeur de l'image d'entrée. Ces informations sont stockéesdans des contrôles de type �Edit text� invisibles. La valeur de ces contrôles est �xé dès le lancement du trai-tement et en fonction du choix du mode e�ectué par l'utilisateur. La fonction get est utilisée pour récupérerla valeur de chaque champ. Cette fonction prend en paramètre le contrôle dont on veut récupérer la valeurainsi que le type de données attendu. Chaque contrôle de notre interface est accessible grâce à la notation�handles.nomControle�. A�n d'obtenir des dimensions numériques, nous convertissons les chaînes obtenues àl'aide de la fonction str2num permettant de convertir une chaîne de caractères en variable numérique. Nousrécupérons ensuite l'image en entrée puis nous la convertissons en niveau de gris.

Pour produire l'histogramme de l'image en entrée, il nous faut compter le nombre d'occurrences (le nombrede pixel) de chaque niveau de gris. Pour comptabiliser ces dernières, nous créons un tableau tabCompteur de256 cases. Chaque case contiendra le nombre d'occurrences du niveau de gris correspondant à son indice. Nousinitialisons chacun des compteurs à zéro à l'aide d'une première boucle for. Nous parcourons ensuite l'ensemblede l'image à l'aide de deux boucles for imbriquées. Pour chaque pixel de l'image, nous incrémentons le compteurayant pour indice le niveau de gris du pixel +1 (les tableaux commençant à 1 sous Matlab). Il nous su�t ensuited'a�cher l'image en entrée dans le contrôle �axe1� et notre histogramme dans le contrôle �axe2�.

Pour a�cher l'histogramme de l'image d'entrée, il nous su�t désormais de cliquer sur le bouton �Histogrammemaison� de l'interface présentée un peu plus tôt dans ce dossier. Le résultat obtenu est le suivant :

18

Page 19: Dossier

Figure 7 � A�chage de l'histogramme

Le résultat obtenu respecte les tendances de l'histogramme obtenu à l'aide de la fonction imhist.

3.2 Inversion

Le premier traitement que nous allons présenter est l'inversion d'images. Ce traitement relativement simpleà mettre en place consiste à convertir chaque pixel de l'image en entrée (en niveau de gris dans notre cas) en savaleur inverse sur l'échelle des 256 couleurs. Ainsi, un pixel ayant pour valeur 10 sera converti en la valeur 245alors qu'un pixel ayant pour valeur 250 sera converti en la valeur 5.

Pour réaliser ce traitement, nous ajoutons la fonction inversion suivante dans notre programme Matlab :

19

Page 20: Dossier

Algorithme 13 Fonction d'inversion d'images

%Fonction r é a l i s a n t l ' i n v e r s i o n de l ' image en ent r é e ( Inve r s i on des niveaux %de g r i s )f unc t i on i nv e r s i o n ( hObject , eventdata , handles )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;%Traitement de l ' imagey = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ( "y" : frame cou l eur )I4 = rgb2gray (y ) ;%on passe "y" en niveau de g r i sInv = 255 − I4 ;%on r é a l i s e l i n v e r s i o n en soust rayant l a v idéo en niveaux de g r i s ( I4 ) à 255%Construct ion des histogrammesh i s toEnt ree=imhis t ( I4 ) ;h i s t o S o r t i e=imhi s t ( Inv ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage (y ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( Inv ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Nous récupérons tout d'abord l'image acquise puis on convertit ensuite cette image en niveau de gris. Pourinverser l'image, il nous su�t ensuite de soustraire la valeur de chaque pixel de l'image à 255 et de stocker lerésultat ainsi obtenue dans une nouvelle image nommée Inv.

Nous construisons ensuite des histogrammes pour l'image d'entrée et l'image de sortie à l'aide de la fonctionimhist. On procède ensuite à l'a�chage des images et des histogrammes. Nous plaçons respectivement l'imaged'entrée et son histogramme dans les contrôles �axes1� et �axes2�. Pour terminer, nous plaçons respectivementl'image de sortie et son histogramme dans les contrôles �axes3� et �axes4�.

Pour réaliser une inversion d'images, il nous su�t désormais de cliquer sur le bouton �Inversion� de l'interfaceprésentée un peu plus tôt dans ce dossier. Le résultat obtenu est le suivant :

20

Page 21: Dossier

Figure 8 � Inversion d'images

Il est à noter que l'histogramme de l'image en entrée est obtenu à partir de l'image en niveau de gris (etnon l'image couleur). Nous pouvons voir que l'histogramme de l'image de sortie est le symétrique de l'image enentrée. Les niveaux de gris élevés (claires) deviennent donc sombres et inversement.

3.3 Binarisation

Nous allons maintenant présenter des fonctions permettant de réaliser une binarisation de l'image en entrée.La binarisation permet de réduire l'échelle chromatique de 256 valeurs à seulement deux valeurs : 0 et 1. Pourréaliser la binarisation, il est nécessaire de choisir un seuil (de manière automatique ou arbitraire). On parcourtensuite l'ensemble des pixels de l'image d'entrée. Chaque pixel ayant un niveau de gris inférieur au seuil se voitassigné la valeur 0. Les pixels ayant un niveau de gris supérieur sont quant à eux passé à 1.

3.3.1 Binarisation paramétrable

Nous allons tout d'abord présenter une fonction permettant de réaliser une binarisation avec un seuil saisipar l'utilisateur. Cette fonction utilise donc un champ texte pour récupérer la valeur souhaitée par l'utilisateur :

21

Page 22: Dossier

Algorithme 14 Fonction de binarisation paramétrable

%Fonction chargée de b i n a r i s e r l ' image en ent r é e s e l on l e s e u i l s a i s i e par%l ' u t i l i s a t e u r v ia l ' i n t e r f a c efunc t i on binar i sat ionParam ( hObject , eventdata , handles )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;y = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ( "y" : frame cou l eur )I4 = rgb2gray (y ) ;%on passe "y" en niveau de g r i s%Récupérat ion du s e u i ls e u i l=str2num ( get ( handles . s e u i l , ' S t r ing ' ) ) ;%Créat ion de l ' image b i n a r i s é eimgBin=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;%Remplissage de l ' image en f onc t i on du s e u i lfor p=1: hauteur

for n=1: l a r g eu ri f ( I4 (p , n)> s e u i l )

imgBin (p , n)=255;else

imgBin (p , n)=0;end

endend%Construct ion des histogrammesh i s toEnt ree=imhis t ( I4 ) ;h i s t o S o r t i e=imhi s t ( imgBin ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( I4 ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgBin ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Après avoir récupéré l'image en entrée et passé cette dernière en niveau de gris, nous récupérons le seuilsaisi par l'utilisateur. Nous déclarons ensuite une nouvelle image qui contiendra le résultat de la binarisation.Pour allouer cette image, nous avons recours à la fonction zeros qui permet d'allouer une matrice de zéros.Nous convertissons ensuite cette matrice en image contenant des pixels codés sur un octet à l'aide de la fonctionim2uint8.

Pour réaliser la binarisation, il nous su�t de parcourir l'image à l'aide de deux boucles for. Si la valeurdu pixel courant est supérieure au seuil récupéré précédemment, on passe sa valeur à 255 (1) dans la nouvelleimage (imgBin). Dans le cas contraire, on passe la valeur du pixel à 0. Nous a�chons ensuite les images et leshistogrammes de la même manière que les fonctions précédentes.

Pour réaliser une binarisation d'images paramétrable, il nous su�t désormais de cliquer sur le bouton�Binarisation paramétrable� de l'interface et de saisir le seuil voulu dans le champ texte prévu à cet e�et.

Avec un seuil de 50, le résultat obtenu est le suivant :

22

Page 23: Dossier

Figure 9 � Binarisation d'images paramétrable (seuil=50)

Avec un seuil de 90, le résultat obtenu est le suivant :

Figure 10 � Binarisation d'images paramétrable (seuil=90)

Avec un seuil de 120, le résultat obtenu est le suivant :

23

Page 24: Dossier

Figure 11 � Binarisation d'images paramétrable (seuil=120)

Avec un seuil de 150, le résultat obtenu est le suivant :

Figure 12 � Binarisation d'images paramétrable (seuil=150)

Nous avons pu constater que la binarisation avec un seuil égale à 50 produit une image majoritairementcomposée de pixels blancs. Ce résultat est prévisible si l'on observe l'histogramme de l'image en entrée. En e�et,nous pouvons voir que très peu de pixels utilisent des niveaux de gris inférieure à 50. On obtient donc peu de

24

Page 25: Dossier

pixels noirs en sortie du traitement. Les seuils 90 et 120 permettent en revanche d'obtenir des binarisations de�bonnes qualités�. Le seuil de 150, en revanche, donne un résultat peu convaincant à cause de la présence d'unezone noire sur la gauche de l'image. Cette zone est provoqué par la sous-exposition de l'image dans cette zone.

3.3.2 Binarisation selon la méthode d'Otsu

Nous allons maintenant présenter une fonction réalisant de manière automatique le choix du seuil. Cettefonction utilise la méthode d'Otsu pour déterminer le seuil le plus adapté. Cette méthode utilise des conceptsissus du domaine des probabilités pour déterminer un seuil optimale pour la binarisation.

Matlab met à disposition la méthode graythresh pour obtenir le seuil selon la méthode d'Otsu.

Algorithme 15 Fonction de binarisation selon la méthode d'Otsu

%Fonction chargée de b i n a r i s e r l ' image en ent r é e s e l on un s e u i l c a l c u l é à%l ' a ide de l a méthode d 'Otsu ( f onc t i on graythresh )func t i on b ina r i s a t i onOt su ( hObject , eventdata , handles )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;y = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ( "y" : frame cou l eur )I4 = rgb2gray (y ) ; %on passe "y" en niveau de g r i s%Récupérat ion du s e u i ls e u i l=graythresh ( I4 )*255 ;s e t ( handles . s e u i lCho i s i , ' S t r ing ' , s e u i l )%Créat ion de l ' image b i n a r i s é eimgBin=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;%Remplissage de l ' image en f onc t i on du s e u i lfor p=1: hauteur

for n=1: l a r g eu ri f ( I4 (p , n)> s e u i l )

imgBin (p , n)=255;else

imgBin (p , n)=0;end

endend%Construct ion des histogrammesh i s toEnt ree=imhis t ( I4 ) ;h i s t o S o r t i e=imhi s t ( imgBin ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( I4 ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgBin ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

La fonction graythresh prend en paramètre l'image à binariser et retourne un seuil compris entre 0 et 1. Ilnous faut donc multiplier ce seuil par 255 pour pouvoir l'utiliser par la suite. Nous a�chons ensuite le seuilretourné par la méthode d'Otsu dans un champ texte. Pour cela, la méthode set est utilisée. Cette dernièreprend en paramètre le contrôle dont la valeur doit être modi�é, le type de la valeur et la valeur à proprementparler. Nous appliquons ensuite la binarisation de la même manière que précédemment puis nous a�chons lesimages et les histogrammes.

25

Page 26: Dossier

Pour réaliser une binarisation d'images selon la méthode d'Otsu, il nous su�t désormais de cliquer sur lebouton �Binarisation Otsu� de l'interface et de saisir le seuil voulu dans le champ texte prévu à cet e�et. Lerésultat obtenu est le suivant :

Figure 13 � Binarisation d'images selon la méthode d'Otsu

La méthode d'Otsu a �xé un seuil à 137 pour obtenir le résultat ci-dessous. La binarisation est correcte maison note que de nombreux détails ont été perdu sur la gauche de l'image (ce qui n'était pas le cas avec des seuilsà 90 et 120). Nous pouvons donc dire que les méthodes probabilistes peuvent montrer leurs limites dans des casoù l'exposition du sujet n'est pas uniforme.

3.4 Quanti�cation

La quanti�cation, à l'image de la binarisation, permet de réduire l'échelle chromatique utilisée par l'image.Cette réduction peut être appréciable dans le cadre de la compression d'images. En e�et, lorsqu'une image utilise256 niveau de gris, il est nécessaire d'utiliser un octet pour stocker la valeur de chaque pixel. Si nous pouvonsconvertir cette image de manière à ce qu'elle utilise 16 niveau de gris, nous pourrions alors nous contenter dequatre bits pour coder chaque pixel. La taille de l'image s'en trouverait donc diviser par deux.

Pour spéci�er le nombre de couleurs utilisées par l'image de sortie, nous mettons tout d'abord un slider àdisposition de l'utilisateur. Ce slider est associé à un champ texte qui se chargera de mémoriser la valeur duslider à un instant donné. Nous plaçons un gestionnaire d'évènement sur le slider pour mettre à jour le champtexte :

26

Page 27: Dossier

Algorithme 16 Gestionnaire d'évènements du slider pour la quanti�cation

% −−− Executes on s l i d e r movement .f unc t i on sl ider_nbreNiveau_Cal lback ( hObject , eventdata , handles )

% hObject handle to s l ider_nbreNiveau ( see GCBO)% eventdata r e s e rved − to be de f ined in a fu tu r e ve r s i on o f MATLAB% handles s t r u c tu r e with handles and user data ( see GUIDATA)% Hints : get ( hObject , ' Value ' ) r e tu rn s po s i t i o n o f s l i d e r% get ( hObject , 'Min ' ) and get ( hObject , 'Max ' ) to determine range o f s l i d e r%obta ins the s l i d e r va lue from the s l i d e r componentv a l e u r S l i d e r = get ( handles . s l ider_nbreNiveau , ' Value ' ) ;v a l e u r S l i d e r=round ( v a l e u r S l i d e r ) ;%puts the s l i d e r va lue in to the ed i t t ex t components e t ( handles . nbreNiveau , ' S t r ing ' , num2str ( v a l e u r S l i d e r ) ) ;% Update handles s t r u c tu r eguidata ( hObject , handles ) ;

Dans un premier temps, nous récupérons la valeur du slider à l'aide de la fonction get puis nous stockonscette valeur dans la variable valeurSlider. Il est à noter que la valeur du slider est borné par un minimum égaleà zéro et un maximum égale à 255. On place ensuite la valeur ainsi récupéré dans le champ texte à l'aide de laméthode get puis nous mettons à jour les di�érents composants de l'interface en appelant la fonction guidata.

Nous pouvons maintenant développer la fonction permettant de quanti�er une image :

27

Page 28: Dossier

Algorithme 17 Fonction de quanti�cation

%Fonction chargée de r é a l i s e r une qu an t i f i c a t i o n de l ' image en ent r é e ( l e%nombre de niveaux de g r i s d é s i r é s e s t f i x é à l ' a ide du s l i d e r )func t i on qu an t i f i c a t i o n ( hObject , eventdata , handles )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;y = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ("y" : frame cou l eur )I4 = rgb2gray (y ) ;%on passe "y" en niveau de g r i s%Récupérat ion du nombre de niveaux de g r i sn=get ( handles . nbreNiveau , ' S t r ing ' ) ;n=str2num (n ) ;i f (n<3)

n=3;end ;%Calcu l de l a t a i l l e des t ranchestranche=c e i l (256/n ) ;%Créat ion du tab leau contenant l e s c en t r e s des i n t e r v a l l e s (L ' é c h e l l e%de niveau de g r i s e s t découpée en n i n t e r v a l l e s )c e n t r e I n t e r v a l l e =1:n ;%I n i t i a l i s a t i o n du tab leau de c en t r e sfor p=0:(n−1)

c e n t r e I n t e r v a l l e (p+1)=round (( (256/n)*p)+((256/n ) / 2 ) ) ;end%Créat ion de l ' image qu an t i f i é eimgQuan=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;%Quant i f i c a t i on de l ' imagefor p=1: hauteur

for q=1: l a r g eu ri nd i c e=( f l o o r ( I4 (p , q )/ tranche ))+1;i f ( i nd i c e==(n+1))

i nd i c e=(n ) ;endimgQuan(p , q)= c e n t r e I n t e r v a l l e ( i nd i c e ) ;

endend%Construct ion des histogrammesh i s toEnt ree=imhis t ( I4 ) ;h i s t o S o r t i e=imhi s t ( imgQuan ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( I4 ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgQuan ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Pour réaliser la quanti�cation, il nous faut tout d'abord récupéré le nombre de niveaux de gris depuis lechamp texte. On calcule ensuite la taille des tranches en divisant l'échelle totale des niveaux de gris (256) parle nombre de niveaux de gris souhaités. Ces tranches sont utilisés pour répartir les di�érents pixels entre lesniveaux de gris choisi pour l'image de sortie. Ainsi, si les tranches ont une taille de 50, tous les pixels ayant unniveau de gris entre 0 et 50 se verront a�ectés la valeur choisie pour cette tranche. Les valeurs des niveaux degris de sortie sont stockées dans le tableau centreIntervalle. Ce dernier a donc une taille égale au nombre deniveaux de gris en sortie. Nous initialisons ensuite ce tableau. Pour cela, nous calculons les centres de chaque

28

Page 29: Dossier

intervalle (ou tranche). On multiplie l'indice du centre d'intervalle par la taille d'une tranche puis nous ajoutonsà cette valeur la taille d'une tranche divisée par deux (a�n d'obtenir le centre de l'intervalle).

Pour quanti�er l'image, il nous faut maintenant parcourir cette dernière à l'aide de deux boucles for. Pourchacun des pixels, nous calculons l'intervalle correspondant au niveau du gris du pixel. Pour cela, on divise leniveau de gris par la taille de la tranche (nous ajoutons 1 car les tableaux démarrent à cet indice sous Matlab).Nous �xons ensuite la valeur du pixel courant pour l'image de sortie avec la valeur du centre de l'intervalle ainsiobtenue.

Pour réaliser une quanti�cation d'images, il nous su�t désormais de cliquer sur le bouton �Quanti�cation�de l'interface et de régler le nombre de niveaux de gris souhaités en sortie à l'aide du slider.

Avec un nombre de niveaux de gris égale à 3, le résultat obtenu est le suivant :

Figure 14 � Quanti�cation d'images (niveaux de gris=3)

Avec un nombre de niveaux de gris égale à 5, le résultat obtenu est le suivant :

29

Page 30: Dossier

Figure 15 � Quanti�cation d'images (niveaux de gris=5)

Avec un nombre de niveaux de gris égale à 10, le résultat obtenu est le suivant :

Figure 16 � Quanti�cation d'images (niveaux de gris=10)

Avec un nombre de niveaux de gris égale à 25, le résultat obtenu est le suivant :

30

Page 31: Dossier

Figure 17 � Quanti�cation d'images (niveaux de gris=25)

Avec un nombre de niveaux de gris égale à 50, le résultat obtenu est le suivant :

Figure 18 � Quanti�cation d'images (niveaux de gris=50)

Nous pouvons tout d'abord voir qu'à partir de 25 niveaux de gris, il est di�cile de voir que l'image a étéquanti�ée. Ce traitement peut donc permettre de comprimer une image tout en conservant une grande partiedes détails. On peut voir également que lorsque le nombre de niveaux de gris est assez élevé, il est assez facilede se faire une idée de la tendance de l'histogramme d'origine.

31

Page 32: Dossier

3.5 Amélioration d'images

Nous allons maintenant étudier des traitements qui permettent d'améliorer la qualité de l'image en réalisantdes modi�cations se basant sur l'histogramme de l'image en entrée.

3.5.1 Étirement d'histogrammes

Le premier traitement destiné à l'amélioration d'images que nous allons présenter est l'étirement d'histo-grammes. Ce traitement est utilisé pour renforcer le contraste d'une image. Une image peu contrastée est uneimage n'utilisant pas la totalité de l'échelle chromatique mise à sa disposition. Ainsi, une image utilisant desniveaux de gris compris entre 45 et 135 à un contraste peu élevé relativement à une image utilisant l'ensembledes 256 niveaux de gris. L'étirement a donc pour but de redéployer les niveaux de gris sur l'ensemble de l'échelledes niveaux de gris. La valeur d'intensité la plus faible aura désormais pour valeur 0 et la valeur d'intensité laplus haute de l'image aura désormais pour valeur 255. L'étirement a pour e�et d'éloigner les valeurs de l'histo-gramme. Les pixels foncés seront donc un peu plus foncés et les pixels clairs un peu plus clairs.

Pour réaliser la transformation qu'est l'étirement, il nous faut appliquer la transformation suivante :

T : [a, b]→ [0, 255]

i→ j = 255 ∗ (i−a)(b−a)

avec a= niveau de gris minimal de l'image, b= niveau de gris maximal de l'image et j= niveau de gris du pixel

Cette transformation peut être représenté par la fonction suivante :

Figure 19 � Fonction de transformation pour l'étirement

Le graphique ci-dessus permet de réaliser la correspondance entre les niveaux de gris de l'image en entréeet les niveaux de gris de l'image en sortie. Les niveaux de gris de l'image en entrée, situés en abscisses, sontrépartis entre les bornes a et b. La fonction de transformation permet de répartir ces niveaux entre 0 et 255 surl'axe des ordonnées.

La fonction Matlab suivante permet de réaliser un étirement d'histogramme :

32

Page 33: Dossier

Algorithme 18 Fonction d'étirement

%Fonction chargée de l i n é a r i s e r l ' image en ent r é efunc t i on et i r ement ( hObject , eventdata , handles )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;y = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ( "y" : frame cou l eur )I4 = rgb2gray (y ) ;%on passe "y" en niveau de g r i s%Récupérat ion du niveau de g r i s minimum de l ' image en ent r é e%(U t i l i s a t i o n des f on c t i o n s min et max , on ap e l l e une première f o i s l a%fonc t i on pour ob t en i r l e minimum de chaque l i g n e de l a matr ice image%et une deuxième f o i s pour obt en i r l e minimum des minimums)minimum=(min (min ( I4 ) ) ) ;maximum=(max(max( I4 ) ) ) ;%Créat ion de l ' image l i n é a r i s é eimgLin=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;%Quant i f i c a t i on de l ' imagef o r p=1: hauteur

f o r q=1: l a r g eu rimgLin (p , q )=255*(( double ( I4 (p , q)−minimum)/ double (maximum−minimum ) ) ) ;

endend%Construct ion des histogrammesh i s toEnt ree=imhis t ( I4 ) ;h i s t o S o r t i e=imhi s t ( imgLin ) ;%Construct ion de l a courbet r a n s f oL i n e a i r e =0:255;f o r p=1:256

i f (p<minimum)t r a n s f oL i n e a i r e (p)=0;

e l s e i f (p>=minimum && p<maximum)t r a n s f oL i n e a i r e (p)=(( double ( t r a n s f oL i n e a i r e (p)−minimum)/ double (maximum−minimum) ) ) * 2 5 5 ;

e l s e i f (p>=maximum)t r a n s f oL i n e a i r e (p)=255;

endend%Af f i chageaxes ( handles . axes1 ) ;subimage ( I4 ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgLin ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes5 ) ;p l o t ( t r a n s f oL i n e a i r e ) ;x l ab e l ( ' Entrée ' ) ;y l ab e l ( ' S o r t i e ' ) ;

Nous récupérons tout d'abord l'image en entrée puis nous convertissons celle ci en niveau de gris. On chercheensuite à dé�nir les bornes a et b de l'image. Pour cela, les fonctions min et max sont utilisées. Ces fonctionssont utilisés deux fois consécutivement : la première utilisation renvoie le minimum/maximum de chaque ligne.On obtient donc un tableau mono-dimensionnel contenant le minimum/maximum de chaque ligne de l'image.On appelle ensuite une nouvelle fois la fonction pour obtenir le minimum/maximum de l'image. Après avoiralloué l'image résultat, nous parcourons l'ensemble de l'image en entrée pour appliquer la formule donnée pré-

33

Page 34: Dossier

cédemment.

Après avoir construit les histogrammes, nous construisons la fonction de transformation. Pour cela, nousallouons un tableau de 256 valeurs nommé transfoLineaire. Chaque case de ce tableau contient la valeur de lafonction de transformation pour le niveau de gris donné par l'indice. Après avoir calculé les 256 valeurs du ta-bleau, nous a�chons les images, les histogrammes et la fonction de transformation dans les axes prévus à cet e�et.

Pour réaliser un étirement d'histogrammes, il nous su�t désormais de cliquer sur le bouton �Étirement� del'interface. Le résultat obtenu est le suivant :

Figure 20 � Étirement d'histogrammes

On peut voir sur l'histogramme de sortie que, désormais, l'ensemble des niveaux de gris est utilisé. Cela setraduit par un contraste plus élevé sur l'image de sortie. La fonction de transformation nous permet de voir queles niveaux de gris de l'image en entrée se situaient entre (environ) 40 et 210.

3.5.2 Égalisation d'histogrammes

L'égalisation d'histogrammes permet d'augmenter les nuances d'une image. Cette transformation consiste àharmoniser la répartition des niveaux de gris de l'image en aplatissant l'histogramme de cette dernière.

L'égalisation d'une image est composé des étapes suivantes. Après avoir construit l'histogramme de l'image,on calcule tout d'abord les densités de probabilités de chaque niveau de gris de l'image. Il s'agit de calculer leprobabilité d'apparition de chaque niveau de gris. Pour se faire, on comptabilise les pixels ayant un niveau degris donné puis on divise le chi�re ainsi obtenu par le nombre total de pixels dans l'image. Grâce aux densitésde probabilités, nous pouvons construire la fonction de répartition. Pour cela, il su�t de cumuler les densitésde probabilités obtenues précédemment. Grâce à la fonction de répartition, il nous est maintenant possible deconvertir les niveaux de gris de l'image d'entrée à l'aide de la formule suivante :

T (a) = (bmax− bmin) ∗ F (a) + bminavec a= niveau de gris à convertir, bmin= niveau de gris minimal souhaité pour l'image résultat, bmax=

niveau de gris maximal souhaité pour l'image résultat et F= la fonction de répartition

La fonction Matlab suivante permet de réaliser une égalisation d'histogramme :

34

Page 35: Dossier

Algorithme 19 Fonction d'égalisation

%Fonction chargée d ' é g a l i s e r l ' image en ent r é efunc t i on e g a l i s a t i o n ( hObject , eventdata , handles )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;y = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ("y" : frame cou l eur )I4 = rgb2gray (y ) ; %on passe "y" en niveau de g r i s%Calcu l des d en s i t é s de p r o b a b i l i t é s%Créat ion d 'un vecteur contenant l e s d en s i t é sdens i teProba =0:255;%I n i t i a l i s a t i o n du tab leau de d en s i t é sfor p=1:256

dens i teProba (p)=0;end%Parcours de l ' image et c a l c u l des d en s i t é s de p r o b a b i l i t é s%Comptage des p i x e l s de chaque cou l eurf o r p=1: hauteur

f o r n=1: l a r g eu ri nd i c e=y(p , n)+1;dens i teProba ( i nd i c e )=dens i teProba ( i nd i c e )+1;

endend%Div i s i on des compteurs par l e nombre de p i x e l s t o t a l pour obt en i r l a%p r ob ab i l i t é d ' appa r i t i on de chaque niveau de g r i sfor p=1:256

dens i teProba (p)=double ( dens i teProba (p )/ ( hauteur * l a r g eu r ) ) ;end%Créat ion d 'un vecteur contenant l a f on c t i on de r é p a r t i t i o nfonct ionRep =0:255;%I n i t i a l i s a t i o n du tab leauf o r p=1:256

fonct ionRep (p)=0;end%Calcu l de l a f on c t i on de r é p a r t i t i o nfonct ionRep (1)= dens i teProba ( 1 ) ;f o r p=2:256

fonct ionRep (p)=double ( dens i teProba (p))+double ( fonct ionRep (p−1)) ;end%Créat ion de l ' image é g a l i s é eimgEgal=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;a=0;b=255;%Ega l i s a t i on de l ' imagef o r p=1: hauteur

f o r n=1: l a r g eu rimgEgal (p , n )=(((b−a )* fonct ionRep ( ( I4 (p , n))+1))+a ) ;

endend%Construct ion des histogrammesh i s toEnt ree=imhis t ( I4 ) ;h i s t o S o r t i e=imhi s t ( imgEgal ) ;%Construct ion de l a courbet r a n s f oL i n e a i r e =0:255;

35

Page 36: Dossier

Algorithme 20 Fonction d'égalisation (Suite)

for p=1:256t r a n s f oL i n e a i r e (p )=(((b−a )* fonct ionRep (p))+a )/256 ;

end%Af f i chageaxes ( handles . axes1 ) ;subimage ( I4 ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgEgal ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes5 ) ;p l o t ( t r a n s f oL i n e a i r e ) ;x l ab e l ( ' Entrée ' ) ;y l ab e l ( ' S o r t i e ' ) ;

Comme nous l'avons dit un peu plus tôt, nous calculons tout d'abord les densités de probabilités. Pour sefaire, nous allouons un tableau densiteProba de 256 cases. Nous parcourons ensuite l'image en incrémentant lesdi�érents compteurs contenus dans le tableau densiteProba. Pour terminer le calcul des densités, nous divisonschaque compteur du tableau par le nombre de pixels de l'image. Nous créons ensuite la fonction de répartition encumulant les valeurs des densités de probabilités. Après avoir construit cette fonction, il nous su�t de parcourirl'image une dernière fois pour appliquer la formule présentée précédemment.

Pour réaliser une égalisation d'histogrammes, il nous su�t désormais de cliquer sur le bouton �Égalisation�de l'interface. Le résultat obtenu est le suivant :

Figure 21 � Égalisation d'histogrammes

36

Page 37: Dossier

On peut voir que l'égalisation a permis de répartir les pixels parmi l'ensemble des niveaux de gris de l'image.On peut également remarquer que l'égalisation permet également de réaliser un étirement de l'histogramme.On obtient donc un histogramme en sortie utilisant l'ensemble des niveaux de gris et avec des proportions quasiidentiques (La discrétisation de l'image ne permet pas d'obtenir un histogramme constant). En�n, la fonctionde transformation a une allure similaire à celle étudiées lors des travaux dirigés de traitements d'images.

4 Filtrages de bruit et de �ou

Lors de l'acquisition d'une image, de nombreux facteurs peuvent altérer la qualité du résultat. Une mauvaisecondition d'observation, les défauts du capteur, les poussières ou les rayures sont autant de sources de bruitset de �ous. Nous allons présenter dans cette partie des traitements permettant de restaurer une image dans lebut de pouvoir fournir aux traitements de plus haut niveau (reconnaissances de formes etc etc) des images dequalité.

4.1 Types de bruits

Dans un premier temps, nous allons présenter les trois types de bruits qui seront utilisés dans le cadre deces travaux pratiques. Nous présenterons le code Matlab permettant d'ajouter ces di�érents bruits aux imagesacquises.

4.1.1 Bruit sel et poivre

Le premier bruit étudié est un bruit impulsionnel. Le bruit �sel et poivre� (�salt and pepper�) est souvent dûà des erreurs de transmissions de données, à la défaillance d'un capteur ou bien à la présence de particules surle capteur. Ce bruit se caractérise par l'apparition aléatoire de pixels blancs et noirs sur l'image en sortie.

Les �gures suivantes présentent une même image plus ou moins altérée par un bruit �sel et poivre� :

37

Page 38: Dossier

Figure 22 � Bruit �sel et poivre�

4.1.2 Bruit Gaussien

Le second bruit étudié est le bruit �blanc� gaussien. La notion de bruit blanc provient du fait, qu'à l'instarde la lumière blanche, les bruits de ce type sont composés de toutes les fréquences. Le bruit Gaussient se traduitpar l'ajout d'un �grain� à l'image. Ce dernier détériore les contours et les détails les moins marqués de l'image.

Les �gures suivantes présentent une même image plus ou moins altérée par un bruit gaussien :

38

Page 39: Dossier

Figure 23 � Bruit gaussien

4.1.3 Bruit de Poisson

Le dernier bruit étudié est basé sur la loi de Poisson. Cette loi est utilisé pour caractériser l'apparitiond'évènements rares sans mémoire (les évènements sont indépendants les uns des autres). Cette loi peut êtreutilisée pour caractérisé l'apparition de fautes d'orthographes dans un compte rendu de travaux pratiques ouencore le nombre de personnes atteintes d'une maladie donnée. Le bruit de �Poisson� va donc ajouter des erreursdans l'image selon la loi de Poisson.

Les �gures suivantes présentent une même image plus ou moins altérée par un bruit de �Poisson� :

39

Page 40: Dossier

Figure 24 � Bruit suivant la loi de Poisson

4.1.4 Mise en place du bruit sous Matlab

Nous allons maintenant présenter le code utilisé pour ajouter les bruits présentés ci-dessus aux images ac-quises.

Pour choisir le bruit à ajouter à l'image d'entrée, l'utilisateur a à sa disposition un ensemble de boutonsradios. Les boutons radios �radioSelPoivre�, �radioGaussien� et �radioPoisson� permettant respectivement dechoisir le bruit �Sel et poivre, �Gaussien� et �Poisson� sont ajoutés au �Button Group� �selectionBruit�. Nousajoutons également un champ texte invisible pour stocker la valeur du bruit sélectionné. La fonction ci-dessouspermet de récupérer le choix de l'utilisateur :

Algorithme 21 Fonction de sélection du bruit

f unc t i on se l ec t ionBru i t_Se lect ionChangeFcn ( hObject , eventdata , handles )% hObject handle to the s e l e c t e d ob j e c t in s e l e c t i o nB ru i t% eventdata s t r u c tu r e with the f o l l ow i n g f i e l d s ( s ee UIBUTTONGROUP)% EventName : s t r i n g ' Se lect ionChanged ' ( read only )% OldValue : handle o f the p r ev i ou s l y s e l e c t e d ob j e c t or empty i f none was s e l e c t e d% NewValue : handle o f the cu r r en t l y s e l e c t e d ob j e c t% handles s t r u c tu r e with handles and user data ( see GUIDATA)switch get ( eventdata . NewValue , 'Tag ' )

case ' rad ioGauss ien 's e t ( handles . b ru i tCho i s i , ' S t r ing ' , ' Gaussien ' ) ;

case ' r ad ioPo i s son 's e t ( handles . b ru i tCho i s i , ' S t r ing ' , ' Poisson ' ) ;

case ' r ad i oSe lPo iv r e 's e t ( handles . b ru i tCho i s i , ' S t r ing ' , ' Se l e t po iv re ' ) ;

o therw i s e% Code for when there i s no match .

end

Ce gestionnaire d'évènement capte les évènements concernant le �Button Group� ajouté précédemment.Ainsi, lorsqu'un des radios boutons situés à l'intérieur du groupe est modi�é, le gestionnaire est exécuté. Nous

40

Page 41: Dossier

récupérons tout d'abord le tag du composant récemment modi�é (le radio bouton qui vient d'être cliqué). Enfonction du tag du radio bouton, nous �xons ensuite la valeur du champ texte invisible. La fonction ci-dessouspermet d'ajouter un bruit à l'image en fonction de la valeur du champ texte invisible :

Algorithme 22 Fonction d'ajout de bruits

%Fonction chargée d ' app l i que r un bru i t ( c h o i s i par l ' u t i l i s a t e u r à l ' a ide%des r ad i o s buttons ) à l ' image d ' en t r é efunc t i on imgBruit=bru i t ( hObject , eventdata , handles )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;y = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ( "y" : frame cou l eur )I4 = rgb2gray (y ) ;%on passe "y" en niveau de g r i simgBruit=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;%Appl i ca t ion du bru i tb ru i t=get ( handles . b ru i tCho i s i , ' S t r ing ' ) ;switch bru i t

case ' Gaussien 'var i ance=get ( handles . var iance , ' S t r ing ' ) ;va r i ance=str2num ( var iance ) ;imgBruit=imnoise ( I4 , ' gauss ian ' ,0 , var i ance ) ;

case ' Poisson 'gBruit=imnoise ( I4 , ' po i s son ' ) ;

case ' S e l e t po iv re 'd en s i t e=get ( handles . dens i t e , ' S t r ing ' ) ;d en s i t e=str2num ( den s i t e ) ;imgBruit=imnoise ( I4 , ' s a l t & pepper ' , d en s i t e ) ;

o therw i s e% Code for when there i s no match .

end

Après avoir récupéré l'image en entrée et convertit cette dernière en niveau de gris, nous allouons l'imagerésultat de la fonction (imgBruit). Il est à noter que cette dernière est retourné par la fonction. L'ajout devaleurs de retour est e�ectué en ajoutant le nom des variables retournées après le mot-clef function.

Après avoir récupéré la valeur du champ texte invisible �bruitChoisi�, on ajoute le bruit souhaité à l'aidede la fonction imnoise. Cette fonction prend en paramètre l'image à modi�er, le type du bruit à ajouter ainsiqu'un certain nombre d'éventuels paramètres. Le bruit Gaussien peut être paramétré avec une moyenne et unevariance. Dans notre cas, nous ne modi�erons que la variance. En�n, le bruit �Sel et poivre� peut être paramétréavec une densité.

La fonction bruit est exécuté avant le lancement des fonctions de �ltrage. Nous allons maintenant présenterces dernières.

4.2 Filtre médian

Le premier �ltre que nous allons présenté est le �ltre médian. Il s'agit d'un �ltre non linéaire. Un �ltre estdit non-linéaire si chaque pixel résultat ne peut pas être obtenu à l'aide d'une combinaison linéaire des pixelsdu voisinage. Le principe du �ltre médian est le suivant : chaque pixel de l'image est remplacé par la médianedes valeurs des pixels voisins.

La �gure suivante présente le fonctionnement d'un �ltre médian de taille 3x3 :

41

Page 42: Dossier

Figure 25 � Fonctionnement d'un �ltre médian

L'image à �ltrer est représentée par le tableau à gauche. On s'intéresse plus particulièrement au �ltrage despixels entourées de rouge et de vert. Pour �ltrer le pixel rouge, on récupère tout d'abord les valeurs des huitpixels voisins ainsi que la valeur du pixel à �ltrer. Le nombre de pixels concernés dépend directement de la tailledu �ltre. Dans le cas d'un �ltre de taille 3x3, nous récupérons neuf valeurs de pixels pour en �ltrer un seul. Ladeuxième étape du �ltrage consiste à trier les neuf valeurs récupérées. Après ce tri, il nous su�t de récupérerla valeur médiane de la liste. Cette valeur sera celle du pixel de l'image en sortie du traitement.

Le �ltrage du pixel vert met en avant l'une des principales applications des �ltres médians : le �ltrage de bruitimpulsionnel. On peut voir que la valeur du pixel en vert est bien supérieur à ses voisins. On peut donc imaginerqu'il s'agit d'un parasite (comme ceux que l'on peut rencontrer dans un bruit poivre et sel par exemple). Le�ltrage du pixel à l'aide d'un �ltre médian va nous permettre de supprimer cette valeur. En e�et, lors du tri dela liste des valeurs, les pixels ayant des valeurs extrêmes auront tendance à se retrouver sur les extrémités de laliste. Ainsi, ils auront peu de chances d'être élu en tant que valeur médiane.

Ce type de �ltres présente toutefois des inconvénients. Ce �ltre a notamment tendance à déformer les contoursde l'image.

4.2.1 Utilisation de med�lt2

Nous allons présenter une première fonction réalisant un �ltrage médian qui utilise la méthode Matlabmed�lt2.

42

Page 43: Dossier

Algorithme 23 Fonction de �ltrage médian (med�lt2)

%Fonction chargée de c o r r i g e r l ' image b ru i t é e en ent r é e à l ' a ide d 'un%f i l t r e médianfunc t i on f i l t r eMed i an ( hObject , eventdata , handles , imgBruit )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;imgBruitOrig ine=imgBruit ;%Récupérat ion du nombre de pas s e s et de l a t a i l l e du f i l t r et a i l l e F i l t r e=get ( handles . t a i l l e F i l t r e , ' Value ' ) ;switch t a i l l e F i l t r e

case 1t a i l l e F i l t r e =3;

case 2t a i l l e F i l t r e =5;

case 3t a i l l e F i l t r e =7;

case 4t a i l l e F i l t r e =9;

case 5t a i l l e F i l t r e =11;

o therw i s eendnombrePasses=get ( handles . nombrePasses , ' Value ' ) ;%Appl i ca t ion du f i l t r e médianimgF i l t r e=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;for p=1:nombrePasses

imgF i l t r e=med f i l t 2 ( imgBruit , [ t a i l l e F i l t r e , t a i l l e F i l t r e ] ) ;imgBruit=imgF i l t r e ;

end%Construct ion des histogrammesh i s toEnt ree=imhis t ( imgBruitOr ig ine ) ;h i s t o S o r t i e=imhi s t ( imgF i l t r e ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( imgBruitOrig ine ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgF i l t r e ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Nous récupérons tout d'abord les dimensions de l'image. Après cela, nous réalisons une copie de l'imagebruitée passée en entrée de la fonction. Cette copie permettra de conserver l'image d'origine en vue de l'a�-chage �nal (A�chage de l'image bruitée à gauche et de l'image �ltrée à droite). Nous récupérons ensuite lacon�guration du �ltre. L'utilisateur peut en e�et paramétrer la taille du �ltre à l'aide d'une liste déroulante(3x3, 5x5, 7x7, 9x9 et 11x11). Nous récupérons également le nombre de passes (nombre d'applications du �ltre).

Après avoir alloué l'image résultat, nous démarrons une boucle for. Le nombre d'itérations de cette boucleest �xé par le nombre de passes récupéré précédemment. Pour chaque itération, nous �ltrons l'image à l'aide dela fonction med�lt2 en passant en paramètre l'image bruitée et les dimensions du �ltre.

Après avoir appliqué le �ltre autant de fois que nécessaire, nous a�chons les histogrammes et les imagesdans les contrôles prévus à cet e�et.

Pour réaliser un �ltrage médian de l'image d'entrée, il nous su�t désormais de cliquer sur le bouton �Filtre

43

Page 44: Dossier

médian� de l'interface présentée un peu plus tôt dans ce dossier en ayant au préalable con�guré la taille du �ltreet le nombre de passes.

Nous allons tout d'abord nous intéresser au résultat d'un �ltrage médian sur un bruit �sel et poivre�.

Avec un bruit �sel et poivre� de densité 0.005 traité par un �ltre médian de taille 3x3 à une seule reprise, lerésultat obtenu est le suivant :

Figure 26 � Filtre médian sur un bruit �sel et poivre� (densité : 0.005, 1 passe, taille 3x3)

Avec un bruit �sel et poivre� de densité 0.05 traité par un �ltre médian de taille 3x3 à une seule reprise, lerésultat obtenu est le suivant :

44

Page 45: Dossier

Figure 27 � Filtre médian sur un bruit �sel et poivre� (densité : 0.05, 1 passe, taille 3x3)

Avec un bruit �sel et poivre� de densité 0.5 traité par un �ltre médian de taille 3x3 à une seule reprise, lerésultat obtenu est le suivant :

Figure 28 � Filtre médian sur un bruit �sel et poivre� (densité : 0.5, 1 passe, taille 3x3)

Avec un bruit �sel et poivre� de densité 0.5 traité par un �ltre médian de taille 7x7 à une seule reprise, lerésultat obtenu est le suivant :

45

Page 46: Dossier

Figure 29 � Filtre médian sur un bruit �sel et poivre� (densité : 0.5, 1 passe, taille 7x7)

Avec un bruit �sel et poivre� de densité 0.5 traité par un �ltre médian de taille 11x11 à une seule reprise, lerésultat obtenu est le suivant :

Figure 30 � Filtre médian sur un bruit �sel et poivre� (densité : 0.5, 1 passe, taille 7x7)

Avec un bruit �sel et poivre� de densité 0.5 traité par un �ltre médian de taille 3x3 à deux reprises, le résultatobtenu est le suivant :

46

Page 47: Dossier

Figure 31 � Filtre médian sur un bruit �sel et poivre� (densité : 0.5, 2 passes, taille 3x3)

Avec un bruit �sel et poivre� de densité 0.5 traité par un �ltre médian de taille 3x3 à cinq reprises, le résultatobtenu est le suivant :

Figure 32 � Filtre médian sur un bruit �sel et poivre� (densité : 0.5, 5 passes, taille 3x3)

Avec un bruit �sel et poivre� de densité 0.5 traité par un �ltre médian de taille 3x3 à dix reprises, le résultatobtenu est le suivant :

47

Page 48: Dossier

Figure 33 � Filtre médian sur un bruit �sel et poivre� (densité : 0.5, 10 passes, taille 3x3)

Avec un bruit �sel et poivre� de densité 0.5 traité par un �ltre médian de taille 5x5 à deux reprises, le résultatobtenu est le suivant :

Figure 34 � Filtre médian sur un bruit �sel et poivre� (densité : 0.5, 2 passes, taille 5x5)

Ces di�érentes illustrations con�rment que le �ltre médian est très e�cace pour éliminer les bruits impul-sionnels comme le bruit �poivre et sel�. Pour des densités égale à 0.005 et 0.05, l'image �ltrée est très proche del'image d'origine (non bruitée). Avec une densité de 0.5, des résidus subsistent après le �ltrage. Nous constatons

48

Page 49: Dossier

toutefois que sur l'image bruitée, il est di�cile de déterminer la nature de l'image alors qu'après �ltrage, il esttout à fait possible de distinguer les formes principales.

Pour supprimer les résidus, nous pouvons augmenter la taille du �ltre, le nombre de passes ou même combinerles deux. Nous constatons que l'augmentation de la taille du �ltre a tendance diminuer la netteté des contours.Le contraste entre les di�érentes régions de l'image deviennent alors moins nettes. En revanche, l'augmentationdu nombre de passes conservent relativement bien la netteté des contours. Toutefois, les déformations de cesderniers sont plus important que dans le cas d'une augmentation de la taille du �ltre. Pour éliminer les résiduse�cacement tout en conservant une qualité de l'image acceptable, nous décidons d'augmenter un peu ces deuxparamètres (2 passes avec un �ltre 5x5). Nous obtenons alors un �ltrage tout à fait satisfaisant.

Nous allons maintenant étudier le comportement du �ltre médian sur une image bruitée par un bruit gaussien.

Avec un bruit gaussien ayant une variance égale à 0.001 traité par un �ltre médian de taille 3x3 à une reprise,le résultat obtenu est le suivant :

Figure 35 � Filtre médian sur un bruit gaussien (variance :0.001, 1 passe, taille 3x3)

Avec un bruit gaussien ayant une variance égale à 0.01 traité par un �ltre médian de taille 3x3 à une reprise,le résultat obtenu est le suivant :

49

Page 50: Dossier

Figure 36 � Filtre médian sur un bruit gaussien (variance :0.01, 1 passe, taille 3x3)

Avec un bruit gaussien ayant une variance égale à 0.05 traité par un �ltre médian de taille 3x3 à une reprise,le résultat obtenu est le suivant :

Figure 37 � Filtre médian sur un bruit gaussien (variance :0.05, 1 passe, taille 3x3)

Avec un bruit gaussien ayant une variance égale à 0.01 traité par un �ltre médian de taille 7x7 à une reprise,le résultat obtenu est le suivant :

50

Page 51: Dossier

Figure 38 � Filtre médian sur un bruit gaussien (variance :0.01, 1 passe, taille 7x7)

Avec un bruit gaussien ayant une variance égale à 0.01 traité par un �ltre médian de taille 3x3 à deuxreprises, le résultat obtenu est le suivant :

Figure 39 � Filtre médian sur un bruit gaussien (variance :0.01, 2 passes, taille 3x3)

Avec un bruit gaussien ayant une variance égale à 0.01 traité par un �ltre médian de taille 7x7 à deuxreprises, le résultat obtenu est le suivant :

51

Page 52: Dossier

Figure 40 � Filtre médian sur un bruit gaussien (variance :0.01, 2 passes, taille 7x7)

Les captures d'écrans ci-dessus nous permettent de voir que le �ltre médian est relativement ine�cace pouréliminer un bruit gaussien. Malgré l'augmentation de la taille du �ltre et du nombres de passes, nous n'arrivonspas à obtenir une image en sortie correcte. Le �ltre médian a même tendance à étaler les e�ets du bruit surl'ensemble des pixels.

Pour �nir, nous allons étudier le comportement du �ltre médian sur une image bruitée par un bruit de Poisson.

Avec un bruit de Poisson traité par un �ltre médian de taille 3x3 à une reprise, le résultat obtenu est lesuivant :

52

Page 53: Dossier

Figure 41 � Filtre médian sur un bruit de Poisson (1 passe, taille 3x3)

Avec un bruit de Poisson traité par un �ltre médian de taille 7x7 à une reprise, le résultat obtenu est lesuivant :

Figure 42 � Filtre médian sur un bruit de Poisson (1 passe, taille 7x7)

Avec un bruit de Poisson traité par un �ltre médian de taille 3x3 à deux reprises, le résultat obtenu est lesuivant :

53

Page 54: Dossier

Figure 43 � Filtre médian sur un bruit de Poisson (2 passes, taille 3x3)

Avec un bruit de Poisson traité par un �ltre médian de taille 7x7 à deux reprises, le résultat obtenu est lesuivant :

Figure 44 � Filtre médian sur un bruit de Poisson (2 passes, taille 7x7)

A l'instar du bruit gaussien, le bruit de Poisson n'est pas supprimé par le �ltre médian malgré l'augmentationde la taille du �ltre et du nombre de passes (On note une légère amélioration tout de même).

54

Page 55: Dossier

4.2.2 Algorithme maison

Nous allons maintenant présenter une deuxième fonction permettant de réaliser un �ltrage médian à l'aided'un algorithme maison :

Algorithme 24 Fonction de �ltrage médian (Algorithme maison)

%Fonction chargée de c o r r i g e r l ' image b ru i t é e en ent r é e à l ' a ide d 'un%f i l t r e médianfunc t i on f i l t r eMedianMaison ( hObject , eventdata , handles , imgBruit )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;imgBruitOrig ine=imgBruit ;%Appl i ca t ion du f i l t r e médianimgF i l t r e=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;for i =2:( hauteur−1)

for j =2:( l a rgeur −1)%Tri des va l eu r sva l eur =0:8 ;i n d i c e =1;for k=(i −1) :( i +1)

for l =(j −1) :( j +1)va l eur ( i nd i c e )=imgBruit (k , l ) ;i n d i c e=i nd i c e +1;

endendva l eur=so r t ( va l eur ) ;%Changement de l a va l eur du p i x e l par l a va l eur médiane du%tableau t r i éimgF i l t r e ( i , j )=va l eur ( 5 ) ;

endend%Construct ion des histogrammesh i s toEnt ree=imhis t ( imgBruitOr ig ine ) ;h i s t o S o r t i e=imhi s t ( imgF i l t r e ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( imgBruitOrig ine ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgF i l t r e ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Pour appliquer le �ltrage médian, nous parcourons l'ensemble des pixels de l'image acquise à l'aide de deuxboucles for imbriquées. Un tableau de neuf cases nommé valeur est utilisé pour stocker les valeurs des pixelsutilisés pour �ltrer le pixel courant. On récupère et on stocke les valeurs des voisins à l'aide de deux nouvellesboucles for permettant de parcourir le voisinage du pixel courant. Après avoir récupéré les valeurs, il nous su�tde trier le tableau à l'aide de la fonction sort. On récupère ensuite la valeur médiane qui sera utilisé commevaleur du pixel courant dans l'image résultat. Nous a�chons ensuite les histogrammes et les images.

Pour réaliser un �ltrage médian maison de l'image d'entrée, il nous su�t désormais de cliquer sur le bouton�Filtre médian maison� de l'interface présentée un peu plus tôt dans ce dossier en ayant au préalable con�guréla taille du �ltre et le nombre de passes. Les résultats obtenus par cette fonction sont identiques aux résultatsprésentés précédemment. L'exécution de notre fonction maison est toutefois moins rapide que l'exécution de lafonction utilisant la fonction med�lt2.

55

Page 56: Dossier

4.3 Filtre moyenneur

Nous allons maintenant étudier le �ltre moyenneur. Il s'agit d'un �ltre linéaire. Un �ltre est dit linéaire sichaque pixel résultat est obtenu à l'aide d'une combinaison linéaire des pixels du voisinage. Le �ltre moyenneurest un �ltre passe-bas. Il permet d'adoucir d'une image. Le principe du �ltre moyenneur est le suivant : chaquepixel de l'image est remplacé par la moyenne des valeurs des pixels voisins.

La �gure suivante présente le fonctionnement d'un �ltre moyenneur de taille 3x3 :

Figure 45 � Fonctionnement d'un �ltre moyenneur

Le �ltre moyenneur s'applique grâce à une convolution.

4.3.1 Utilisation de im�lter

Nous allons présenter une première fonction de �ltre moyenneur utilisant la fonction im�lter. Cette fonctionpermet d'appliquer un �ltre à une image par convolution :

56

Page 57: Dossier

Algorithme 25 Fonction de �ltrage moyenneur (im�lter)

%Fonction chargée de c o r r i g e r l ' image b ru i t é e en ent r é e à l ' a ide d 'un%f i l t r e moyenneurfunc t i on f i l t r eMoyenneur ( hObject , eventdata , handles , imgBruit )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;imgBruitOrig ine=imgBruit ;%Récupérat ion du nombre de passes , de l a t a i l l e du f i l t r e et du type de%ge s t i on des bordures de l ' imaget a i l l e F i l t r e=get ( handles . t a i l l e F i l t r e , ' Value ' ) ;switch t a i l l e F i l t r e

case 1t a i l l e F i l t r e =3;

case 2t a i l l e F i l t r e =5;

case 3t a i l l e F i l t r e =7;

case 4t a i l l e F i l t r e =9;

case 5t a i l l e F i l t r e =11;

o therw i s eendnombrePasses=get ( handles . nombrePasses , ' Value ' ) ;bordure=get ( handles . bordure , ' Value ' ) ;switch bordure

case 1bordure=' symmetric ' ;

case 2bordure=' r e p l i c a t e ' ;

case 3bordure=' c i r c u l a r ' ;

o therw i s eend%Construct ion du f i l t r ef i l t r eMoyenne=ones ( t a i l l e F i l t r e , t a i l l e F i l t r e ) ;f o r i =1: t a i l l e F i l t r e

f o r j =1: t a i l l e F i l t r ef i l t r eMoyenne ( i , j )= f i l t r eMoyenne ( i , j ) / ( t a i l l e F i l t r e * t a i l l e F i l t r e ) ;

endend%Appl i ca t ion du f i l t r e moyenneurimgF i l t r e=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;f o r p=1: nombrePasses

imgF i l t r e=im f i l t e r ( imgBruit , f i l t reMoyenne , bordure ) ;imgBruit=imgF i l t r e ;

end%Construct ion des histogrammesh i s toEnt ree=imhis t ( imgBruitOr ig ine ) ;h i s t o S o r t i e=imhi s t ( imgF i l t r e ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( imgBruitOrig ine ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgF i l t r e ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

57

Page 58: Dossier

Après avoir récupéré les dimensions de l'image, nous récupérons la taille du �ltre souhaitée, le nombre depasses et le type de gestion des bordures. Ce dernier paramètre peut prendre trois valeurs. Ce paramètre permetde spéci�er comment seront gérés les pixels situés en bordure. En e�et, pour ces pixels, il est nécessaire d'utiliserdes pixels hors images pour calculer leur valeur. Le mode 'Symmetric' permet de spéci�er que les pixels situés audelà des limites de l'image sont le symétrique de l'image. Ainsi le pixel situé juste après la limite de l'image a lamême valeur que celui situé avant la limite. Le mode 'Replicate' permet de spéci�er que les valeurs situés aprèsles limites de l'image ont la même valeur que les pixels situés en bordure de l'image. En�n, le mode 'Circular'permet de répéter l'image au delà des bordures. Ainsi, le pixel situé juste après la limite droite de l'image parexemple aura la valeur du pixel le plus à gauche dans l'image.

Après avoir récupéré les paramètres, nous créons le �ltre moyenneur. Ce dernier est composé de neuf valeurségale à 1/9. Nous créons tout d'abord un �ltre de côté égale à la taille du �ltre passée en paramètre rempli de1 à l'aide de la fonction ones. Nous parcourons ensuite le �ltre à l'aide de deux boucles for en divisant chaquevaleur par le carré de la taille du �ltre. Nous appliquons ensuite ce �ltre sur l'image à l'aide de la méthodeim�lter autant de fois que nécessaire (nombre de passes).

Pour appliquer un �ltre moyenneur à l'image d'entrée, il nous su�t désormais de cliquer sur le bouton �Filtremoyenneur� de l'interface présentée un peu plus tôt dans ce dossier en ayant au préalable con�guré la taille du�ltre, le nombre de passes et le type de gestion des bordures.

Nous allons tout d'abord nous intéresser au résultat obtenu par le �ltre moyenneur sur un bruit �sel et poivre�.

Avec un bruit �sel et poivre� de densité 0.005 traité par un �ltre moyenneur de taille 3x3 à une seule reprise,le résultat obtenu est le suivant :

Figure 46 � Filtre moyenneur sur un bruit (densité : 0.005, 1 passe, taille 3x3)

Avec un bruit �sel et poivre� de densité 0.005 traité par un �ltre moyenneur de taille 7x7 à une seule reprise,le résultat obtenu est le suivant :

58

Page 59: Dossier

Figure 47 � Filtre moyenneur sur un bruit (densité : 0.005, 1 passe, taille 7x7)

Avec un bruit �sel et poivre� de densité 0.005 traité par un �ltre moyenneur de taille 3x3 à deux reprises, lerésultat obtenu est le suivant :

Figure 48 � Filtre moyenneur sur un bruit (densité : 0.005, 2 passes, taille 3x3)

Nous pouvons voir que les �ltres moyenneurs sont peu e�caces en présence de bruit impulsionnel. L'appli-cation d'un �ltre moyenneur a pour e�et de dilater les pixels noirs et blancs. La qualité de l'image résultat est

59

Page 60: Dossier

donc relativement médiocre. On peut noter toutefois que l'augmentation de la taille du �ltre permet de fairedisparaître en partie les pixels parasites. Toutefois, nous constatons l'apparition d'un �ou important sur l'imagerésultat.

Nous allons maintenant nous intéresser au résultat obtenu par le �ltre moyenneur sur un bruit gaussien.

Avec un bruit gaussien ayant une variance égale à 0.001 traité par un �ltre moyenneur de taille 3x3 à unereprise, le résultat obtenu est le suivant :

Figure 49 � Filtre moyenneursur un bruit gaussien (variance :0.001, 1 passe, taille 3x3)

Avec un bruit gaussien ayant une variance égale à 0.01 traité par un �ltre moyenneur de taille 3x3 à unereprise, le résultat obtenu est le suivant :

60

Page 61: Dossier

Figure 50 � Filtre moyenneur sur un bruit gaussien (variance :0.01, 1 passe, taille 3x3)

Avec un bruit gaussien ayant une variance égale à 0.05 traité par un �ltre moyenneur de taille 3x3 à unereprise, le résultat obtenu est le suivant :

Figure 51 � Filtre moyenneur sur un bruit gaussien (variance :0.05, 1 passe, taille 3x3)

Avec un bruit gaussien ayant une variance égale à 0.01 traité par un �ltre moyenneur de taille 7x7 à unereprise, le résultat obtenu est le suivant :

61

Page 62: Dossier

Figure 52 � Filtre moyenneur sur un bruit gaussien (variance :0.01, 1 passe, taille 7x7)

Avec un bruit gaussien ayant une variance égale à 0.01 traité par un �ltre moyenneur de taille 3x3 à deuxreprises, le résultat obtenu est le suivant :

Figure 53 � Filtre moyenneur sur un bruit gaussien (variance :0.01, 2 passes, taille 3x3)

Avec un bruit gaussien ayant une variance égale à 0.01 traité par un �ltre moyenneur de taille 7x7 à deuxreprises, le résultat obtenu est le suivant :

62

Page 63: Dossier

Figure 54 � Filtre moyenneur sur un bruit gaussien (variance :0.01, 2 passes, taille 7x7)

Nous pouvons voir que les résultats obtenus par le �ltre moyenneur avec le bruit gaussien sont quasimentidentiques à ceux obtenus avec le �ltre médian.

Pour �nir, nous allons observer les e�ets d'un �ltre moyenneur sur le bruit de Poisson.

Avec un bruit de Poisson traité par un �ltre moyenneur de taille 3x3 à une reprise, le résultat obtenu est lesuivant :

63

Page 64: Dossier

Figure 55 � Filtre moyenneur sur un bruit de Poisson (1 passe, taille 3x3)

Avec un bruit de Poisson traité par un �ltre moyenneur de taille 7x7 à une reprise, le résultat obtenu est lesuivant :

Figure 56 � Filtre moyenneur sur un bruit de Poisson (1 passe, taille 7x7)

Avec un bruit de Poisson traité par un �ltre moyenneur de taille 3x3 à deux reprises, le résultat obtenu estle suivant :

64

Page 65: Dossier

Figure 57 � Filtre moyenneur sur un bruit de Poisson (2 passes, taille 3x3)

Avec un bruit de Poisson traité par un �ltre moyenneur de taille 7x7 à deux reprises, le résultat obtenu estle suivant :

Figure 58 � Filtre moyenneur sur un bruit de Poisson (2 passes, taille 7x7)

Le �ltre moyenneur permet de nettoyer en partie le bruit de Poisson. Toutefois, ce nettoyage se fait au prixde l'apparition d'un �ou important sur l'ensemble de l'image.

65

Page 66: Dossier

4.3.2 Algorithme maison

Nous allons maintenant présenter une deuxième fonction permettant d'appliquer un �ltre moyenneur à l'aided'un algorithme maison :

Algorithme 26 Fonction d'application de �ltres moyenneurs (Algorithme maison)

%Fonction chargée de c o r r i g e r l ' image b ru i t é e en ent r é e à l ' a ide d 'un%f i l t r e moyenneurfunc t i on f i l t reMoyenneurMaison ( hObject , eventdata , handles , imgBruit )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;imgBruitOrig ine=imgBruit ;%Appl i ca t ion du f i l t r e moyenneurimgF i l t r e=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;for i =2:( hauteur−1)

for j =2:( l a rgeur −1)va l eur =0:8 ;i n d i c e =1;for k=(i −1) :( i +1)

for l =(j −1) :( j +1)va l eur ( i nd i c e )=imgBruit (k , l ) ;i n d i c e=i nd i c e +1;

endend%Changement de l a va l eur du p i x e l par l a moyenneimgF i l t r e ( i , j )=mean( va l eur ) ;

endend%Construct ion des histogrammesh i s toEnt ree=imhis t ( imgBruitOr ig ine ) ;h i s t o S o r t i e=imhi s t ( imgF i l t r e ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( imgBruitOrig ine ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgF i l t r e ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Pour appliquer le �ltrage moyenneur, nous parcourons l'ensemble des pixels de l'image acquise à l'aide dedeux boucles for imbriquées. Un tableau de neuf cases nommé valeur est utilisé pour stocker les valeurs despixels utilisés pour �ltrer le pixel courant. On récupère et on stocke les valeurs des voisins à l'aide de deuxnouvelles boucles for permettant de parcourir le voisinage du pixel courant. Après avoir récupéré les valeurs, ilnous su�t de calculer la moyenne des valeurs du tableau. On place ensuite cette valeur dans le pixel de l'imagerésultat.

Pour réaliser un �ltrage moyenneur maison de l'image d'entrée, il nous su�t désormais de cliquer sur lebouton �Filtre moyenneur maison� de l'interface présentée un peu plus tôt dans ce dossier en ayant au préalablecon�guré la taille du �ltre, le nombre de passes et la gestion des bordures. Les résultats obtenus par cette fonctionsont identiques aux résultats présentés précédemment. L'exécution de notre fonction maison est toutefois moinsrapide que l'exécution de la fonction utilisant la fonction im�lter.

66

Page 67: Dossier

4.4 Flou et �ltre de Wiener

Nous allons maintenant nous intéresser à la correction d'éventuels �ous dans l'image acquise. Dans un premiertemps, nous présenterons les fonctions développées par notre binôme pour ajouter un e�et de �ou à l'image.Nous présenterons ensuite une fonction de correction du �ou basée sur le �ltre de Wiener.

4.4.1 Flou

L'application du �ou sur une image s'e�ectue en trois étapes. Nous créons tout d'abord le �ou à proprementparler à l'aide de la fonction suivante :

Algorithme 27 Fonction de création du �ou

%Fonction permettant de c r é e r l a f on c t i on de f l o u t a g efunc t i on PSF=crea t i onF lou ( hObject , eventdata , handles )

%Récupérat ion de l a longueur et de l ' ang le du f l o ulongueur=get ( handles . longueur , ' S t r ing ' ) ;ang le=get ( handles . angle , ' S t r ing ' ) ;longueur=str2num ( longueur ) ;ang le=str2num ( ang le ) ;%Créat ion du f l o uPSF=f s p e c i a l ( ' motion ' , longueur , ang le ) ;

Le �ou est paramétré à l'aide de deux contrôles. Un premier champ texte permet de paramétrer la longueur du�ou tandis qu'un second champ texte permet de régler l'angle du �ou. Après avoir récupéré ces deux paramètres,nous créons le �ou à l'aide de la fonction fspecial et nous le stockons dans la variable PSF. La fonction fspecialprend en paramètre le type de �ou, la longueur et l'angle du �ou. Dans notre cas, nous créons un �ou de mouve-ment (type 'motion'). Il est à noter que la variable PSF est retourné par la fonction pour être utilisé par la suite.

Il nous faut maintenant appliquer le �ou à l'image :

Algorithme 28 Fonction d'application du �ou

%Fonction chargée d ' app l i que r un bru i t ( c h o i s i par l ' u t i l i s a t e u r à l ' a ide%des r ad i o s buttons ) à l ' image d ' en t r é efunc t i on imgFloute=app l i c a t i onF lou ( hObject , eventdata , handles ,PSF)

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;y = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ( "y" : frame cou l eur )I4 = rgb2gray (y ) ;%on passe "y" en niveau de g r i simgFloute=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;%Appl i ca t ion du f l o uimgFloute=im f i l t e r ( I4 ,PSF, ' c i r c u l a r ' , ' conv ' ) ;

Nous récupérons tout d'abord l'image à l'aide de la méthode habituelle. Nous appliquons ensuite le �ou àl'aide de la fonction im�lter. Cette dernière permet de convoluer l'image avec le �ou PSF passé en paramètrede la fonction. Il est à noter qu'un contrôle de type 'checkbox' est placé dans l'interface pour permettre à l'uti-lisateur d'ajouter du bruit en supplément du �ou. Lorsque la case à cocher est validé, l'utilisateur peut alorsparamétrer le bruit à l'aide des contrôles présentés précédemment.

Les �gures suivantes présentent une même image plus ou moins altérée par un �ou de mouvement :

67

Page 68: Dossier

Figure 59 � Flou de mouvement

4.4.2 Filtre de Wiener

Nous allons maintenant présenter une fonction permettant de corriger le �ou de mouvement à l'aide du �ltrede Wiener :

68

Page 69: Dossier

Algorithme 29 Fonction de correction de �ou

%Fonction chargée de c o r r i g e r l ' image f l o u t é e en ent r é e à l ' a ide d 'un%f i l t r e Wienerfunc t i on f louWiener ( hObject , eventdata , handles , imgFloute ,PSF)

%Suppress ion du f l o uimgDef loute=deconvwnr ( imgFloute ,PSF ) ;%Construct ion des histogrammesh i s toEnt ree=imhis t ( imgFloute ) ;h i s t o S o r t i e=imhi s t ( imgDef loute ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( imgFloute ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgDef loute ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Pour corriger l'image �outée (passée en paramètre de la fonction), il su�t d'utiliser la fonction deconvwnren passant en paramètre l'image à corriger et le �ou qui a été appliqué (variable PSF passée en paramètre). Ilest à noter qu'il est possible de donner une approximation du �ou à la fonction si l'on ne dispose pas du �ouexacte.

Pour réaliser une correction de �ou de l'image d'entrée, il nous su�t désormais de cliquer sur le bouton �FlouWiener� de l'interface présentée un peu plus tôt dans ce dossier en ayant au préalable con�guré la longueur du�ou et l'angle de celui ci. Il est également possible d'ajouter un bruit à l'aide de la case à cocher prévue à cet e�et.

Avec un �ou de longueur 15, un angle nul et aucun bruit, le résultat obtenu est le suivant :

69

Page 70: Dossier

Figure 60 � Correction de �ou (longueur :15, angle :0, aucun bruit)

Avec un �ou de longueur 35, un angle nul et aucun bruit, le résultat obtenu est le suivant :

Figure 61 � Correction de �ou (longueur :35, angle :0, aucun bruit)

Avec un �ou de longueur 15, un angle nul et un bruit �sel et poivre�, le résultat obtenu est le suivant :

70

Page 71: Dossier

Figure 62 � Correction de �ou (longueur :15, angle :0, bruit �sel et poivre�)

Avec un �ou de longueur 15, un angle nul et un bruit gaussien, le résultat obtenu est le suivant :

Figure 63 � Correction de �ou (longueur :15, angle :0, bruit gaussien)

Avec un �ou de longueur 15, un angle nul et un bruit de Poisson, le résultat obtenu est le suivant :

71

Page 72: Dossier

Figure 64 � Correction de �ou (longueur :15, angle :0, bruit de Poisson)

Avec un �ou de longueur 15, un angle de 45° et aucun bruit, le résultat obtenu est le suivant :

Figure 65 � Correction de �ou (longueur :15, angle :45°, aucun bruit)

Nous pouvons voir que le �ltre de Wiener permet de restituer très �dèlement l'image d'origine. On notetoutefois l'apparition de nombreux parasites (similaire à ceux présent dans un bruit Gaussien) dans l'imagerésultat. Lorsqu'un bruit est ajouté, le �ltre de Wiener ne permet pas de corriger le �ou de mouvement. Il est

72

Page 73: Dossier

donc nécessaire d'appliquer au préalable un �ltre pour corriger le bruit de l'image avant d'appliquer le �ltre deWiener. En�n, lorsque le �ou de mouvement a un angle, le �ltre de Wiener se révèle assez peu e�cace.

5 Détection de contours et segmentation d'images

La détection des contours d'une image ou sa segmentation permettent de préparer le terrain pour destraitements de plus haut niveau tel que la reconnaissance de formes. Dans un premier temps, nous présenteronsun large panel de méthodes permettant de détecter les contours d'une image. Nous présenterons ensuite uneméthode permettant de segmenter une image.

5.1 Détection de contours

5.1.1 Gradient Simple

La première méthode de détection de contour que nous allons exposée est celle du gradient Simple. Cetteméthode utilise deux �ltres (ou masques de convolution) pour mettre en évidence les contours :

Figure 66 � Principe du gradient Simple

La méthode du gradient simple est constituée de deux étapes. Dans un premier temps, on applique les deux�ltres de convolution à l'image. Le premier de ces �ltres permet de détecter les contours horizontaux tandis quele second �ltre permet de détecter les contours verticaux. Nous obtenons ainsi deux images. Il su�t ensuite defusionner les deux images en utilisant un calcul de norme.

La fonction suivante permet de détecter les contours à l'aide du gradient Simple :

73

Page 74: Dossier

Algorithme 30 Fonction de détection de contours à l'aide du gradient Simple

%Fonction chargée de d é t e c t e r l e s contours de l ' image à l ' a ide du Gradient%Simplefunc t i on grad ientS imple ( hObject , eventdata , handles )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;y = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ("y" : frame cou l eur )I4 = rgb2gray (y ) ;%on passe "y" en niveau de g r i s%Appl i ca t ion éventue l d 'un b ru i tcheck=get ( handles . checkBruitContour , ' Value ' ) ;i f ( check==1)

I4=bru i t2 ( hObject , eventdata , handles , I4 ) ;end%Récupérat ion du " seu i lContour "s e u i l=str2num ( get ( handles . seu i lContour , ' S t r ing ' ) ) ;%Créat ion de l ' image de s o r t i eimgContour=im2uint8 ( z e r o s ( hauteur , l a r g eu r ) ) ;%Créat ion des images contenant l e s g r ad i en t simgGx=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;imgGy=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;%Appl i ca t ion du Gradient Simple Hor i zonta lf o r i =1: hauteur

f o r j =1:( l a rgeur −1)imgGx( i , j )=I4 ( i , ( j +1))− I4 ( i , j ) ;

endend%Appl i ca t ion du Gradient Simple Ve r t i c a lf o r i =1:( hauteur−1)

f o r j =1: l a r g eu rimgGy( i , j )=( I4 ( ( i +1) , j ))− I4 ( i , j ) ;

endend%Somme normée des Gradients pu i s b i n a r i s a t i o n év en tu e l l e de l ' imagecheck=get ( handles . checkGrad ientS impleBinar i sat ion , ' Value ' ) ;i f ( check==1)

for i =1: hauteurfor j =1: l a r g eu r

norme=f l o o r ( sq r t (double ( ( ( abs ( imgGx( i , j ) )* abs ( imgGx( i , j )))+( abs ( imgGy( i , j ) )*abs ( imgGy( i , j ) ) ) ) ) ) ) ;

i f ( norme>s e u i l )imgContour ( i , j )=255;

else

imgContour ( i , j )=0;end

endend

else

for i =1: hauteurfor j =1: l a r g eu r

%norme=f l o o r ( s q r t (double ( ( ( imgGx( i , j )* imgGx( i , j ))+(imgGy( i , j )* imgGy( i , j ) ) ) ) ) ) ;norme=abs ( imgGx( i , j ))+abs ( imgGy( i , j ) ) ;imgContour ( i , j )=norme ;

endend

end

74

Page 75: Dossier

Algorithme 31 Fonction de détection de contours à l'aide du gradient Simple (Suite)

%Construct ion des histogrammesh i s toEnt ree=imhis t ( I4 ) ;h i s t o S o r t i e=imhi s t ( imgContour ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( I4 ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgContour ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Après avoir récupéré et convertit l'image, nous regardons si la case à cocher est validée. Si c'est le cas, nousajoutons un bruit à l'image à l'aide des fonctions présentées précédemment dans ce dossier. Nous récupéronsensuite la valeur du seuil saisie par l'utilisateur. Cette valeur in�uencera le nombre de contours détectés commenous pourrons le voir dans les captures d'écran un peu plus loin dans ce dossier. Nous allouons ensuite troisimages : une première image qui contiendra l'image résultat ainsi que deux images qui permettront de stockerrespectivement les contours horizontaux et verticaux

Nous commençons tout d'abord par appliquer le gradient horizontal. Pour cela, nous parcourons l'intégralitéde l'image et nous appliquons la formule issue du �ltre. Pour un pixel (i,j), il nous faut utiliser la valeur de cepixel ainsi que le pixel situé à sa droite (c'est à dire le pixel (i,j+1)). Le �ltre est centré sur la valeur -1. Pourcalculer le gradient horizontal d'un pixel, on soustrait donc la valeur de ce pixel à la valeur du pixel situé à sadroite. Nous appliquons ensuite le gradient vertical. Pour cela, nous parcourons l'ensemble des pixels de l'image.Pour un pixel(i,j), il nous faut utiliser la valeur de ce pixel ainsi que la valeur du pixel situé au dessous(c'est àdire le pixel (i+1,j)). Pour calculer le gradient vertical d'un pixel, on soustrait donc la valeur de ce pixel à lavaleur du pixel situé en dessous.

Après avoir calculé les gradients horizontaux et verticaux, nous calculons la norme des gradients pour chaquepixel de l'image résultat. Ainsi, le pixel de l'image résultat (i,j) sera égale à la somme normée des pixels (i,j) desdeux images contenant les gradients. La norme utilisée est la norme des valeurs absolues. Il est à noter qu'il esttout à fait possible d'utiliser un autre type de norme (voir norme euclidienne en commentaire dans le code).

Il est à noter que nous avons ajouté la possibilité de binariser le résultat du gradient simple. Ainsi, l'uti-lisateur peut spéci�er qu'il souhaite binariser l'image à l'aide d'une case à cocher. Lorsque cette dernière estvalidée, nous appliquons alors une binarisation de l'image résultat en se basant sur le seuil saisie par l'utilisateurdans le champ texte prévu à cet e�et.

Pour réaliser une détection de contours à l'aide du gradient Simple, il nous su�t désormais de cliquer surle bouton �Gradient Simple� de l'interface présentée un peu plus tôt dans ce dossier en ayant éventuellementajouté un bruit à l'aide de la case à cocher.

Sans binarisation, le résultat obtenu est le suivant :

75

Page 76: Dossier

Figure 67 � Détection de contours à l'aide du gradient simple (sans binarisation)

Avec une binarisation de seuil 14, le résultat obtenu est le suivant :

Figure 68 � Détection de contours à l'aide du gradient simple (binarisation de seuil 14)

Avec une binarisation de seuil 8, le résultat obtenu est le suivant :

76

Page 77: Dossier

Figure 69 � Détection de contours à l'aide du gradient simple (binarisation de seuil 8)

Avec une binarisation de seuil 3, le résultat obtenu est le suivant :

Figure 70 � Détection de contours à l'aide du gradient simple (binarisation de seuil 3)

Avec une binarisation de seuil 14 et un bruit �sel et poivre�, le résultat obtenu est le suivant :

77

Page 78: Dossier

Figure 71 � Détection de contours à l'aide du gradient simple (binarisation de seuil 14 et un bruit �sel etpoivre�)

Avec une binarisation de seuil 14 et un bruit gaussien, le résultat obtenu est le suivant :

Figure 72 � Détection de contours à l'aide du gradient simple (binarisation de seuil 14 et un bruit gaussien)

Avec une binarisation de seuil 14 et un bruit de Poisson, le résultat obtenu est le suivant :

78

Page 79: Dossier

Figure 73 � Détection de contours à l'aide du gradient simple (binarisation de seuil 14 et un bruit de Poisson)

On peut voir que le gradient simple permet de détecter assez e�cacement les contours. Les contours produitspar ce traitement sont relativement propres et pour la plupart fermés. Toutefois, ce type de �ltre est relativementsensible aux bruits.

5.1.2 Gradient de Roberts

La deuxième méthode de détection de contour que nous allons présenté est celle du gradient de Roberts.Cette méthode utilise deux �ltres pour mettre en évidence les contours :

79

Page 80: Dossier

Figure 74 � Principe du gradient de Roberts

Le gradient de Roberts est constitué de deux étapes. Dans un premier temps, on applique les deux �ltresde convolution à l'image. Le premier de ces �ltres permet de détecter les contours ayant une direction allantdu coin supérieure gauche de l'image au coin inférieur droit (ou l'inverse) tandis que le second �ltre permet dedétecter les contours ayant une direction allant du coin inférieur gauche de l'image au coin supérieure droit (oul'inverse). Nous obtenons ainsi deux images. Il su�t ensuite de fusionner les deux images en utilisant un calculde norme.

La fonction suivante permet de détecter les contours à l'aide du gradient de Roberts :

80

Page 81: Dossier

Algorithme 32 Fonction de détection de contours à l'aide du gradient de Roberts

%Fonction chargée de d é t e c t e r l e s contours de l ' image à l ' a ide du Gradient%de Robertsfunc t i on grad ientRobert s ( hObject , eventdata , handles )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;y = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ("y" : frame cou l eur )I4 = rgb2gray (y ) ; %on passe "y" en niveau de g r i s%Appl i ca t ion éventue l d 'un b ru i tcheck=get ( handles . checkBruitContour , ' Value ' ) ;i f ( check==1)

I4=bru i t2 ( hObject , eventdata , handles , I4 ) ;end%Récupérat ion du " seu i lContour "s e u i l=str2num ( get ( handles . seu i lContour , ' S t r ing ' ) ) ;%Créat ion de l ' image de s o r t i eimgContour=im2uint8 ( z e r o s ( hauteur , l a r g eu r ) ) ;%Appl i ca t ion du Gradient de RobertsimgContour=edge ( I4 , ' r ob e r t s ' , s e u i l ) ;%Construct ion des histogrammesh i s toEnt ree=imhis t ( I4 ) ;h i s t o S o r t i e=imhi s t ( imgContour ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( I4 ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgContour ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Après avoir récupéré et convertit l'image, nous regardons si la case à cocher est validée. Si c'est le cas, nousajoutons un bruit à l'image à l'aide des fonctions présentées précédemment dans ce dossier. Nous récupéronsensuite la valeur du seuil saisie par l'utilisateur. Cette valeur in�uencera le nombre de contours détecté commenous pourrons le voir dans les captures d'écran un peu plus loin dans ce dossier.

Après avoir alloué l'image de sortie imgContour, nous utilisons la fonction Matlab edge pour réaliser ladétection des contours de l'image. Cette fonction prend en paramètre l'image d'origine, le nom de la méthodede détection ('roberts' dans le cas présent) et le seuil de détection.

Pour réaliser une détection de contours à l'aide du gradient de Roberts, il nous su�t désormais de cliquer surle bouton �Gradient de Roberts� de l'interface présentée un peu plus tôt dans ce dossier en ayant au préalableparamétré le seuil de la détection et éventuellement ajouté un bruit à l'aide de la case à cocher.

Avec un seuil de 0.2, le résultat obtenu est le suivant :

81

Page 82: Dossier

Figure 75 � Détection de contours à l'aide du gradient de Roberts (seuil : 0.2)

Avec un seuil de 0.1, le résultat obtenu est le suivant :

Figure 76 � Détection de contours à l'aide du gradient de Roberts (seuil : 0.1)

Avec un seuil de 0.05, le résultat obtenu est le suivant :

82

Page 83: Dossier

Figure 77 � Détection de contours à l'aide du gradient de Roberts (seuil : 0.05)

Avec un seuil de 0.01, le résultat obtenu est le suivant :

Figure 78 � Détection de contours à l'aide du gradient de Roberts (seuil : 0.01)

Avec un seuil de 0.05 et un bruit �sel et poivre�, le résultat obtenu est le suivant :

83

Page 84: Dossier

Figure 79 � Détection de contours à l'aide du gradient de Roberts (seuil : 0.05 et bruit �sel et poivre�)

Avec un seuil de 0.05 et un bruit gaussien, le résultat obtenu est le suivant :

Figure 80 � Détection de contours à l'aide du gradient de Roberts (seuil : 0.05 et bruit gaussien)

Avec un seuil de 0.05 et un bruit de Poisson, le résultat obtenu est le suivant :

84

Page 85: Dossier

Figure 81 � Détection de contours à l'aide du gradient de Roberts (seuil : 0.05 et bruit de Poisson)

Nous pouvons voir que lorsque le seuil est élevé, seul les contours les plus marqués sont détectés. Avec unseuil de 0.05, nous obtenons une grande partie des contours de l'image. En�n, lorsque le seuil est trop bas,beaucoup trop d'éléments sont considérés comme des contours par le détecteur.

5.1.3 Filtre de Prewitt

Nous allons maintenant présenter deux types de �ltres présentant une sensibilité au bruit un peu moinsimportante : les �ltres de Prewitt et Sobel. Ces deux �ltres sont très similaires.

Le principe du Filtre de Prewitt est le suivant :

Figure 82 � Principe du �ltre de Prewitt

85

Page 86: Dossier

L'application d'un �ltre de Prewitt est constitué de deux étapes. Dans un premier temps, on applique lesdeux �ltres de convolution à l'image. Le premier de ces �ltres permet de détecter les contours verticaux tandisque le second �ltre permet de détecter les contours horizontaux de l'image. Nous obtenons ainsi deux images.Il su�t ensuite de fusionner les deux images en utilisant un calcul de norme.

La fonction suivante permet de détecter les contours à l'aide du �ltre de Prewitt :

Algorithme 33 Fonction de détection de contours à l'aide du �ltre de Prewitt

%Fonction chargée de c o r r i g e r l ' image f l o u t é e en ent r é e à l ' a ide du f i l t r e%de Prewittfunc t i on f i l t r e P r ew i t t ( hObject , eventdata , handles )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;y = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ("y" : frame cou l eur )I4 = rgb2gray (y ) ;%on passe "y" en niveau de g r i s%Appl i ca t ion éventue l d 'un b ru i tcheck=get ( handles . checkBruitContour , ' Value ' ) ;i f ( check==1)

I4=bru i t2 ( hObject , eventdata , handles , I4 ) ;end%Récupérat ion du " seu i lContour "s e u i l=str2num ( get ( handles . seu i lContour , ' S t r ing ' ) ) ;%Créat ion de l ' image de s o r t i eimgContour=im2uint8 ( z e r o s ( hauteur , l a r g eu r ) ) ;%Appl i ca t ion du f i l t r e de PrewittimgContour=edge ( I4 , ' p rew i t t ' , s e u i l ) ;%Construct ion des histogrammesh i s toEnt ree=imhis t ( I4 ) ;h i s t o S o r t i e=imhi s t ( imgContour ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( I4 ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgContour ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Cette fonction est très similaire à celle du gradient de Roberts. La seule di�érence se trouve dans l'utilisationde la fonction edge. Le type de détection utilisé est cette fois 'prewitt'.

Pour réaliser une détection de contours à l'aide du �ltre de Prewitt, il nous su�t désormais de cliquer surle bouton �Filtre de Prewitt� de l'interface présentée un peu plus tôt dans ce dossier en ayant au préalableparamétré le seuil de la détection et éventuellement ajouté un bruit à l'aide de la case à cocher.

Avec un seuil de 0.2, le résultat obtenu est le suivant :

86

Page 87: Dossier

Figure 83 � Détection de contours à l'aide du �ltre de Prewitt (seuil : 0.2)

Avec un seuil de 0.1, le résultat obtenu est le suivant :

Figure 84 � Détection de contours à l'aide du �ltre de Prewitt (seuil : 0.1)

Avec un seuil de 0.05, le résultat obtenu est le suivant :

87

Page 88: Dossier

Figure 85 � Détection de contours à l'aide du �ltre de Prewitt (seuil : 0.05)

Avec un seuil de 0.01, le résultat obtenu est le suivant :

Figure 86 � Détection de contours à l'aide du �ltre de Prewitt (seuil : 0.01)

Avec un seuil de 0.05 et un bruit �sel et poivre�, le résultat obtenu est le suivant :

88

Page 89: Dossier

Figure 87 � Détection de contours à l'aide du �ltre de Prewitt (seuil : 0.05 et bruit �sel et poivre�)

Avec un seuil de 0.05 et un bruit gaussien, le résultat obtenu est le suivant :

Figure 88 � Détection de contours à l'aide du �ltre de Prewitt (seuil : 0.05 et bruit gaussien)

Avec un seuil de 0.05 et un bruit de Poisson, le résultat obtenu est le suivant :

89

Page 90: Dossier

Figure 89 � Détection de contours à l'aide du �ltre de Prewitt (seuil : 0.05 et bruit de Poisson)

Nous pouvons voir que les résultats obtenus sont similaires à ceux obtenus à l'aide du gradient de Roberts.Toutefois, le �ltre de Prewitt permet de limiter l'apparition des parasites lorsque le seuil est trop faible commeen témoigne la capture d'écran réalisée avec un seuil de 0.01. On peut voir également que ce �ltre résiste assezbien au bruit gaussien.

5.1.4 Filtre de Sobel

Le principe du Filtre de Sobel est le suivant :

90

Page 91: Dossier

Figure 90 � Principe du �ltre de Sobel

L'application d'un �ltre de Sobel est constitué de deux étapes. Dans un premier temps, on applique les deux�ltres de convolution à l'image. Le premier de ces �ltres permet de détecter les contours verticaux tandis que lesecond �ltre permet de détecter les contours horizontaux de l'image. Nous obtenons ainsi deux images. Il su�tensuite de fusionner les deux images en utilisant un calcul de norme.

La fonction suivante permet de détecter les contours à l'aide du �ltre de Sobel :

91

Page 92: Dossier

Algorithme 34 Fonction de détection de contours à l'aide du �ltre de Sobel

%Fonction chargée de d é t e c t e r l e s contours de l ' image à l ' a ide du F i l t r e de%Sobelfunc t i on f i l t r e S o b e l ( hObject , eventdata , handles )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;y = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ("y" : frame cou l eur )I4 = rgb2gray (y ) ;%on passe "y" en niveau de g r i s%Appl i ca t ion éventue l d 'un b ru i tcheck=get ( handles . checkBruitContour , ' Value ' ) ;i f ( check==1)

I4=bru i t2 ( hObject , eventdata , handles , I4 ) ;end%Récupérat ion du " seu i lContour "s e u i l=str2num ( get ( handles . seu i lContour , ' S t r ing ' ) ) ;%Créat ion de l ' image de s o r t i eimgContour=im2uint8 ( z e r o s ( hauteur , l a r g eu r ) ) ;%Appl i ca t ion du f i l t r e de SobelimgContour=edge ( I4 , ' s obe l ' , s e u i l ) ;%Construct ion des histogrammesh i s toEnt ree=imhis t ( I4 ) ;h i s t o S o r t i e=imhi s t ( imgContour ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( I4 ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgContour ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Cette fonction est très similaire à celle du �ltre de Prewitt. La seule di�érence se trouve dans l'utilisationde la fonction edge. Le type de détection utilisé est cette fois 'sobel'.

Pour réaliser une détection de contours à l'aide du �ltre de Sobel, il nous su�t désormais de cliquer sur lebouton �Filtre de Sobel� de l'interface présentée un peu plus tôt dans ce dossier en ayant au préalable paramétréle seuil de la détection et éventuellement ajouté un bruit à l'aide de la case à cocher.

Avec un seuil de 0.2, le résultat obtenu est le suivant :

92

Page 93: Dossier

Figure 91 � Détection de contours à l'aide du �ltre de Sobel (seuil : 0.2)

Avec un seuil de 0.1, le résultat obtenu est le suivant :

Figure 92 � Détection de contours à l'aide du �ltre de Sobel (seuil : 0.1)

Avec un seuil de 0.05, le résultat obtenu est le suivant :

93

Page 94: Dossier

Figure 93 � Détection de contours à l'aide du �ltre de Sobel (seuil : 0.05)

Avec un seuil de 0.01, le résultat obtenu est le suivant :

Figure 94 � Détection de contours à l'aide du �ltre de Sobel (seuil : 0.01)

Avec un seuil de 0.05 et un bruit �sel et poivre�, le résultat obtenu est le suivant :

94

Page 95: Dossier

Figure 95 � Détection de contours à l'aide du �ltre de Sobel (seuil : 0.05 et bruit �sel et poivre�)

Avec un seuil de 0.05 et un bruit gaussien, le résultat obtenu est le suivant :

Figure 96 � Détection de contours à l'aide du �ltre de Sobel (seuil : 0.05 et bruit gaussien)

Avec un seuil de 0.05 et un bruit de Poisson, le résultat obtenu est le suivant :

95

Page 96: Dossier

Figure 97 � Détection de contours à l'aide du �ltre de Sobel (seuil : 0.05 et bruit de Poisson)

Nous pouvons voir que les résultats obtenus sont similaires à ceux obtenus à l'aide du gradient de Roberts.Toutefois, le �ltre de Sobel permet de �ltrer une partie des parasites lorsque le seuil est trop faible comme entémoigne la capture d'écran réalisée avec un seuil de 0.01.

5.1.5 Filtre de Canny

Nous allons maintenant nous intéresser à un �ltre dit optimal. Canny s'est basé sur les critères suivants pourcréer son �ltre :

� un critère de bonne détection garantissant une réponse forte en sortie du �ltre même en présence de faiblescontours sur l'image d'entrée.

� un critère de bonne localisation du contour.� un critère d'unicité de la réponse permettant d'assurer une seule détection pour un contour et ainsi d'éviterles e�ets de rebond.

Le principe du Filtre de Canny est le suivant :

96

Page 97: Dossier

Figure 98 � Principe du �ltre de Canny

L'application d'un �ltre de Canny est constitué de trois étapes. Dans un premier temps, on �ltre l'imageoriginale à l'aide d'un �ltre passe-bas a�n de lisser l'image. On applique ensuite le �ltre de Canny en deuxétapes :

Figure 99 � Principe du �ltre de Canny

Dans un premier temps, on applique les deux �ltres de convolution à l'image. Le premier de ces �ltres permetde détecter les contours verticaux tandis que le second �ltre permet de détecter les contours horizontaux del'image. Nous obtenons ainsi deux images. Il su�t ensuite de fusionner les deux images en utilisant un calculde norme.

La fonction suivante permet de détecter les contours à l'aide du �ltre de Canny :

97

Page 98: Dossier

Algorithme 35 Fonction de détection de contours à l'aide du �ltre de Canny

%Fonction chargée de c o r r i g e r l ' image f l o u t é e en ent r é e à l ' a ide du f i l t r e%de Cannyfunc t i on f i l t r eCanny ( hObject , eventdata , handles )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;y = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ("y" : frame cou l eur )I4 = rgb2gray (y ) ;%on passe "y" en niveau de g r i s%Appl i ca t ion éventue l d 'un b ru i tcheck=get ( handles . checkBruitContour , ' Value ' ) ;i f ( check==1)

I4=bru i t2 ( hObject , eventdata , handles , I4 ) ;end%Récupérat ion du " seu i lContour "s e u i l=str2num ( get ( handles . seu i lContour , ' S t r ing ' ) ) ;%Créat ion de l ' image de s o r t i eimgContour=im2uint8 ( z e r o s ( hauteur , l a r g eu r ) ) ;%Appl i ca t ion du f i l t r e de CannyimgContour=edge ( I4 , ' canny ' , s e u i l ) ;%Construct ion des histogrammesh i s toEnt ree=imhis t ( I4 ) ;h i s t o S o r t i e=imhi s t ( imgContour ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( I4 ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgContour ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Cette fonction est très similaire à celle du �ltre de Sobel. La seule di�érence se trouve dans l'utilisation dela fonction edge. Le type de détection utilisé est cette fois 'canny'.

Pour réaliser une détection de contours à l'aide du �ltre de Canny, il nous su�t désormais de cliquer sur lebouton �Filtre de Canny� de l'interface présentée un peu plus tôt dans ce dossier en ayant au préalable paramétréle seuil de la détection et éventuellement ajouté un bruit à l'aide de la case à cocher.

Avec un seuil de 0.8, le résultat obtenu est le suivant :

98

Page 99: Dossier

Figure 100 � Détection de contours à l'aide du �ltre de Canny (seuil : 0.8)

Avec un seuil de 0.4, le résultat obtenu est le suivant :

Figure 101 � Détection de contours à l'aide du �ltre de Canny (seuil : 0.4)

Avec un seuil de 0.2, le résultat obtenu est le suivant :

99

Page 100: Dossier

Figure 102 � Détection de contours à l'aide du �ltre de Canny (seuil : 0.2)

Avec un seuil de 0.03, le résultat obtenu est le suivant :

Figure 103 � Détection de contours à l'aide du �ltre de Canny (seuil : 0.03)

Avec un seuil de 0.2 et un bruit �sel et poivre�, le résultat obtenu est le suivant :

100

Page 101: Dossier

Figure 104 � Détection de contours à l'aide du �ltre de Canny (seuil : 0.2 et bruit �sel et poivre�)

Avec un seuil de 0.2 et un bruit gaussien, le résultat obtenu est le suivant :

Figure 105 � Détection de contours à l'aide du �ltre de Canny (seuil : 0.2 et un bruit gaussien)

Avec un seuil de 0.2 et un bruit de Poisson, le résultat obtenu est le suivant :

101

Page 102: Dossier

Figure 106 � Détection de contours à l'aide du �ltre de Canny (seuil : 0.2 et un bruit de Poisson)

Avec un seuil de 0.8, les contours les plus marqués de l'image ont été parfaitement détectés. Les seuils de 0.4et 0.2 permettent de détecter une grande partie des contours de l'image. En�n, lorsque le seuil est trop faiblecomme c'est le cas pour le seuil égale à 0.03, nous constatons l'apparition de nombreuses �gri�es� sur l'imagerésultat. Nous pouvons voir que les bruits gaussien et de Poisson sont très bien �ltrés par le �ltre de Canny. Enrevanche, le bruit �sel et poivre� est assez mal supporté.

5.1.6 Filtre Laplacien

Nous allons maintenant étudier une autre méthode pour détecter les contours d'une image : le �ltre Laplacien.Ce �ltre fonctionne sur le même principe que les précédents.

On distingue deux types de �ltres Laplaciens : le �ltre Laplacien 4-connexe et le �ltre Laplacien 8-connexe :

Figure 107 � Principe du �ltre Laplacien 4-connexe

102

Page 103: Dossier

Figure 108 � Principe du �ltre Laplacien 8-connexe

Le choix de la connexité du �ltre Laplacien sera donnée à l'utilisateur grâce à des boutons radios présentsdans l'interface. La gestion des boutons radios est réalisé à l'aide d'un gestionnaire d'évènement placé sur legroupe de boutons encadrant les boutons radios. La connexité du �ltre est stockée dans un champ texte invisiblenommé conChoisi.

La fonction suivante permet de détecter les contours à l'aide du �ltre Laplacien :

103

Page 104: Dossier

Algorithme 36 Fonction de détection de contours à l'aide du �ltre Laplacien

%Fonction chargée de c o r r i g e r l ' image f l o u t é e en ent r é e à l ' a ide du f i l t r e%Laplac i en 4 ou 8 connexefunc t i on imgContour=f i l t r e L a p l a c i e n ( hObject , eventdata , handles )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;y = ( getdata ( handles . vid , 1 , ' u int8 ' ) ) ;%accè s à l a frame s tockée en mémoire ("y" : frame cou l eur )I4 = rgb2gray (y ) ;%on passe "y" en niveau de g r i s%Appl i ca t ion éventue l d 'un b ru i tcheck=get ( handles . checkBruitContour , ' Value ' ) ;i f ( check==1)

I4=bru i t2 ( hObject , eventdata , handles , I4 ) ;end%Créat ion de l ' image de s o r t i eimgContour=im2uint8 ( z e r o s ( hauteur , l a r g eu r ) ) ;%Récupérat ion du type de connex i t é c h o i s i par l ' u t i l i s a t e u rconnex i t e=get ( handles . conChois i , ' S t r ing ' ) ;l a p l a c i e n=im2double ( z e r o s ( 3 , 3 ) ) ;switch connex i t e

case '4−Con 'l a p l a c i e n = [0 , 1 , 0 ; 1 , −4 , 1 ; 0 , 1 , 0 ] ;

case '8−Con 'l a p l a c i e n = [1 , 1 , 1 ; 1 , −8 , 1 ; 1 , 1 , 1 ] ;

o therw i s e% Code for when there i s no match .

endimgContour=im f i l t e r ( I4 , l a p l a c i e n ) ;%Construct ion des histogrammesh i s toEnt ree=imhis t ( I4 ) ;h i s t o S o r t i e=imhi s t ( imgContour ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( I4 ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgContour ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Cette fonction est très similaire aux fonctions de détection précédentes. Après avoir récupéré le type deconnexité choisi pour le �ltre, nous construisons ce dernier dans la variable 'laplacien'. Nous appliquons ensuitece �ltre à l'image par convolution à l'aide de la fonction im�lter.

Pour réaliser une détection de contours à l'aide du �ltre Laplacien, il nous su�t désormais de cliquer sur lebouton �Filtre Laplacien� de l'interface présentée un peu plus tôt dans ce dossier en ayant au préalable choisila connexité du �ltre et éventuellement ajouté un bruit à l'aide de la case à cocher.

Avec un �ltre Laplacien 4-connexe, le résultat obtenu est le suivant :

104

Page 105: Dossier

Figure 109 � Détection de contours à l'aide du �ltre Laplacien 4-connexe (aucun bruit)

Avec un �ltre Laplacien 8-connexe, le résultat obtenu est le suivant :

Figure 110 � Détection de contours à l'aide du �ltre Laplacien 8-connexe (aucun bruit)

Avec un �ltre Laplacien 8-connexe et un bruit �sel et poivre�, le résultat obtenu est le suivant :

105

Page 106: Dossier

Figure 111 � Détection de contours à l'aide du �ltre Laplacien 8-connexe (bruit 'sel et poivre')

Avec un �ltre Laplacien 8-connexe et un bruit gaussien, le résultat obtenu est le suivant :

Figure 112 � Détection de contours à l'aide du �ltre Laplacien 8-connexe (bruit gaussien)

Avec un �ltre Laplacien 8-connexe et un bruit de Poisson, le résultat obtenu est le suivant :

106

Page 107: Dossier

Figure 113 � Détection de contours à l'aide du �ltre Laplacien 8-connexe (bruit de Poisson)

Le �ltre Laplacien permet une détection de contour très correcte. Nous pouvons noter que le �ltre 8-connexeproduit des contours plus nettes que le �ltre 4-connexe. Pour �nir, nous pouvons voir ce type de �ltres neconvient pas lorsque l'image en entrée est bruitée.

5.1.7 Seuillage par hystérésis

Nous allons terminer notre étude des méthodes de détection de contours par le seuillage par hystéresis. Cetteméthode ne constitue pas une fonction de détection de contours à proprement parler car elle s'appuie sur lesfonctions vues précédemment. En e�et, le seuillage par hystéresis s'appuie sur une image ayant déjà subi untraitement permettant le calcul du gradient ou du laplacien. Dans notre cas, nous partirons d'une image traitépar un �ltre Laplacien. Le seuillage par hystéresis se déroule de la manière suivante :

� Étape 1 : Initialisation de l'image résultat.� Étape 2 : Identi�cation des pixels ayant une valeur de Laplacien supérieur au seuil haut (dé�ni manuelle-ment). Ces pixels sont stockés en mémoire dans une pile ou une �le. On �xe leur valeur à 1 (ou 255) dansl'image résultat.

� Étape 3 : Parcours de la pile/�le. Pour chaque pixel de la structure, on observe les pixels voisins (il est né-cessaire de déterminer ce que l'on entend par voisinage (distance de Manhattan ou autre) avant de réaliserce traitement). Si un pixel voisin a une valeur du Laplacien supérieure au seuil bas (dé�ni manuellement),on �xe sa valeur à 1 (ou 255) dans l'image résultat et on l'ajoute à la pile/�le. On poursuit ainsi jusqu'àl'épuisement de la pile/�le.

La fonction suivante permet de détecter les contours à l'aide du seuillage par hystéresis :

107

Page 108: Dossier

Algorithme 37 Fonction de détection de contours à l'aide du seuillage par hystéresis

%Fonction chargée de s e u i l l e r l ' image courante à l ' a ide d 'un s e u i l l a g e par%hy s t é r é s i sf unc t i on s e u i l l a g eHy s t e r e s i s ( hObject , eventdata , handles , imgContour )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;%Créat ion de l ' image de s o r t i eimgSeui l=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;%Récupérat ion des s e u i l ss eu i lH=str2num ( get ( handles . seu i lHaut , ' S t r ing ' ) ) ;s eu i lB=str2num ( get ( handles . s eu i lBas , ' S t r ing ' ) ) ;%Créat ion d ' une p i l e u t i l i s é e pour l e s e u i l l a g e ( Stockage des i n d i c e s x )%et y des p i x e l sp i l e=ze ro s ( ( 2 40*320 ) , 2 ) ;i nd i c eHautP i l e =0;%I d e n t i f i c a t i o n des p i x e l s ayant une norme du Laplac i en supé r i eu r e au%s e u i l hautfor i =1: hauteur

for j =1: l a r g eu r%Si l e g rad i ent du Laplac i en du p i x e l e s t supé r i eu r au s e u i l Hi f ( imgContour ( i , j )>seu i lH )

%Mise à 1 du p i x e limgSeui l ( i , j )=255;%Ajout du p i x e l dans l a p i l eind i c eHautP i l e=ind i c eHautP i l e +1;p i l e ( ind iceHautPi l e ,1)= i ;p i l e ( ind iceHautPi l e ,2)= j ;

endend

end%Tant que l a p i l e n ' e s t pas v idewhi l e ( ind iceHautPi l e >=1)

%On dép i l e un p i x e lposY=p i l e ( ind iceHautPi l e , 1 ) ;posX=p i l e ( ind iceHautPi l e , 2 ) ;i nd i c eHautP i l e=ind iceHautPi l e −1;%In spe c t i on du vo i s i n ag ef o r i =(posY−1) :( posY+1)

f o r j=(posX−1) :( posX+1)i f ( ( i~=posY | | j~=posX) && ( i >1 && i<hauteur && j>1 && j<la r g eu r ) )

%Si l e g rad i ent du Laplac i en du p i x e l e s t supé r i eu r au%s e u i l Bi f ( imgContour ( i , j )>seu i lB && imgSeui l ( i , j )~=255)

%Mise à 1 du p i x e limgSeui l ( i , j )=255;%Ajout du p i x e l dans l a p i l eind i c eHautP i l e=ind i c eHautP i l e +1;p i l e ( ind iceHautPi l e ,1)= i ;p i l e ( ind iceHautPi l e ,2)= j ;

endend

endend

end

108

Page 109: Dossier

Algorithme 38 Fonction de détection de contours à l'aide du seuillage par hystéresis (Suite)

%Construct ion des histogrammesh i s toEnt ree=imhis t ( imgContour ) ;h i s t o S o r t i e=imhi s t ( imgSeui l ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( imgContour ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgSeui l ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Après avoir récupéré le seuil haut et bas, nous créons la pile qui sera utilisée dans le traitement. Un tableauest utilisée pour représenter cette structure et une variable numérique est utilisée pour mémoriser l'indice dudernier élément de la pile. Ce tableau est composé de deux colonnes : une colonne pour stocker l'indice en x dupixel et une autre colonne pour stocker l'indice en y. Nous parcourons ensuite l'image à la recherche de pixelsayant une valeur du Laplacien supérieure au seuil haut. On �xe la valeur de ce pixel à 255 sur l'image résultatpuis on ajoute les coordonnées de ce dernier dans la pile.

Nous e�ectuons ensuite la deuxième phase. Celle ci se termine lorsque la pile est vide (boucle while). Nousrécupérons tout d'abord l'élément situé en haut de la pile. Nous inspectons ensuite le voisinage de ce pixel. Siun pixel voisin a une valeur de Laplacien supérieure au seuil bas, on �xe la valeur de ce pixel à 255 sur l'imagerésultat puis on ajoute les coordonnées de ce pixel dans la pile.

Pour réaliser une détection de contours à l'aide du seuillage par hystéresis, il nous su�t désormais de cliquersur le bouton �Seuillage par hystéresis� de l'interface présentée un peu plus tôt dans ce dossier en ayant aupréalable �xé les seuils haut et bas à l'aide des champs textes prévus à cet e�et. Dans les tests ci-dessus, nousutiliserons une image traité par un �ltre Laplacien 8-connexe. L'image à gauche est l'image en sortie du �ltreLaplacien tandis que l'image de droite est l'image résultant du seuillage.

Avec seuil haut de 125 et un seuil bas de 100, le résultat obtenu est le suivant :

109

Page 110: Dossier

Figure 114 � Détection de contours à l'aide du seuillage par hystéresis (seuil haut : 125, seuil bas : 100, aucunbruit)

Avec seuil haut de 100 et un seuil bas de 75, le résultat obtenu est le suivant :

Figure 115 � Détection de contours à l'aide du seuillage par hystéresis (seuil haut : 100, seuil bas : 75, aucunbruit)

Avec seuil haut de 100 et un seuil bas de 25, le résultat obtenu est le suivant :

110

Page 111: Dossier

Figure 116 � Détection de contours à l'aide du seuillage par hystéresis (seuil haut : 100, seuil bas : 25, aucunbruit)

Avec seuil haut de 40 et un seuil bas de 25, le résultat obtenu est le suivant :

Figure 117 � Détection de contours à l'aide du seuillage par hystéresis (seuil haut : 40, seuil bas : 25, aucunbruit)

Avec seuil haut de 100, un seuil bas de 25 et un bruit �sel et poivre�, le résultat obtenu est le suivant :

111

Page 112: Dossier

Figure 118 � Détection de contours à l'aide du seuillage par hystéresis (seuil haut : 100, seuil bas : 25, bruit�sel et poivre�)

Avec seuil haut de 100, un seuil bas de 25 et un bruit gaussien, le résultat obtenu est le suivant :

Figure 119 � Détection de contours à l'aide du seuillage par hystéresis (seuil haut : 100, seuil bas : 25, bruitgaussien)

Avec seuil haut de 100, un seuil bas de 25 et un bruit de Poisson, le résultat obtenu est le suivant :

112

Page 113: Dossier

Figure 120 � Détection de contours à l'aide du seuillage par hystéresis (seuil haut : 100, seuil bas : 25, bruitde Poisson)

On peut voir que le seuillage par hystéresis est particulièrement e�cace lorsque les seuils sont bien réglés.Un seuil haut assez élevé permet de détecter seulement les vrais contours lors de la première phase en excluantles parasites. La seconde phase se contente ainsi de prolonger ces contours. Un seuil bas assez faible permetde prolonger les contours trouvés dans la première phase. On peut voir qu'un seuil haut trop bas laisse passerbeaucoup de parasites. En�n, nous pouvons voir que le seuillage par hystéresis supporte très mal le bruit. Cedernier constat était prévisible étant donné que le seuillage par hystéresis se base sur le �ltre Laplacien, résistantlui même assez mal au bruit.

5.2 Segmentation à l'aide de la méthode d'agrégation de pixels

Nous allons terminer ce dossier par l'étude d'une méthode de segmentation. La segmentation est utiliséepour retrouver et identi�er les objets d'une image en partitionnant cette dernière en zone homogènes. Les objetsd'une image répondent à plusieurs caractéristiques :

� Ils sont connexes (L'objet est constitué d'un seul et unique morceau).� Ils ont une couleur et une texture cohérente.� Ils sont délimités par des contours nets.

Pour identi�er les objets d'une image, plusieurs approches peuvent être utilisés :

� Les segmentations basées sur les contours : dans cette approche, on cherche à trouver les frontières dechacun des objets pour les identi�er. Pour que cette technique soit e�cace, il est nécessaire d'utiliser destechniques de reconstructions de contours (fermeture de contours) car ces derniers sont souvent peu précisou morcelés.

� Les segmentations basées sur les régions : Cette approche regroupe notamment des techniques comme lacroissance de région ou le spilt and merge. L'idée principale de cette approche est de placer dans l'imagedes germes (choisir des pixels) puis de faire grossir des régions homogènes à partir de ces derniers.

� Il existe également des méthodes de segmentations basés sur les histogrammes, des segmentations hybridess'appuyant sur plusieurs approches etc etc

Dans cette partie, nous aurons recours à l'approche basées sur les régions et plus précisément, la méthode d'agré-gation de pixels. Le principe de cette méthode est de regrouper les pixels connexes semblables en se basant sur

113

Page 114: Dossier

deux paramètres :

� Un critère d'adjacence : dé�nition du voisinage considéré pour chaque pixel de l'image : 4-connexité ou8-connexité (Dans notre cas, nous utiliserons la 8-connexité).

� Un critère d'homogénéité : dé�nition d'une distance entre deux pixels voisins. Plusieurs critères d'homo-généité seront utilisés dans notre étude.

Après avoir dé�ni ces deux critères, on dé�nit un seuil S qui sera utilisé comme comparaison avec le critèred'homogénéité. On place ensuite un germe dans l'image. Ce dernier est placé d'une manière aléatoire ou bienen utilisant les valeurs des gradient des pixels (Cette dernière méthode évite de placer le germe sur un contour).Le germe ainsi choisi reçoit une étiquette. Cette étiquette permet d'identi�er la région en cours de traitement.A terme, chaque région de l'image aura une étiquette di�érente. On cherche ensuite à faire croître la taille de larégion du germe. Pour cela, on recherche dans le voisinage du germe (dé�ni par le critère d'adjacence) des pixelsayant une distance (dé�ni par le critère d'homogénéité) inférieure au seuil. Si ces pixels respecte ce critère, ilsont ajouté à la région et nous appliquons ensuite la même méthode sur leur voisinage. Lorsque tous les pixelssusceptibles d'être intégré à la région ont été observés, on place un nouveau germe dans une partie de l'imagenon étiqueté puis on recommence le processus.

Nous allons tout d'abord présenté une fonction permettant de réaliser une agrégation de pixels utilisant lecritère d'homogénéité suivant :

d(E,A) = |gris(E)− gris(A)|avec gris(E) le niveau de gris du pixel E d'ores et déjà dans la région et gris(A) le niveau de gris du pixel

candidat à l'incorporation dans la région.

114

Page 115: Dossier

Algorithme 39 Fonction d'agrégation de pixels selon la distance simple

%Fonction chargée d ' i d e n t i f i e r l e s r é g i on s de l ' image à l ' a ide de l a%méthode d ' ag r éga t i on s de p i x e l s ( c r i t è r e d ' homogénéité=d i s t anc e s imple )func t i on ag r ega t i onP ixe l sS imp l e ( hObject , eventdata , handles , img , imgGradient )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;%Récupérat ion du s e u i ls e u i l=str2num ( get ( handles . s eu i lAgregat i on , ' S t r ing ' ) ) ;%Créat ion de l ' image de s o r t i eimgRegion=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;a r r e t =0;%Et ique t t e des r é g i on se t i q u e t t e =1;%On recherche un germegermeX=0;germeY=0;f o r i =1: hauteur

f o r j =1: l a r g eu r%Si l e p i x e l n ' e s t pas é t i qu e t é et que son grad i en t e s t%i n f é r i e u r à 50 , i l peut ê t r e u t i l i s é comme germei f ( imgRegion ( i , j )==0)% && imgGradient ( i , j )<50)

germeY=i ;germeX=j ;

endend

endwhile ( a r r e t==0)

%Traitement de l a r ég i on%Créat ion d ' une p i l e u t i l i s é e pour s t o cke r l e s p i x e l s de l a r ég i on%non v i s i t ép i l e=ze ro s ( ( hauteur * l a r g eu r ) , 2 ) ;i nd i c eHautP i l e =0;ind i c eHautP i l e=ind i c eHautP i l e +1;p i l e ( ind iceHautPi l e ,1)=germeY ;p i l e ( ind iceHautPi l e ,2)=germeX ;imgRegion (germeY , germeX)= e t i q u e t t e ;%Tant que l a p i l e n ' e s t pas v idewhile ( ind iceHautPi l e >=1)

%On dép i l e un p i x e lposY=p i l e ( ind iceHautPi l e , 1 ) ;posX=p i l e ( ind iceHautPi l e , 2 ) ;i nd i c eHautP i l e=ind iceHautPi l e −1;for i =(posY−1) :( posY+1)

for j=(posX−1) :( posX+1)i f ( i>=1 && i<=hauteur && j>=1 && j<=la r g eu r )

d i s t ance=f l o o r ( abs ( img ( i , j )−img (posY , posX ) ) ) ;i f ( ( imgRegion ( i , j )==0) && ( di s tance<s e u i l ) )

ind i c eHautP i l e=ind i c eHautP i l e +1;p i l e ( ind iceHautPi l e ,1)= i ;p i l e ( ind iceHautPi l e ,2)= j ;imgRegion ( i , j )= e t i q u e t t e ;

endend

endend

end

115

Page 116: Dossier

Algorithme 40 Fonction d'agrégation de pixels selon la distance simple (Suite)

%On recherche un germegermeX=0;germeY=0;for i =1: hauteur

for j =1: l a r g eu r%Si l e p i x e l n ' e s t pas é t i qu e t é et que son grad i en t e s t%i n f é r i e u r à 10 , i l peut ê t r e u t i l i s é comme germei f ( imgRegion ( i , j )==0)% && imgGradient ( i , j )<50)

germeY=i ;germeX=j ;

endend

end%Si aucun germe n ' a pu ê t r e trouvé , on stoppe l e t ra i t ementi f ( germeY==0 | | germeX==0)

a r r e t =1;else

e t i q u e t t e=e t i q u e t t e +1;endend%Construct ion des histogrammesh i s toEnt ree=imhis t ( img ) ;h i s t o S o r t i e=imhi s t ( imgRegion ) ;%Ajout de cou l eu r s pour d i f f é r e n c i e r l e s r é g i on simgRegion=labe l 2 r gb ( imgRegion ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( img ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgRegion ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

La fonction d'agrégation prend en paramètre l'image acquise ainsi que le résultat de la fonction permettantde calculer le gradient simple de l'image. Nous commençons tout d'abord par récupérer la dimension de l'imageet le seuil saisi par l'utilisateur. Nous initialisons ensuite une variable nommée étiquette à 1. Cette variable serautilisé pour étiqueter les di�érentes régions de l'image.

Nous parcourons ensuite l'image à la recherche d'un germe. Pour cela, nous cherchons un pixel non étiqueté(valeur du pixel dans l'image résultat imgRegion égale à zéro) ayant une valeur de gradient faible pour éviterd'obtenir un pixel appartenant à un contour. Après avoir choisi le premier germe, nous démarrons une boucle.Cette dernière se termine lorsque tous les pixels de l'image ont été étiquetés. A l'instar du seuillage par hys-térésis, une pile est utilisé pour stocker les pixels à étudier. Lors de la première itération, cette pile contientseulement le germe. On inspecte donc le voisinage de ce germe à l'aide de deux boucles for. Pour chaque pixelde ce voisinage, nous véri�ons tout d'abord que les coordonnées du voisin ne sont pas en dehors de l'image.Ce cas se produit lorsque le pixel de la pile étudié est en bordure d'images. Dans le cas où le voisin est biendans l'image, nous calculons la distance entre ce pixel et le pixel de la pile. Pour ce critère d'homogénéité, noussoustrayons simplement la valeur du pixel voisin à la valeur du pixel de la pile. Dans le cas où cette distance estinférieure au seuil et que le pixel voisin n'est pas déjà étiqueté, nous ajoutons ce dernier à la région en �xant lavaleur de ce pixel dans l'image imgRegion avec la valeur de l'étiquette. On ajoute ensuite ce pixel dans la pilepour que son voisinage soit étudié par la suite.

116

Page 117: Dossier

Lorsque la pile est vide, nous recherchons alors un nouveau germe et nous augmentons la valeur de l'étiquettede un pour démarrer l'agrégation d'une nouvelle région de l'image. Si aucun germe n'a été trouvé (tous les pixelsde l'image font partie d'une région), nous stoppons le traitement.

Pour réaliser une segmentation à l'aide de la méthode d'agrégation de pixels avec ce critère d'homogénéité,il nous su�t désormais de cliquer sur le bouton �Agrégation de pixels� de l'interface présentée un peu plus tôtdans ce dossier en ayant au préalable sélectionné le critère d'homogénéité �Distance simple� à l'aide des boutonsradios et �xé le seuil à l'aide du champ de saisie prévu à cet e�et.

Avec seuil de 20, le résultat obtenu est le suivant :

Figure 121 � Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :20)

Avec seuil de 15, le résultat obtenu est le suivant :

117

Page 118: Dossier

Figure 122 � Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :15)

Avec seuil de 10, le résultat obtenu est le suivant :

Figure 123 � Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :10)

Avec seuil de 5, le résultat obtenu est le suivant :

118

Page 119: Dossier

Figure 124 � Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :5)

Nous pouvons voir que plus le seuil diminue, plus le nombre de régions identi�és est important. Un seuil égaleà dix permet d'obtenir une identi�cation optimale. Dans cette con�guration, la majorité des régions principalesde l'image sont identi�ées. Nous constatons que si le seuil est trop élevé, le traitement a tendance à créer denombreuses régions �parasites� et l'identi�cation n'est alors pas exploitable.

Nous allons maintenant présenté une fonction permettant de réaliser une agrégation de pixels utilisant lecritère d'homogénéité suivant :

d(E,Ri) = |gris(E)− µR|avec gris(E) le niveau de gris du pixel E candidat à l'incorporation dans la région et µR la moyenne des

intensités des pixels appartenant à la région.

119

Page 120: Dossier

Algorithme 41 Fonction d'agrégation de pixels selon la moyenne de région

%Fonction chargée d ' i d e n t i f i e r l e s r é g i on s de l ' image à l ' a ide de l a%méthode d ' ag r éga t i on s de p i x e l s ( c r i t è r e d ' homogénéité=moyenne )func t i on agregat ionPixe lsMoyenne ( hObject , eventdata , handles , img , imgGradient )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;%Récupérat ion du s e u i ls e u i l=str2num ( get ( handles . s eu i lAgregat i on , ' S t r ing ' ) ) ;%Créat ion de l ' image de s o r t i eimgRegion=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;a r r e t =0;%Et ique t t e des r é g i on se t i q u e t t e =1;%On recherche un germegermeX=0;germeY=0;f o r i =1: hauteur

f o r j =1: l a r g eu r%Si l e p i x e l n ' e s t pas é t i qu e t é et que son grad i en t e s t%i n f é r i e u r à 50 , i l peut ê t r e u t i l i s é comme germei f ( imgRegion ( i , j )==0)% && imgGradient ( i , j )<50)

germeY=i ;germeX=j ;

endend

endwhile ( a r r e t==0)

%Traitement de l a r ég i on%Créat ion d ' une p i l e u t i l i s é e pour s t o cke r l e s p i x e l s de l a r ég i on%non v i s i t ép i l e=ze ro s ( ( 2 40*320 ) , 2 ) ;i nd i c eHautP i l e =0;%Créat ion d 'un tab leau de stockage des va l eu r s des i n t e n s i t é s des%p i x e l s de l a r ég i on en vue du c a l c u l de l a moyennei n t e n s i t e =1: (240*320) ;nbreValeurs=1;%Ajout du germe dans l a p i l eind i c eHautP i l e=ind i c eHautP i l e +1;p i l e ( ind iceHautPi l e ,1)=germeY ;p i l e ( ind iceHautPi l e ,2)=germeX ;moyenne=img (germeY , germeX ) ;i n t e n s i t e ( nbreValeurs )=img (germeY , germeX ) ;imgRegion (germeY , germeX)= e t i q u e t t e ;%Tant que l a p i l e n ' e s t pas v idewhi l e ( ind iceHautPi l e >=1)

%On dép i l e un p i x e lposY=p i l e ( ind iceHautPi l e , 1 ) ;posX=p i l e ( ind iceHautPi l e , 2 ) ;i nd i c eHautP i l e=ind iceHautPi l e −1;f o r i =(posY−1) :( posY+1)

f o r j=(posX−1) :( posX+1)i f ( i>=1 && i<hauteur && j>=1 && j<la r g eu r )

d i s t ance=abs ( img ( i , j )−moyenne ) ;i f ( ( imgRegion ( i , j )==0) && ( di s tance<s e u i l ) )

ind i c eHautP i l e=ind i c eHautP i l e +1;p i l e ( ind iceHautPi l e ,1)= i ;p i l e ( ind iceHautPi l e ,2)= j ;nbreValeurs=nbreValeurs+1;i n t e n s i t e ( nbreValeurs )=img (germeY , germeX ) ;%Calcu l de l a nouve l l e moyenneintens iteTemp=1: nbreValeurs ;f o r k=1: nbreValeurs

intens iteTemp (k)= i n t e n s i t e ( k ) ;endmoyenne=f l o o r (mean( intensiteTemp ) ) ;imgRegion ( i , j )= e t i q u e t t e ;

endend

end

120

Page 121: Dossier

Algorithme 42 Fonction d'agrégation de pixels selon la moyenne de région (Suite)

endend%On recherche un germegermeX=0;germeY=0;for i =1: hauteur

for j =1: l a r g eu r%Si l e p i x e l n ' e s t pas é t i qu e t é et que son grad i en t e s t%i n f é r i e u r à 50 , i l peut ê t r e u t i l i s é comme germei f ( imgRegion ( i , j )==0)% && imgGradient ( i , j )<50)

germeY=i ;germeX=j ;

endend

end%Si aucun germe n ' a pu ê t r e trouvé , on stoppe l e t ra i t ementi f ( germeY==0 | | germeX==0)

a r r e t =1;else

e t i q u e t t e=e t i q u e t t e +1;endend%Construct ion des histogrammesh i s toEnt ree=imhis t ( img ) ;h i s t o S o r t i e=imhi s t ( imgRegion ) ;%Ajout de cou l eu r s pour d i f f é r e n c i e r l e s r é g i on simgRegion=labe l 2 r gb ( imgRegion ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( img ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgRegion ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

Cette fonction est très similaire à la fonction précédente. Un tableau nommé intensité est utilisé pour stockerles valeurs des intensités des pixels de la région. On stocke également le nombre de valeurs présentes dans cetableau à l'aide d'un compteur. Lorsqu'un pixel est ajouté à la région, nous ajoutons sa valeur dans le tableau.Nous recalculons ensuite la moyenne du tableau à l'aide de la fonction mean. La moyenne est utilisée pourcalculer la distance séparant le pixel étudié de la région en cours d'agrégation.

Pour réaliser une segmentation à l'aide de la méthode d'agrégation de pixels avec ce critère d'homogénéité,il nous su�t désormais de cliquer sur le bouton �Agrégation de pixels� de l'interface présentée un peu plustôt dans ce dossier en ayant au préalable sélectionné le critère d'homogénéité �Moyenne de région� à l'aide desboutons radios et �xé le seuil à l'aide du champ de saisie prévu à cet e�et.

Avec seuil de 20, le résultat obtenu est le suivant :

121

Page 122: Dossier

Figure 125 � Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :20)

Avec seuil de 15, le résultat obtenu est le suivant :

Figure 126 � Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :15)

Avec seuil de 10, le résultat obtenu est le suivant :

122

Page 123: Dossier

Figure 127 � Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :10)

Avec seuil de 5, le résultat obtenu est le suivant :

Figure 128 � Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :5)

L'utilisation de la moyenne comme critère d'homogénéité permet d'obtenir un résultat très satisfaisant, bienque di�érent des résultats obtenus avec le critère d'homogénéité di�érent. Nous pouvons voir que même en casde seuil trop bas, aucune région parasite n'apparaît dans le résultat de la segmentation. Nous pouvons égale-ment noter que ce critère d'homogénéité identi�e même des régions ayant un faible contraste entre elles. C'est

123

Page 124: Dossier

notamment le cas du fond blanc de l'image dont les parties béné�cient d'un éclairage di�érent.

Pour �nir, nous allons présenté une fonction permettant de réaliser une agrégation de pixels utilisant undernier critère d'homogénéité :

min(|gris(x)− gris(p)|) < seuil|gris(p)− µR| < 2σRavec gris(p) le niveau de gris du pixel p candidat à l'incorporation dans la région, gris(x) le niveau de gris

du pixel x d'ores et déjà dans la région, µR la moyenne des intensités des pixels appartenant à la région etσRl'écart type de la région.

124

Page 125: Dossier

Algorithme 43 Fonction d'agrégation de pixels selon la moyenne et l'écart type de région

%Fonction chargée d ' i d e n t i f i e r l e s r é g i on s de l ' image à l ' a ide de l a%méthode d ' ag r éga t i on s de p i x e l s ( c r i t è r e d ' homogénéité=éca r t type )func t i on ag r ega t i onP ixe l sEca r t ( hObject , eventdata , handles , img , imgGradient )

%Récupérat ion des dimensions de l ' imagehauteur=str2num ( get ( handles . hauteur , ' S t r ing ' ) ) ;l a r g eu r=str2num ( get ( handles . l a rgeur , ' S t r ing ' ) ) ;%Récupérat ion du s e u i ls e u i l=str2num ( get ( handles . s eu i lAgregat i on , ' S t r ing ' ) ) ;%Créat ion de l ' image de s o r t i eimgRegion=im2uint8 ( z e ro s ( hauteur , l a r g eu r ) ) ;a r r e t =0;%Et ique t t e des r é g i on se t i q u e t t e =1;%On recherche un germegermeX=0;germeY=0;f o r i =1: hauteur

f o r j =1: l a r g eu r%Si l e p i x e l n ' e s t pas é t i qu e t é et que son grad i en t e s t%i n f é r i e u r à 50 , i l peut ê t r e u t i l i s é comme germei f ( imgRegion ( i , j )==0)% && imgGradient ( i , j )<50)

germeY=i ;germeX=j ;

endend

endwhile ( a r r e t==0)

%Traitement de l a r ég i on%Créat ion d ' une p i l e u t i l i s é e pour s t o cke r l e s p i x e l s de l a r ég i on%non v i s i t ép i l e=ze ro s ( ( 2 40*320 ) , 2 ) ;i nd i c eHautP i l e =0;%Créat ion d 'un tab leau de stockage des va l eu r s des i n t e n s i t é s des%p i x e l s de l a r ég i on en vue du c a l c u l de l a moyennei n t e n s i t e =1: (240*320) ;nbreValeurs=1;%Ajout du germe dans l a p i l eind i c eHautP i l e=ind i c eHautP i l e +1;p i l e ( ind iceHautPi l e ,1)=germeY ;p i l e ( ind iceHautPi l e ,2)=germeX ;moyenne=img (germeY , germeX ) ;ecartType=5000;i n t e n s i t e ( nbreValeurs )=img (germeY , germeX ) ;imgRegion (germeY , germeX)= e t i q u e t t e ;%Tant que l a p i l e n ' e s t pas v idewhi l e ( ind iceHautPi l e >=1)

%On dép i l e un p i x e lposY=p i l e ( ind iceHautPi l e , 1 ) ;posX=p i l e ( ind iceHautPi l e , 2 ) ;i nd i c eHautP i l e=ind iceHautPi l e −1;f o r i =(posY−1) :( posY+1)

f o r j=(posX−1) :( posX+1)i f ( i>=1 && i<hauteur && j>=1 && j<la r g eu r )

d i s t ance1=abs ( img ( i , j )−img (posY , posX ) ) ;d i s t ance2=img ( i , j )−moyenne ;i f ( ( imgRegion ( i , j )==0) && ( di s tance1<s e u i l ) && ( di s tance2 <(2* ecartType ) ) )

ind i c eHautP i l e=ind i c eHautP i l e +1;p i l e ( ind iceHautPi l e ,1)= i ;p i l e ( ind iceHautPi l e ,2)= j ;nbreValeurs=nbreValeurs+1;i n t e n s i t e ( nbreValeurs )=img (germeY , germeX ) ;%Calcu l de l a nouve l l e moyenne et de l ' é c a r t typeintens iteTemp=1: nbreValeurs ;

125

Page 126: Dossier

Algorithme 44 Fonction d'agrégation de pixels selon la moyenne et l'écart type de région (Suite)

for k=1: nbreValeursintens iteTemp (k)= i n t e n s i t e ( k ) ;

endmoyenne=f l o o r (mean( intensiteTemp ) ) ;ecartType=c e i l ( s td ( intens iteTemp ) ) ;i f ( ecartType==0)

ecartType=5000;endimgRegion ( i , j )= e t i q u e t t e ;endendendendend%On recherche un germegermeX=0;germeY=0;for i =1: hauteur

for j =1: l a r g eu r%Si l e p i x e l n ' e s t pas é t i qu e t é et que son grad i en t e s t%i n f é r i e u r à 10 , i l peut ê t r e u t i l i s é comme germei f ( imgRegion ( i , j )==0)% && imgGradient ( i , j )<10)

germeY=i ;germeX=j ;

endend

end%Si aucun germe n ' a pu ê t r e trouvé , on stoppe l e t ra i t ementi f ( germeY==0 | | germeX==0)

a r r e t =1;else

e t i q u e t t e=e t i q u e t t e +1;endend%Construct ion des histogrammesh i s toEnt ree=imhis t ( img ) ;h i s t o S o r t i e=imhi s t ( imgRegion ) ;%Ajout de cou l eu r s pour d i f f é r e n c i e r l e s r é g i on simgRegion=labe l 2 r gb ( imgRegion ) ;%Af f i chageaxes ( handles . axes1 ) ;subimage ( img ) ;y l ab e l ( ' Image en ent r é e ' ) ;axes ( handles . axes2 ) ;p l o t ( h i s toEnt ree ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;axes ( handles . axes3 ) ;subimage ( imgRegion ) ;y l ab e l ( ' Image en s o r t i e ' ) ;axes ( handles . axes4 ) ;p l o t ( h i s t o S o r t i e ) ;x l ab e l ( ' Niveau de g r i s ' ) ;y l ab e l ( ' Quantité de p i x e l s ' ) ;

En plus de la moyenne, nous calculons également l'écart-type du tableau d'intensités de la région. Cettevaleur est calculée à l'aide de la fonction std. L'écart type et la moyenne sont ensuite utilisés pour le critèred'homogénéité selon les formules présentées précédemment.

Pour réaliser une segmentation à l'aide de la méthode d'agrégation de pixels avec ce critère d'homogénéité,il nous su�t désormais de cliquer sur le bouton �Agrégation de pixels� de l'interface présentée un peu plus tôtdans ce dossier en ayant au préalable sélectionné le critère d'homogénéité �Écart type� à l'aide des boutons

126

Page 127: Dossier

radios et �xé le seuil à l'aide du champ de saisie prévu à cet e�et.

Avec seuil de 20, le résultat obtenu est le suivant :

Figure 129 � Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :20)

Avec seuil de 15, le résultat obtenu est le suivant :

Figure 130 � Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :15)

127

Page 128: Dossier

Avec seuil de 10, le résultat obtenu est le suivant :

Figure 131 � Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :10)

Avec seuil de 5, le résultat obtenu est le suivant :

Figure 132 � Segmentation à l'aide de la méthode d'agrégation de pixels (seuil :5)

Ce critère d'homogénéité ne permet pas d'obtenir autant de régions que pour les critères précédents. De pluset à l'instar du premier critère, on note l'apparition de régions parasites en cas de seuil trop bas.

128

Page 129: Dossier

6 Conclusion

Cette série de travaux pratiques nous a permis de nous initier à de nombreuses techniques de traitementsd'images. Ces travaux ont été l'occasion d'étudier une partie du cycle de vie d'une image. Partant de l'acqui-sition de l'image, nous avons pu ensuite nous essayer à l'amélioration d'images à l'aide des histogrammes, à larestauration d'images à l'aide des �ltres de bruit et de �ou. Par la suite, nous avons étudié des traitements deplus haut niveau tel que les traitements de détection de contours ou de segmentation d'images. Nous avons ainsiacquis une vision globale de ce domaine. Ces travaux pratiques nous ont également permis d'apprendre à dé-velopper des applications graphiques avec Matlab. Nous avons pu voir que cette plate-forme était parfaitementadaptée aux problèmes de traitements d'images.

129