Sie sind auf Seite 1von 129

Universit de Bourgogne 1re anne de Master Informatique STIC Parcours Informatique Travaux pratiques Traitement d'images

Benjamin Harbelot-Yoan Chabot 2010-2011

Rsum
Ce dossier a pour vocation de prsenter le travail eectu dans le cadre des travaux pratiques de Traitement d'images. Ce dossier prsente les rsultats obtenues pour les dirents exercices proposs au cours du semestre.

Table des matires


1 Introduction 2 Matlab et le traitement d'images
2.1 Initiation Matlab . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Cration d'une interface graphique . . . . . . . . . . . 2.1.2 Cration de fonctions et de gestionnaires d'vnements 2.2 Acquisition et traitement d'images sous Matlab . . . . . . . . 2.3 Mise en place du squelette de l'application . . . . . . . . . . . 3.1 Histogramme . . . . . . . . . . . . . 3.1.1 Utilisation de imhist . . . . . 3.1.2 Algorithme maison . . . . . . 3.2 Inversion . . . . . . . . . . . . . . . . 3.3 Binarisation . . . . . . . . . . . . . . 3.3.1 Binarisation paramtrable . . 3.3.2 Binarisation selon la mthode 3.4 Quantication . . . . . . . . . . . . . 3.5 Amlioration d'images . . . . . . . . 3.5.1 tirement d'histogrammes . . 3.5.2 galisation d'histogrammes . 4.1 Types de bruits . . . . . . . . 4.1.1 Bruit sel et poivre . . 4.1.2 Bruit Gaussien . . . . 4.1.3 Bruit de Poisson . . . 4.1.4 Mise en place du bruit 4.2 Filtre mdian . . . . . . . . . 4.2.1 Utilisation de medlt2 4.2.2 Algorithme maison . . 4.3 Filtre moyenneur . . . . . . . 4.3.1 Utilisation de imlter 4.3.2 Algorithme maison . . 4.4 Flou et ltre de Wiener . . . 4.4.1 Flou . . . . . . . . . . 4.4.2 Filtre de Wiener . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . d'Otsu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

7
. 7 . 7 . 8 . 8 . 10 . . . . . . . . . . . . . . . . . . . . . . . . .

3 Histogramme, binarisation et quantication

15

15 16 17 19 21 21 25 26 32 32 34 37 37 38 39 40 41 42 55 56 56 66 67 67 68

4 Filtrages de bruit et de ou

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . sous Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

37

5 Dtection de contours et segmentation d'images

5.1 Dtection de contours . . . . . . . . . . . . . . . . . . . . . 5.1.1 Gradient Simple . . . . . . . . . . . . . . . . . . . . 5.1.2 Gradient de Roberts . . . . . . . . . . . . . . . . . . 5.1.3 Filtre de Prewitt . . . . . . . . . . . . . . . . . . . . 5.1.4 Filtre de Sobel . . . . . . . . . . . . . . . . . . . . . 5.1.5 Filtre de Canny . . . . . . . . . . . . . . . . . . . . . 5.1.6 Filtre Laplacien . . . . . . . . . . . . . . . . . . . . . 5.1.7 Seuillage par hystrsis . . . . . . . . . . . . . . . . 5.2 Segmentation l'aide de la mthode d'agrgation de pixels

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

. . . . . . . . .

73 73 79 85 90 96 102 107 113

73

6 Conclusion

129

Table des gures


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 GUIDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 8 8 9 10 17 19 21 23 23 24 24 26 29 30 30 31 31 32 34 36 38 39 40 42 44 45 45 46 46 47 47 48 48 49 50 50 51 51 52 53 53 54 54 56 58 59 59 60 61 61 62 62 63 64 64 65 65 68 Visualisation des adaptateurs Visualisation des informations concernant l'adaptateur winvideo Mise en place de l'interface Achage de l'histogramme Inversion d'images

Visualisation des informations concernant les formats supports par le priphrique d'acquisition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Achage de l'histogramme (imhist)

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Binarisation d'images paramtrable (seuil=50) Binarisation d'images paramtrable (seuil=90)

Binarisation d'images paramtrable (seuil=120) . . . . . . . . . . . . . . . . . . . . . . . . . . . . Binarisation d'images paramtrable (seuil=150) . . . . . . . . . . . . . . . . . . . . . . . . . . . . Binarisation d'images selon la mthode d'Otsu . . . . . . . . . . . . . . . . . . . . . . . . . . . . Quantication d'images (niveaux de gris=3) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Quantication d'images (niveaux de gris=5) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Quantication d'images (niveaux de gris=10) Quantication d'images (niveaux de gris=25) Quantication d'images (niveaux de gris=50) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Fonction de transformation pour l'tirement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . tirement d'histogrammes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . galisation d'histogrammes Bruit sel et poivre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Bruit gaussien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Bruit suivant la loi de Poisson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonctionnement d'un ltre mdian . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Filtre mdian sur un bruit sel et poivre (densit : 0.005, 1 passe, taille 3x3)

Filtre mdian sur un bruit sel et poivre (densit : 0.05, 1 passe, taille 3x3) . . . . . . . . . . . . Filtre mdian sur un bruit sel et poivre (densit : 0.5, 1 passe, taille 3x3) . . . . . . . . . . . . . Filtre mdian sur un bruit sel et poivre (densit : 0.5, 1 passe, taille 7x7) . . . . . . . . . . . . . Filtre mdian sur un bruit sel et poivre (densit : 0.5, 1 passe, taille 7x7) . . . . . . . . . . . . . Filtre mdian sur un bruit sel et poivre (densit : 0.5, 2 passes, taille 3x3) . . . . . . . . . . . . Filtre mdian sur un bruit sel et poivre (densit : 0.5, 5 passes, taille 3x3) . . . . . . . . . . . . Filtre mdian sur un bruit sel et poivre (densit : 0.5, 10 passes, taille 3x3) Filtre mdian sur un bruit gaussien (variance :0.001, 1 passe, taille 3x3) . . . . . . . . . . . Filtre mdian sur un bruit sel et poivre (densit : 0.5, 2 passes, taille 5x5) . . . . . . . . . . . . . . . . . . . . . . . . . . Filtre mdian sur un bruit gaussien (variance :0.01, 1 passe, taille 3x3) . . . . . . . . . . . . . . . Filtre mdian sur un bruit gaussien (variance :0.05, 1 passe, taille 3x3) . . . . . . . . . . . . . . . Filtre mdian sur un bruit gaussien (variance :0.01, 1 passe, taille 7x7) . . . . . . . . . . . . . . . Filtre mdian sur un bruit gaussien (variance :0.01, 2 passes, taille 3x3) Filtre mdian sur un bruit gaussien (variance :0.01, 2 passes, taille 7x7) . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Filtre mdian sur un bruit de Poisson (1 passe, taille 3x3) . . . . . . . . . . . . . . . . . . . . . . Filtre mdian sur un bruit de Poisson (1 passe, taille 7x7) . . . . . . . . . . . . . . . . . . . . . . Filtre mdian sur un bruit de Poisson (2 passes, taille 3x3) Filtre mdian sur un bruit de Poisson (2 passes, taille 7x7) Fonctionnement d'un ltre moyenneur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Filtre moyenneur sur un bruit (densit : 0.005, 1 passe, taille 3x3) Filtre moyenneur sur un bruit (densit : 0.005, 1 passe, taille 7x7)

Filtre moyenneur sur un bruit (densit : 0.005, 2 passes, taille 3x3) . . . . . . . . . . . . . . . . . Filtre moyenneursur un bruit gaussien (variance :0.001, 1 passe, taille 3x3) . . . . . . . . . . . . . Filtre moyenneur sur un bruit gaussien (variance :0.01, 1 passe, taille 3x3) . . . . . . . . . . . . . Filtre moyenneur sur un bruit gaussien (variance :0.05, 1 passe, taille 3x3) . . . . . . . . . . . . . Filtre moyenneur sur un bruit gaussien (variance :0.01, 1 passe, taille 7x7) . . . . . . . . . . . . . Filtre moyenneur sur un bruit gaussien (variance :0.01, 2 passes, taille 3x3) Filtre moyenneur sur un bruit gaussien (variance :0.01, 2 passes, taille 7x7) . . . . . . . . . . . . . . . . . . . . . . . .

Filtre moyenneur sur un bruit de Poisson (1 passe, taille 3x3) . . . . . . . . . . . . . . . . . . . . Filtre moyenneur sur un bruit de Poisson (1 passe, taille 7x7) . . . . . . . . . . . . . . . . . . . . Filtre moyenneur sur un bruit de Poisson (2 passes, taille 3x3) Filtre moyenneur sur un bruit de Poisson (2 passes, taille 7x7) Flou de mouvement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116

Correction de ou (longueur :15, angle :0, aucun bruit) . . . . . . . . . . . . . . . . . . . . . . . . Correction de ou (longueur :35, angle :0, aucun bruit) . . . . . . . . . . . . . . . . . . . . . . . . Correction de ou (longueur :15, angle :0, bruit sel et poivre) Correction de ou (longueur :15, angle :0, bruit gaussien) Correction de ou (longueur :15, angle :0, bruit de Poisson) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

70 70 71 71 72 72 73 76 76 77 77 78 78 79 80 82 82 83 83 84 84 85 85 87 87 88 88 89 89 90 91 93 93 94 94 95 95 96 97 97 99 99

Correction de ou (longueur :15, angle :45, aucun bruit) . . . . . . . . . . . . . . . . . . . . . . . Principe du gradient Simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dtection de contours l'aide du gradient simple (sans binarisation) . . . . . . . . . . . . . . . . Dtection de contours l'aide du gradient simple (binarisation de seuil 14) Dtection de contours l'aide du gradient simple (binarisation de seuil 8) Dtection de contours l'aide du gradient simple (binarisation de seuil 3) poivre) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Dtection de contours l'aide du gradient simple (binarisation de seuil 14 et un bruit sel et . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dtection de contours l'aide du gradient simple (binarisation de seuil 14 et un bruit gaussien) . Dtection de contours l'aide du gradient simple (binarisation de seuil 14 et un bruit de Poisson) Principe du gradient de Roberts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dtection de contours l'aide du gradient de Roberts (seuil : 0.2) . . . . . . . . . . . . . . . . . . Dtection de contours l'aide du gradient de Roberts (seuil : 0.1) . . . . . . . . . . . . . . . . . . Dtection de contours l'aide du gradient de Roberts (seuil : 0.05) . . . . . . . . . . . . . . . . . Dtection de contours l'aide du gradient de Roberts (seuil : 0.01) . . . . . . . . . . . . . . . . . Dtection de contours l'aide du gradient de Roberts (seuil : 0.05 et bruit sel et poivre) Dtection de contours l'aide du gradient de Roberts (seuil : 0.05 et bruit gaussien) . . . . . . . . . . .

Dtection de contours l'aide du gradient de Roberts (seuil : 0.05 et bruit de Poisson) . . . . . . Principe du ltre de Prewitt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dtection de contours l'aide du ltre de Prewitt (seuil : 0.2) . . . . . . . . . . . . . . . . . . . . Dtection de contours l'aide du ltre de Prewitt (seuil : 0.1) . . . . . . . . . . . . . . . . . . . . Dtection de contours l'aide du ltre de Prewitt (seuil : 0.05) Dtection de contours l'aide du ltre de Prewitt (seuil : 0.01) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Dtection de contours l'aide du ltre de Prewitt (seuil : 0.05 et bruit sel et poivre) Dtection de contours l'aide du ltre de Prewitt (seuil : 0.05 et bruit gaussien)

Dtection de contours l'aide du ltre de Prewitt (seuil : 0.05 et bruit de Poisson) . . . . . . . . Principe du ltre de Sobel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dtection de contours l'aide du ltre de Sobel (seuil : 0.2) . . . . . . . . . . . . . . . . . . . . . Dtection de contours l'aide du ltre de Sobel (seuil : 0.1) . . . . . . . . . . . . . . . . . . . . . Dtection de contours l'aide du ltre de Sobel (seuil : 0.05) Dtection de contours l'aide du ltre de Sobel (seuil : 0.01) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Dtection de contours l'aide du ltre de Sobel (seuil : 0.05 et bruit sel et poivre) Dtection de contours l'aide du ltre de Sobel (seuil : 0.05 et bruit gaussien) Dtection de contours l'aide du ltre de Sobel (seuil : 0.05 et bruit de Poisson) Principe du ltre de Canny Principe du ltre de Canny

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Dtection de contours l'aide du ltre de Canny (seuil : 0.8) Dtection de contours l'aide du ltre de Canny (seuil : 0.4) Dtection de contours l'aide du ltre de Canny (seuil : 0.2)

. . . . . . . . . . . . . . . . . . . . 100 . . . . . . . 101 . . . . . . . 102

Dtection de contours l'aide du ltre de Canny (seuil : 0.03) . . . . . . . . . . . . . . . . . . . . 100 Dtection de contours l'aide du ltre de Canny (seuil : 0.2 et bruit sel et poivre) Dtection de contours l'aide du ltre de Canny (seuil : 0.2 et un bruit de Poisson) Principe du ltre Laplacien 4-connexe Principe du ltre Laplacien 8-connexe Dtection de contours l'aide du ltre de Canny (seuil : 0.2 et un bruit gaussien) . . . . . . . . . 101 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 . . . . . . . . . . . . . 105 . . . . . . . . . . . . . 105

Dtection de contours l'aide du ltre Laplacien 4-connexe (aucun bruit) Dtection de contours l'aide du ltre Laplacien 8-connexe (aucun bruit)

Dtection de contours l'aide du ltre Laplacien 8-connexe (bruit 'sel et poivre') . . . . . . . . . 106 Dtection de contours l'aide du ltre Laplacien 8-connexe (bruit gaussien) . . . . . . . . . . . . 106 Dtection de contours l'aide du ltre Laplacien 8-connexe (bruit de Poisson) . . . . . . . . . . . 107 Dtection de contours l'aide du seuillage par hystresis (seuil haut : 125, seuil bas : 100, aucun bruit) bruit) bruit) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Dtection de contours l'aide du seuillage par hystresis (seuil haut : 100, seuil bas : 75, aucun Dtection de contours l'aide du seuillage par hystresis (seuil haut : 100, seuil bas : 25, aucun

117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132

Dtection de contours l'aide du seuillage par hystresis (seuil haut : 40, seuil bas : 25, aucun bruit) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 Dtection de contours l'aide du seuillage par hystresis (seuil haut : 100, seuil bas : 25, bruit sel et poivre) gaussien) de Poisson) Dtection de contours l'aide du seuillage par hystresis (seuil haut : 100, seuil bas : 25, bruit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 . . . . . . . . . . . . . . . 117 . . . . . . . . . . . . . . . 118 . . . . . . . . . . . . . . . 118 . . . . . . . . . . . . . . . . 119 . . . . . . . . . . . . . . . 122 . . . . . . . . . . . . . . . 122 . . . . . . . . . . . . . . . 123 . . . . . . . . . . . . . . . . 123 . . . . . . . . . . . . . . . 127 . . . . . . . . . . . . . . . 127 . . . . . . . . . . . . . . . 128 . . . . . . . . . . . . . . . . 128 Dtection de contours l'aide du seuillage par hystresis (seuil haut : 100, seuil bas : 25, bruit Segmentation l'aide de la mthode d'agrgation de pixels (seuil :20) Segmentation l'aide de la mthode d'agrgation de pixels (seuil :15) Segmentation l'aide de la mthode d'agrgation de pixels (seuil :10) Segmentation l'aide de la mthode d'agrgation de pixels (seuil :5) Segmentation l'aide de la mthode d'agrgation de pixels (seuil :20) Segmentation l'aide de la mthode d'agrgation de pixels (seuil :15) Segmentation l'aide de la mthode d'agrgation de pixels (seuil :10) Segmentation l'aide de la mthode d'agrgation de pixels (seuil :5) Segmentation l'aide de la mthode d'agrgation de pixels (seuil :20) Segmentation l'aide de la mthode d'agrgation de pixels (seuil :15) Segmentation l'aide de la mthode d'agrgation de pixels (seuil :10) Segmentation l'aide de la mthode d'agrgation de pixels (seuil :5)

Liste des algorithmes


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 Syntaxe pour la cration d'une fonction Matlab . . . . . . . . . . . . . . . . . . . . . . . . . . . . Syntaxe pour la cration d'une fonction Callback Matlab . . . . . . . . . . . . . . . . . . . . . . . Conguration de l'acquisition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dmarrage de l'acquisition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Dmarrage de l'acquisition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction principale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction principale (Suite) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction principale (Suite) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction principale (Suite) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction principale (Suite) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction de construction d'histogrammes (imhist) Fonction de construction d'histogrammes (imhist) Fonction de binarisation paramtrable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 8 9 9 10 11 12 13 14 15 16 18 20 22 25 27 28 33 35 36 40 41 43 55 57 66 67 67 69 74 75 81 86 92 98

Fonction d'inversion d'images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction de binarisation selon la mthode d'Otsu . . . . . . . . . . . . . . . . . . . . . . . . . . . Gestionnaire d'vnements du slider pour la quantication . . . . . . . . . . . . . . . . . . . . . . Fonction de quantication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction d'tirement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction d'galisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction d'galisation (Suite) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction de slection du bruit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction d'ajout de bruits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction de ltrage mdian (medlt2) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction de ltrage mdian (Algorithme maison)

Fonction de ltrage moyenneur (imlter) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction d'application de ltres moyenneurs (Algorithme maison) . . . . . . . . . . . . . . . . . . Fonction de cration du ou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction d'application du ou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction de correction de ou . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Fonction de dtection de contours l'aide du gradient Simple . . . . . . . . . . . . . . . . . . . . Fonction de dtection de contours l'aide du gradient Simple (Suite) . . . . . . . . . . . . . . . . Fonction de dtection de contours l'aide du gradient de Roberts . . . . . . . . . . . . . . . . . . Fonction de dtection de contours l'aide du ltre de Prewitt . . . . . . . . . . . . . . . . . . . . Fonction de dtection de contours l'aide du ltre de Sobel . . . . . . . . . . . . . . . . . . . . . Fonction de dtection de contours l'aide du ltre de Canny Fonction de dtection de contours l'aide du ltre Laplacien . . . . . . . . . . . . . . . . . . . .

. . . . . . . . . . . . . . . . . . . . 104

Fonction de dtection de contours l'aide du seuillage par hystresis . . . . . . . . . . . . . . . . 108

38 39 40 41 42 43 44

Fonction de dtection de contours l'aide du seuillage par hystresis (Suite) . . . . . . . . . . . . 109 Fonction d'agrgation de pixels selon la distance simple . . . . . . . . . . . . . . . . . . . . . . . 115 . . . . . . . . . . . . . . . . . . . 116 . . . . . . . . . . . . . . . . . 121 . . . . . . . . . . . . . 125 Fonction d'agrgation de pixels selon la distance simple (Suite)

Fonction d'agrgation de pixels selon la moyenne de rgion . . . . . . . . . . . . . . . . . . . . . . 120 Fonction d'agrgation de pixels selon la moyenne de rgion (Suite) Fonction d'agrgation de pixels selon la moyenne et l'cart type de rgion

Fonction d'agrgation de pixels selon la moyenne et l'cart type de rgion (Suite) . . . . . . . . . 126

1 Introduction
Ce dossier se compose de cinq parties. Dans une premire partie, nous prsenterons les concepts de bases permettant de raliser une application Matlab destine au traitement d'images. La deuxime partie prsentera un ensemble de fonctions permettant notamment la manipulation d'histogrammes. Dans la partie suivante, nous exposerons un ensemble de mthodes permettant de ltrer les bruits ventuels et de corriger les eets de ous. La cinquime partie de ce dossier s'attardera sur le problme de dtection des contours dans une image et sur le problme de segmentation. Nous terminerons ce dossier par une brve conclusion.

2 Matlab et le traitement d'images


Cette partie constitue une initiation au dveloppement d'applications dans l'environnement Matlab. Dans un premier temps, nous rappellerons quelques principes et syntaxes propres Matlab et qui nous serons utiles par la suite. Dans un second temps, nous prsenterons les instructions Matlab permettant d'acqurir et de traiter une image. Enn, nous terminerons ce dossier en prsentant les tapes ncessaires la mise en place du squelette de l'application qui sera complte lors des travaux pratiques de traitement d'images.

2.1 Initiation Matlab


2.1.1 Cration d'une interface graphique
Nous allons tout d'abord prsenter quelques manipulations utiles pour crer l'interface d'une application. Pour se faire, l'outil graphique de cration d'interfaces Matlab Guide sera utilis. Cet outil peut tre dmarr l'aide du bouton Guide prsent sur la fentre principale de Matlab. Une fois l'outil lanc, nous avons la possibilit de crer une nouvelle interface graphique (Create new GUI) ou d'diter une interface existante (Open existing GUI). Pour crer une nouvelle interface graphique, nous slectionnons l'option Blanck GUI dans l'onglet Create new GUI.

Figure 1  GUIDE
Une bote outils contenant les dirents contrles se situe dans la partie 1 de l'diteur. Pour ajouter un contrle notre interface, il sut de slectionner un des objets de la bote outils et de de le placer dans l'interface situe dans la partie 2 de l'diteur. Les objets suivants seront utiliss dans notre application :

L'objet Push Button sera notamment utilis pour lancer les dirents traitements. Les objets Check Box, Pop-up Menu et Radio Button seront utiliss pour congurer des options. Les objets Static Text et Edit Text seront utiliss pour l'achage et la saisie d'informations. L'objet Slider sera utilis pour permettre l'utilisateur de paramtrer des variables numriques. L'objet Button Group sera utilis pour regrouper les fonctions de l'application par thme. L'objet Axes sera utilis pour l'achage des images, des histogrammes et des fonctions mathmatiques.

Une fois qu'un contrle est prsent dans l'interface, il est possible de paramtrer ce dernier en double-cliquant dessus. Nous accdons alors l'inspector permettant notamment de dnir le nom, le contenu ou mme la couleur du contrle.

2.1.2 Cration de fonctions et de gestionnaires d'vnements


An d'augmenter la lisibilit de notre code, nous crerons une fonction pour chacun des traitements dvelopps. Pour dclarer une fonction Matlab, nous utilisons la syntaxe suivante :

Algorithme 1 Syntaxe pour la cration d'une fonction Matlab


f u n c t i o n nomFonction ( paramtres ) %Code de l a f o n c t i o n

Des gestionnaires d'vnements seront galement ajout dans notre code an de dterminer le comportement de notre application lorsque l'utilisateur interagit avec les dirents contrles de l'interface. Pour se faire, nous utilisons des fonctions Callback :

Algorithme 2 Syntaxe pour la cration d'une fonction Callback Matlab


f u n c t i o n nomContrle_Callback ( hObject , eventdata , h a n d l e s ) %Code du g e s t i o n n a i r e

Cette fonction, une fois associe un contrle de l'interface, permet de rpondre aux vnements correspondant ce dernier.

2.2 Acquisition et traitement d'images sous Matlab


Nous allons maintenant prsenter le code ncessaire pour commencer acqurir des images sous Matlab. Pour permettre notre matriel d'acquisition et Matlab de communiquer ensemble, il nous faut tout d'abord disposer d'un adaptateur. Matlab met notre disposition plusieurs adaptateurs. La fonction imaqhwinfo est utilise pour connatre les adaptateurs installs 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 amples informations sur cet adaptateur l'aide de la fonction imaqhwinfo :

Figure 3  Visualisation des informations concernant l'adaptateur winvideo


Nous pouvons ensuite connatre les formats vidos supports par le priphrique d'acquisition (une webcam en l'occurrence) :

Figure 4  Visualisation des informations concernant les formats supports par le priphrique d'acquisition
Plusieurs formats seront utiliss 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 domicile pour utiliser une camra Logitech non intgre. Ce mode sera utilis pour les traitements lourds. La faible taille de l'image permettra de limiter la dure des traitements.

Les formats RGB24_640x480 lorsque nous travaillerons dans la salle de l'universit (Les webcams de cette salle supporte le mode RGB). Ce mode sera galement utilis notre domicile pour utiliser une camra Logitech non intgre. Ce mode sera utilis pour les traitements lgers. La taille de l'image plus importante permettra d'amliorer le rendu.

Le format YUY2_320x240 lorsque nous travaillerons notre domicile (Utilisation d'une webcam intgre un ordinateur portable). Ce mode sera utilis pour les traitements lourds. La faible taille de l'image permettra de limiter la dure des traitements. Le format YUY2_1024x768 lorsque nous travaillerons notre domicile (Utilisation d'une webcam intgre un ordinateur portable). Ce mode sera utilis pour les traitements lgers. La taille de l'image plus importante permettra d'amliorer le rendu.

Nous pouvons maintenant congurer l'acquisition l'aide du code suivant :

Algorithme 3 Conguration de l'acquisition


vid = v i d e o i n p u t ( ' winvideo ' , 1 , mode ) ; h a n d l e s . vid = vid ; t r i g g e r c o n f i g ( h a n d l e s . vid , ' Manual ' ) ; s e t ( h a n d l e s . vid , ' FramesPerTrigger ' , 1 ) ; s e t ( h a n d l e s . vid , ' TriggerRepeat ' , I n f ) ;

Nous spcions tout d'abord le nom de l'adaptateur utiliser pour communiquer avec le priphrique d'acquisition (winvideo dans notre cas) et nous l'associons la camra n1 dans un format stock dans la variable mode. Nous associons ensuite l'entre vido issue du priphrique l'entre vido de l'interface (handles.vid). Nous congurons ensuite l'entre vido de l'interface. Nous xons tout d'abord le mode de dclenchement des captures Manual. Nous spcions ensuite qu'une seule image doit tre capture pour chaque dclenchement (trigger). Enn, nous prcisons que nous pouvons dclencher la capture autant de fois qu'on le souhaite. Nous allons maintenant prsenter le code permettant de dclencher la capture d'une image (dclenchement du trigger) :

Algorithme 4 Dmarrage de l'acquisition


g u i d a t a ( hObject , h a n d l e s ) ; s t a r t ( h a n d l e s . vid ) ; t r i g g e r ( h a n d l e s . vid ) ; y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ;

Nous mettons tout d'abord jour l'objet handles.vid l'aide de la fonction guidata. Nous initialisons ensuite la capture l'aide de la fonction start. Il nous sut ensuite de dclencher le trigger l'aide de la fonction trigger. Une image est alors stocke dans l'objet handles.vid. Il nous est possible de rcuprer cette image l'aide de la fonction getdata. Le code suivant permet de stopper l'acquisition :

Algorithme 5 Dmarrage de l'acquisition


delete ( h a n d l e s . vid ) ;
c l e a r h a n d l e s . vid ; s t o p ( h a n d l e s . vid ) ;

Aprs avoir stopp la capture l'aide de la fonction stop, nous eaons les images stockes en mmoire l'aide de la fonction clear.

2.3 Mise en place du squelette de l'application


Nous allons maintenant prsenter la mise en place du squelette de notre application. Il s'agit notamment de mettre en place l'interface qui sera utilise tout au long des travaux pratiques. Nous crons l'interface l'aide de l'outil graphique prsent prcdemment pour obtenir le rsultat suivant :

Figure 5  Mise en place de l'interface


Cette interface est compose des sept parties suivantes :

La partie 1 contient un ensemble de contrles de type Axes. Deux d'entre eux sont utiliss pour visualiser les images en entre ainsi que les histogrammes correspondant ces dernires dans la partie Image et histogramme en entre. La partie Image traite utilise quant elle trois contrle de types Axes pour acher les images traits, les histogrammes correspondant ces images ainsi que les fonctions mathmatiques caractrisant le traitement lorsque cela est pertinent (galisation et tirement notamment).

La partie 2 contient les fonctions gnralistes tel que la conguration du format vido ou encore les contrles permettant de stopper le traitement en cours. La partie 3 contient un contrle charg d'acher des informations sur le traitement en cours. La partie 4 regroupe les traitements de modications d'histogrammes, de binarisation et de quantication. La partie 5 regroupe les traitements de ltrage de bruit et de ou. La partie 6 contient les traitements permettant la dtection de contours. La partie 7 regroupe les traitements permettant la segmentation d'images.

Aprs avoir cr l'interface, nous allons maintenant mettre en place la fonction principale de notre programme. Cette dernire permettra de lancer le traitement adapt en fonction des actions de l'utilisateur sur les dirents contrles de l'interface. Cette fonction permet galement de grer les actions sur les boutons Stopper le

10

traitement et Sortie et n :

Algorithme 6 Fonction principale


% Executes on button p r e s s i n s t o p . f u n c t i o n stop_Callback ( hObject , eventdata , h a n d l e s ) % hObject handle to s t o p ( s e e GCBO) % eventdata r e s e r v e d to be d e f i n e d i n a f u t u r e v e r s i o n o f MATLAB % handles s t r u c t u r e with h a n d l e s and u s e r data ( s e e GUIDATA) s e t ( h a n d l e s . stop , ' UserData ' , 1 ) ; % Executes on button p r e s s i n s o r t i e . f u n c t i o n s o r t i e _ C a l l b a c k ( hObject , eventdata , h a n d l e s ) % hObject handle to s o r t i e ( s e e GCBO) % eventdata r e s e r v e d to be d e f i n e d i n a f u t u r e v e r s i o n o f MATLAB % handles s t r u c t u r e with h a n d l e s and u s e r data ( s e e GUIDATA) i f g e t ( h a n d l e s . stop , ' UserData ' ) close all

else

end

s e t ( h a n d l e s . stop , ' UserData ' , 1 ) ;

%Fonction de t r a i t e m e n t de l ' image . Cette f o n c t i o n l a n c e l e t r a i t e m e n t %p a s s en paramtre f u n c t i o n t r a i t e m e n t ( hObject , eventdata , handles , nomTraitement ) s e t ( h a n d l e s . stop , ' UserData ' , 0 ) ; %h a n d l e s : donnes 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 ) % C o n f i g u r a t i o n de l e n t r e v i d o %Rcupration du mode de v i s u a l i s a t i o n mode=g e t ( h a n d l e s . listeMode , ' Value ' ) ; s w i t c h mode case 1 mode= ' YUY2_1024x768 ' ; s e t ( h a n d l e s . hauteur , ' S t r i n g ' , ' 768 ' ) ; s e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' , ' 1024 ' ) ; case 2 mode= ' YUY2_320x240 ' ; s e t ( h a n d l e s . hauteur , ' S t r i n g ' , ' 240 ' ) ; s e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' , ' 320 ' ) ; case 3 mode= ' RGB24_320x240 ' ; s e t ( h a n d l e s . hauteur , ' S t r i n g ' , ' 240 ' ) ; s e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' , ' 320 ' ) ; otherwise end vid = v i d e o i n p u t ( ' winvideo ' , 1 , mode ) ; %on a s s o c i e l a d a p t a t e u r ( l o g i c i e l d a c c s l a camra ) au " d e v i c e i d " %de l a camra ( d e v i c e i d = 1) h a n d l e s . vid = vid ; %on a s s o c i e l e n t r e v i d o c e l l e l i e au GUIDE % Fixe l e s p r o p 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 ( h a n d l e s . vid , ' Manual ' ) ; %dclenchement manuel pour l a c a p t u r e des frames s e t ( h a n d l e s . vid , ' FramesPerTrigger ' , 1 ) ; %nombre de frames c a p t u r e r chaque f o i s quon l a n c e l a f o n c t i o n " t r i g g e r " ( i c i nb = 1) s e t ( h a n d l e s . vid , ' TriggerRepeat ' , I n f ) ; %on peut u t i l i s e r l a f o n c t i o n " t r i g g e r " autant de f o i s que l o n veut g u i d a t a ( hObject , h a n d l e s ) ; %m o d i f i e l e GUIDE avec l e s n o u v e l l e s donnes % Capture des frames p a r t i r de l a v i d o s t a r t ( h a n d l e s . vid ) ;

11

Algorithme 7 Fonction principale (Suite)


%i n i t i a l i s e l a c a p t u r e de frames while 1 t r i g g e r ( h a n d l e s . vid ) ; %d c l e n c h e l a c a p t u r e dune frame ( mise en mmoire de l a frame ) i f g e t ( h a n d l e s . stop , ' UserData ' ) %s i on appuie s u r l e bouton " Stop " set ( handles . infosTraitement , ' String ' , ' ' ) ; s t o p ( h a n d l e s . vid ) ; %s t o p p e r l a c a p t u r e v i d e o delete ( h a n d l e s . vid ) ; c l e a r h a n d l e s . vid ; %e f f a c e l e s frames s t o c k e s en mmoire

%s i on na pas appuy s u r l e bouton " Stop " %On e x c u t e l a f o n c t i o n de t r a i t e m e n t adapte i f ( strcmp ( nomTraitement , ' i n v e r s i o n ' ) ) i n v e r s i o n ( hObject , eventdata , h a n d l e s ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' I n v e r s i o n ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' I n v e r s i o n de l ' ' image en e n t r e ( p r a l a b l e m e n t c o n v e r t i t en niveau de g r i s ) ' } s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ; e l s e i f ( strcmp ( nomTraitement , ' histogrammeImHist ' ) ) histogrammeImHist ( hObject , eventdata , h a n d l e s ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' Histogramme ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' A f f i c h a g e de l ' ' histogramme de l ' ' image en e n t r e ( U t i l i s a t i o n de l a f o n c t i o n i m h i s t ) ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ; e l s e i f ( strcmp ( nomTraitement , ' histogrammeMaison ' ) ) histogrammeMaison ( hObject , eventdata , h a n d l e s ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' Histogramme ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' A f f i c h a g e de l ' ' histogramme de l ' ' image en e n t r e ( U t i l i s a t i o n d ' ' un a l g o r i t h m e maison ) ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ; e l s e i f ( strcmp ( nomTraitement , ' b i n a r i s a t i o n P a r a m ' ) ) b i n a r i s a t i o n P a r a m ( hObject , eventdata , h a n d l e s ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' B i n a r i s a t i o n ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' B i n a r i s a t i o n de l ' ' image en e n t r e s e l o n 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 e u i l ' ' . ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ; e l s e i f ( strcmp ( nomTraitement , ' b i n a r i s a t i o n O t s u ' ) ) b i n a r i s a t i o n O t s u ( hObject , eventdata , h a n d l e s ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' B i n a r i s a t i o n Otsu ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' B i n a r i s a t i o n de l ' ' image en e n t r e s e l o n un s e u i l c a l c u l l ' ' a i d e de l a mthode d ' ' Otsu ( f o n c t i o n g r a y t h r e s h ) . ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ; e l s e i f ( strcmp ( nomTraitement , ' q u a n t i f i c a t i o n ' ) ) q u a n t i f i c a t i o n ( hObject , eventdata , h a n d l e s ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' Q u a n t i f i c a t i o n ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' Q u a n t i f i c a t i o n de l ' ' image en e n t 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 i d e du s l i d e r . ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ;

break else

12

Algorithme 8 Fonction principale (Suite)


e l s e i f ( strcmp ( nomTraitement , ' e t i r e m e n t ' ) ) e t i r e m e n t ( hObject , eventdata , h a n d l e s ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' Etirement ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' L i n a r i s a t i o n de l ' ' image en e n t r e . ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; 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 , h a n d l e s ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' E g a l i s a t i o n ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' E g a l i s a t i o n de l ' ' image en e n t r e . ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ; e l s e i f ( strcmp ( nomTraitement , ' f i l t r e M e d i a n ' ) ) imgBruit=b r u i t ( hObject , eventdata , h a n d l e s ) ; f i l t r e M e d i a n ( hObject , eventdata , handles , imgBruit ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' F i l t r e mdian ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' C o r r e c t i o n de l ' ' image en e n t r e ( p r a l a b l e m e n t b r u i t e ) l ' ' a i d e d ' ' un f i l t r e mdian . U t i l i s e z l e champ de s a i s i e ' ' D e n s i t ' ' l o r s q u ' ' un b r u i t de type ' ' S e l e t p o i v r e ' ' e s t a p p l i q u . U t i l i s e z l e champ de s a i s i e ' ' Variance ' ' l o r s q u ' ' un b r u i t g a u s s i e n e s t a p p l i q u . C o n f i g u r e z l a t a i l l e du f i l t r e , l e nombre de p a s s e s a i n s i que l e type de g e s t i o n des b o r d u r e s l ' ' a i d e des l i s t e s d r o u l a n t e s prvues c e t e f f e t . ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ; e l s e i f ( strcmp ( nomTraitement , ' f i l t r e M o y e n n e u r ' ) ) imgBruit=b r u i t ( hObject , eventdata , h a n d l e s ) ; f i l t r e M o y e n n e u r ( hObject , eventdata , handles , imgBruit ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' F i l t r e moyenneur ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' C o r r e c t i o n de l ' ' image en e n t r e ( p r a l a b l e m e n t b r u i t e ) l ' ' a i d e 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 ' ' D e n s i t ' ' l o r s q u ' ' un b r u i t de type ' ' S e l e t p o i v r e ' ' e s t a p p l i q u . U t i l i s e z l e champ de s a i s i e ' ' Variance ' ' l o r s q u ' ' un b r u i t g a u s s i e n e s t a p p l i q u . C o n f i g u r e z l a t a i l l e du f i l t r e , l e nombre de p a s s e s a i n s i que l e type de g e s t i o n des b o r d u r e s l ' ' a i d e des l i s t e s d r o u l a n t e s prvues c e t e f f e t . ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ; e l s e i f ( strcmp ( nomTraitement , ' flouWiener ' ) ) PSF=c r e a t i o n F l o u ( hObject , eventdata , h a n d l e s ) ; imgFloute=a p p l i c a t i o n F l o u ( hObject , eventdata , handles , PSF ) ; %S i l ' u t i l i s a t e u r s o u h a i t e b r u i t e r l ' image f l o u t e check=g e t ( h a n d l e s . checkFlouBruit , ' Value ' ) ; i f ( check==1) imgFloute=b r u i t 2 ( hObject , eventdata , handles , imgFloute ) ; end flouWiener ( hObject , eventdata , handles , imgFloute , PSF ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' F i l t r e de Wiener ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' C o r r e c t i o n de l ' ' image en e n t r e ( p r a l a b l e m e n t f l o u t e ) l ' ' a i d e 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 ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ; e l s e i f ( strcmp ( nomTraitement , ' f i l t r e M e d i a n M a i s o n ' ) ) imgBruit=b r u i t ( hObject , eventdata , h a n d l e s ) ; f i l t r e M e d i a n M a i s o n ( hObject , eventdata , handles , imgBruit ) ; t i t r e ={ ' F i l t r e mdian ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' C o r r e c t i o n de l ' ' image en e n t r e ( p r a l a b l e m e n t b r u i t e ) l ' ' a i d e d ' ' un f i l t r e mdian maison . U t i l i s e z l e champ de s a i s i e ' ' D e n s i t ' ' l o r s q u ' ' un b r u i t de type ' ' S e l e t p o i v r e ' ' e s t a p p l i q u . U t i l i s e z l e champ de s a i s i e ' ' Variance ' ' l o r s q u ' ' un b r u i t g a u s s i e n e s t a p p l i q u . La t a i l l e du f i l t r e e s t f i x e 3 e t l e nombre de p a s s e s 1 . ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ;

13

Algorithme 9 Fonction principale (Suite)


e l s e i f ( strcmp ( nomTraitement , ' f i l t r e M o y e n n e u r M a i s o n ' ) ) imgBruit=b r u i t ( hObject , eventdata , h a n d l e s ) ; f i l t r e M o y e n n e u r M a i s o n ( hObject , eventdata , handles , imgBruit ) ; t i t r e ={ ' F i l t r e moyenneur ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' C o r r e c t i o n de l ' ' image en e n t r e ( p r a l a b l e m e n t b r u i t e ) l ' ' a i d e 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 ' ' D e n s i t ' ' l o r s q u ' ' un b r u i t de type ' ' S e l e t p o i v r e ' ' e s t a p p l i q u . U t i l i s e z l e champ de s a i s i e ' ' Variance ' ' l o r s q u ' ' un b r u i t g a u s s i e n e s t a p p l i q u . La t a i l l e du f i l t r e e s t f i x e 3 e t l e nombre de p a s s e s 1 . ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ; e l s e i f ( strcmp ( nomTraitement , ' g r a d i e n t R o b e r t s ' ) ) g r a d i e n t R o b e r t s ( hObject , eventdata , h a n d l e s ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' Gradient de Roberts ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' D t e c t i o n des c o n t o u r s de l ' ' image en e n t r e l ' ' a i d e du g r a d i e n t de Roberts . U t i l i s e z l e champ de s a i s i e ' ' S e u i l ' ' pour s a i s i r l e s e u i l de d t e c t i o n des c o n t o u r s . U t i l i s e z l e bouton r a d i o ' ' Appliquer b r u i t ' ' pour a j o u t e r un b r u i t l ' ' image . ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ; e l s e i f ( strcmp ( nomTraitement , ' g r a d i e n t S i m p l e ' ) ) g r a d i e n t S i m p l e ( hObject , eventdata , h a n d l e s ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' Gradient Simple ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' D t e c t i o n des c o n t o u r s de l ' ' image en e n t r e l ' ' a i d e du g r a d i e n t Simple . U t i l i s e z l e champ de s a i s i e ' ' S e u i l ' ' pour s a i s i r l e s e u i l de d t e c t i o n des c o n t o u r s . U t i l i s e z l e bouton r a d i o ' ' Appliquer b r u i t ' ' pour a j o u t e r un b r u i t l ' ' image . U t i l i s e z l e bouton r a d i o ' ' Appliquer 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 ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; 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 , h a n d l e s ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' F i l t r e de Sobe l ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' D t e c t i o n des c o n t o u r s de l ' ' image en e n t r e l ' ' a i d e 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 e u i l ' ' pour s a i s i r l e s e u i l de d t e c t i o n des c o n t o u r s . U t i l i s e z l e bouton r a d i o ' ' Appliquer b r u i t ' ' pour a j o u t e r un b r u i t l ' ' image . ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ; e l s e i f ( strcmp ( nomTraitement , ' f i l t r e P r e w i t t ' ) ) f i l t r e P r e w i t t ( hObject , eventdata , h a n d l e s ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' F i l t r e de P r e w i t t ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' D t e c t i o n des c o n t o u r s de l ' ' image en e n t r e l ' ' a i d e du f i l t r e de P r e w i t t . U t i l i s e z l e champ de s a i s i e ' ' S e u i l ' ' pour s a i s i r l e s e u i l de d t e c t i o n des c o n t o u r s . U t i l i s e z l e bouton r a d i o ' ' Appliquer b r u i t ' ' pour a j o u t e r un b r u i t l ' ' image . ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ; e l s e i f ( strcmp ( nomTraitement , ' f i l t r e C a n n y ' ) ) f i l t r e C a n n y ( hObject , eventdata , h a n d l e s ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' F i l t r e de Canny ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' D t e c t i o n des c o n t o u r s de l ' ' image en e n t r e l ' ' a i d e 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 e u i l ' ' pour s a i s i r l e s e u i l de d t e c t i o n des c o n t o u r s . U t i l i s e z l e bouton r a d i o ' ' Appliquer b r u i t ' ' pour a j o u t e r un b r u i t l ' ' image . ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; 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 , h a n d l e s ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' F i l t r e L a p l a c i e n ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' D t e c t i o n des c o n t o u r s de l ' ' image en e n t r e l ' ' a i d e du f i l t r e L a p l a c i e n . U t i l i s e z l e s boutons r a d 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 r a d i o ' ' Appliquer b r u i t ' ' pour a j o u t e r un b r u i t l ' ' image . ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ;
14

Algorithme 10 Fonction principale (Suite)


e l s e i f ( strcmp ( nomTraitement , ' s e u i l l a g e H y 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 , h a n d l e s ) ; s e u i l l a g e H y s t e r e s i s ( hObject , eventdata , handles , imgContour ) ; %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' S e u i l l a g e par H y s t r e s i s ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' D t e c t i o n des c o n t o u r s de l ' ' image en e n t r e l ' ' a i d e 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 ' ' S e ui lB ' ' e t ' ' SeuilH ' ' pour s p c i f i e r l e s s e u i l s . U t i l i s e z l e bouton r a d i o ' ' Appliquer b r u i t ' ' pour a j o u t e r un b r u i t l ' ' image . ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ; %Pause du programme pause ( 3 ) ; e l s e i f ( strcmp ( nomTraitement , ' a g r e g a t i o n P i x e l s ' ) ) y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire ( "y" : frame c o u l e u r ) img = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s imgGradient=g r a d i e n t S i m p l e 2 ( hObject , eventdata , handles , img ) ; c r i t e r e=g e t ( h a n d l e s . c r i t e r e C h o i s i , ' S t r i n g ' ) ; switch c r i t e r e case ' d i s t a n c e S i m p l e ' a g r e g a t i o n P i x e l s S i m p l e ( hObject , eventdata , handles , img , imgGradient ) ; case ' distanceMoyenne ' a g r e g a t i o n P i x e l s M o y e n n e ( hObject , eventdata , handles , img , imgGradient ) ; case ' ecartType ' a g r e g a t i o n P i x e l s E c a r t ( hObject , eventdata , handles , img , imgGradient ) ; otherwise end %Mise j o u r des i n f o r m a t i o n s t i t r e ={ ' Agrgation de p i x e l s ' } ; s a u t L i g n e={ ' ' } ; infosComp={ ' Segmentantation de l ' ' image en e n t r e l ' ' a i d e de l ' ' a g r g a t i o n 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 a n c e u t i l i s e pour l ' ' a g r g a t i o n . U t i l i s e z l e s boutons r a d i o s pour s p c i f i e r l e c r i t r e d ' ' homognit u t i l i s e r . ' } ; s e t ( h a n d l e s . i n f o s T r a i t e m e n t , ' S t r i n g ' , [ t i t r e ; s a u t L i g n e ; infosComp ] ) ; %Pause du programme pause ( 3 ) ; end end end %Aprs a v o i r appuy s u r 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 r a i t e m e n t : axes ( h a n d l e s . axes1 ) ; cla ; axes ( h a n d l e s . axes2 ) ; cla ; axes ( h a n d l e s . axes3 ) ; cla ; axes ( h a n d l e s . axes4 ) ; cla ; axes ( h a n d l e s . axes5 ) ; cla ;

3 Histogramme, binarisation et quantication


Nous allons maintenant tudier des traitements permettant de manipuler des histogrammes, de binariser et de quantier les images.

3.1 Histogramme
Avant de prsenter des traitements proprement parler, nous allons donner deux fonctions permettant de visualiser l'histogramme d'une image. Par dnition, un histogramme est un graphe permettant de reprsenter la rpartition d'une variable. Dans le cas d'une image, l'histogramme permet de connatre le nombre de pixels

15

ayant un niveau de gris donn. Cet outil permet d'obtenir un certain nombres d'indications sur l'image. Il est ensuite possible de raliser 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 prsenter une fonction permettant de visualiser l'histogramme de l'image en entre et utilisant une fonction Matlab prvue cet eet : la fonction imhist.

Algorithme 11 Fonction de construction d'histogrammes (imhist)


%Fonction c h a r g e d ' a f f i c h e r l ' histogramme de l ' image en e n t r e %( u t i l i s a t i o n de i m h i s t ) f u n c t i o n histogrammeImHist ( hObject , eventdata , h a n d l e s ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; %Traitement de l ' image y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire (" y" : frame c o u l e u r ) I 4 = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s h i s t o=i m h i s t ( I 4 ) ; %C a l c u l de l ' histogramme %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( I 4 ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histo ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

Nous rcuprons tout d'abord l'image acquise l'aide de la fonction getdata vue prcdemment. On convertit ensuite cette image en niveau de gris l'aide de la fonction rgb2gray. Nous obtenons alors une image o chaque pixel de l'image est cod l'aide d'un unique octet (la valeur d'un pixel varie donc de 0 255). Nous appelons ensuite la fonction imhist sur l'image I4 an d'obtenir l'histogramme de l'image. On procde ensuite l'achage des images et des histogrammes. Nous plaons respectivement l'image d'entre et son histogramme dans les contrles axes1 et axes2. La fonction plot est utilise pour raliser l'achage de l'histogramme tandis que la fonction subimage est utilise pour raliser l'achage de l'image. On notera l'utilisation des fonctions xlabel et ylabel pour nommer les axes de nos dirents graphiques. Pour acher l'histogramme de l'image d'entre, il nous sut dsormais de cliquer sur le bouton Histogramme imhist de l'interface prsente un peu plus tt dans ce dossier. Le rsultat obtenu est le suivant :

16

Figure 6  Achage de l'histogramme (imhist)


On note sur l'histogramme que, comme prvu, les niveaux de gris sont compris entre 0 et 255. Nous remarquons galement que notre image n'utilise pas les niveaux de gris de 0 40. Le contraste de l'image pourrait donc tre amlior si l'image utilisait cette plage. Cette modication peut tre eectue par un tirement d'histogrammes. Ce traitement sera explicit un peu plus loin dans ce dossier. Enn, si la luminosit de l'image augmente, on pourra observer un dplacement de l'histogramme vers la droite.

3.1.2 Algorithme maison


Nous allons maintenant introduire une fonction implmentant un algorithme de notre cru et permettant galement de visualiser l'histogramme de l'image en entre :

17

Algorithme 12 Fonction de construction d'histogrammes (imhist)


%Fonction c h a r g e d ' a f f i c h e r l ' histogramme de l ' image en e n t r e ( p a r c o u r s %de l ' image e t comptage des p i x e l s ) f u n c t i o n histogrammeMaison ( hObject , eventdata , h a n d l e s ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; %Traitement de l ' image y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire ( "y" : frame c o u l e u r ) I 4 = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s %C a l c u l de l ' histogramme %C r a t i o n d ' un v e c t e u r contenant l e s compteurs de chaque niveau de g r i s tabCompteur =0:255; %I n i t i a l i s a t i o n du t a b l e a u de compteurs for p=1:256 tabCompteur ( p )=0; end %Parcours de l ' image e t comptage des p i x e l s f o r p=1: hauteur f o r n=1: l a r g e u r i n d i c e=I 4 ( p , n )+1; tabCompteur ( i n d i c e )=tabCompteur ( i n d i c e )+1; end end %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( I 4 ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; p l o t ( tabCompteur ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

Nous rcuprons tout d'abord la hauteur et la largeur de l'image d'entre. Ces informations sont stockes dans des contrles de type Edit text invisibles. La valeur de ces contrles est x ds le lancement du traitement et en fonction du choix du mode eectu par l'utilisateur. La fonction get est utilise pour rcuprer la valeur de chaque champ. Cette fonction prend en paramtre le contrle dont on veut rcuprer la valeur ainsi que le type de donnes attendu. Chaque contrle de notre interface est accessible grce la notation handles.nomControle. An d'obtenir des dimensions numriques, nous convertissons les chanes obtenues l'aide de la fonction str2num permettant de convertir une chane de caractres en variable numrique. Nous rcuprons ensuite l'image en entre puis nous la convertissons en niveau de gris. Pour produire l'histogramme de l'image en entre, il nous faut compter le nombre d'occurrences (le nombre de pixel) de chaque niveau de gris. Pour comptabiliser ces dernires, nous crons un tableau tabCompteur de 256 cases. Chaque case contiendra le nombre d'occurrences du niveau de gris correspondant son indice. Nous initialisons chacun des compteurs zro l'aide d'une premire boucle for. Nous parcourons ensuite l'ensemble de l'image l'aide de deux boucles for imbriques. Pour chaque pixel de l'image, nous incrmentons le compteur ayant pour indice le niveau de gris du pixel +1 (les tableaux commenant 1 sous Matlab). Il nous sut ensuite d'acher l'image en entre dans le contrle axe1 et notre histogramme dans le contrle axe2. Pour acher l'histogramme de l'image d'entre, il nous sut dsormais de cliquer sur le bouton Histogramme maison de l'interface prsente un peu plus tt dans ce dossier. Le rsultat obtenu est le suivant :

18

Figure 7  Achage de l'histogramme


Le rsultat obtenu respecte les tendances de l'histogramme obtenu l'aide de la fonction imhist.

3.2 Inversion
Le premier traitement que nous allons prsenter est l'inversion d'images. Ce traitement relativement simple mettre en place consiste convertir chaque pixel de l'image en entre (en niveau de gris dans notre cas) en sa valeur inverse sur l'chelle des 256 couleurs. Ainsi, un pixel ayant pour valeur 10 sera converti en la valeur 245 alors qu'un pixel ayant pour valeur 250 sera converti en la valeur 5. Pour raliser ce traitement, nous ajoutons la fonction inversion suivante dans notre programme Matlab :

19

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 e n t r e ( I n v e r s i o n des niveaux %de g r i s ) f u n c t i o n i n v e r s i o n ( hObject , eventdata , h a n d l e s ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; %Traitement de l ' image y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire ( "y" : frame c o u l e u r ) I 4 = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s Inv = 255 I 4 ; %on r a l i s e l i n v e r s i o n en s o u s t r a y a n t l a v i d o en niveaux de g r i s ( I 4 ) 255 %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( I 4 ) ; h i s t o S o r t i e=i m h i s t ( Inv ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( y ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( Inv ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

Nous rcuprons tout d'abord l'image acquise puis on convertit ensuite cette image en niveau de gris. Pour inverser l'image, il nous sut ensuite de soustraire la valeur de chaque pixel de l'image 255 et de stocker le rsultat ainsi obtenue dans une nouvelle image nomme Inv. Nous construisons ensuite des histogrammes pour l'image d'entre et l'image de sortie l'aide de la fonction imhist. On procde ensuite l'achage des images et des histogrammes. Nous plaons respectivement l'image d'entre et son histogramme dans les contrles axes1 et axes2. Pour terminer, nous plaons respectivement l'image de sortie et son histogramme dans les contrles axes3 et axes4. Pour raliser une inversion d'images, il nous sut dsormais de cliquer sur le bouton Inversion de l'interface prsente un peu plus tt dans ce dossier. Le rsultat obtenu est le suivant :

20

Figure 8  Inversion d'images


Il est noter que l'histogramme de l'image en entre est obtenu partir de l'image en niveau de gris (et non l'image couleur). Nous pouvons voir que l'histogramme de l'image de sortie est le symtrique de l'image en entre. Les niveaux de gris levs (claires) deviennent donc sombres et inversement.

3.3 Binarisation
Nous allons maintenant prsenter des fonctions permettant de raliser une binarisation de l'image en entre. La binarisation permet de rduire l'chelle chromatique de 256 valeurs seulement deux valeurs : 0 et 1. Pour raliser la binarisation, il est ncessaire de choisir un seuil (de manire automatique ou arbitraire). On parcourt ensuite l'ensemble des pixels de l'image d'entre. Chaque pixel ayant un niveau de gris infrieur au seuil se voit assign la valeur 0. Les pixels ayant un niveau de gris suprieur sont quant eux pass 1.

3.3.1 Binarisation paramtrable


Nous allons tout d'abord prsenter une fonction permettant de raliser une binarisation avec un seuil saisi par l'utilisateur. Cette fonction utilise donc un champ texte pour rcuprer la valeur souhaite par l'utilisateur :

21

Algorithme 14 Fonction de binarisation paramtrable


%Fonction c h a r g e de b i n a r i s e r l ' image en e n t r e s e l o n 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 i a l ' i n t e r f a c e f u n c t i o n b i n a r i s a t i o n P a r a m ( hObject , eventdata , h a n d l e s ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire ( "y" : frame c o u l e u r ) I 4 = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s %Rcupration du s e u i l s e u i l=str2num ( g e t ( h a n d l e s . s e u i l , ' S t r i n g ' ) ) ; %C r a t i o n de l ' image b i n a r i s e imgBin=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; %Remplissage de l ' image en f o n c t i o n du s e u i l for p=1: hauteur for n=1: l a r g e u r i f ( I 4 ( p , n)> s e u i l ) imgBin ( p , n )=255;

else

end end %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( I 4 ) ; h i s t o S o r t i e=i m h i s t ( imgBin ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( I 4 ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( imgBin ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

end

imgBin ( p , n )=0;

Aprs avoir rcupr l'image en entre et pass cette dernire en niveau de gris, nous rcuprons le seuil saisi par l'utilisateur. Nous dclarons ensuite une nouvelle image qui contiendra le rsultat de la binarisation. Pour allouer cette image, nous avons recours la fonction zeros qui permet d'allouer une matrice de zros. Nous convertissons ensuite cette matrice en image contenant des pixels cods sur un octet l'aide de la fonction im2uint8. Pour raliser la binarisation, il nous sut de parcourir l'image l'aide de deux boucles for. Si la valeur du pixel courant est suprieure au seuil rcupr prcdemment, on passe sa valeur 255 (1) dans la nouvelle image (imgBin). Dans le cas contraire, on passe la valeur du pixel 0. Nous achons ensuite les images et les histogrammes de la mme manire que les fonctions prcdentes. Pour raliser une binarisation d'images paramtrable, il nous sut dsormais de cliquer sur le bouton Binarisation paramtrable de l'interface et de saisir le seuil voulu dans le champ texte prvu cet eet. Avec un seuil de 50, le rsultat obtenu est le suivant :

22

Figure 9  Binarisation d'images paramtrable (seuil=50)


Avec un seuil de 90, le rsultat obtenu est le suivant :

Figure 10  Binarisation d'images paramtrable (seuil=90)


Avec un seuil de 120, le rsultat obtenu est le suivant :

23

Figure 11  Binarisation d'images paramtrable (seuil=120)


Avec un seuil de 150, le rsultat obtenu est le suivant :

Figure 12  Binarisation d'images paramtrable (seuil=150)


Nous avons pu constater que la binarisation avec un seuil gale 50 produit une image majoritairement compose de pixels blancs. Ce rsultat est prvisible si l'on observe l'histogramme de l'image en entre. En eet, nous pouvons voir que trs peu de pixels utilisent des niveaux de gris infrieure 50. On obtient donc peu de

24

pixels noirs en sortie du traitement. Les seuils 90 et 120 permettent en revanche d'obtenir des binarisations de bonnes qualits. Le seuil de 150, en revanche, donne un rsultat peu convaincant cause de la prsence d'une zone 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 mthode d'Otsu


Nous allons maintenant prsenter une fonction ralisant de manire automatique le choix du seuil. Cette fonction utilise la mthode d'Otsu pour dterminer le seuil le plus adapt. Cette mthode utilise des concepts issus du domaine des probabilits pour dterminer un seuil optimale pour la binarisation. Matlab met disposition la mthode graythresh pour obtenir le seuil selon la mthode d'Otsu.

Algorithme 15 Fonction de binarisation selon la mthode d'Otsu


%Fonction c h a r g e de b i n a r i s e r l ' image en e n t r e s e l o n un s e u i l c a l c u l %l ' a i d e de l a mthode d ' Otsu ( f o n c t i o n g r a y t h r e s h ) f u n c t i o n b i n a r i s a t i o n O t s u ( hObject , eventdata , h a n d l e s ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire ( "y" : frame c o u l e u r ) I 4 = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s %Rcupration du s e u i l s e u i l=g r a y t h r e s h ( I 4 ) * 2 5 5 ; set ( handles . seuilChoisi , ' String ' , s e u i l ) %C r a t i o n de l ' image b i n a r i s e imgBin=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; %Remplissage de l ' image en f o n c t i o n du s e u i l for p=1: hauteur for n=1: l a r g e u r i f ( I 4 ( p , n)> s e u i l ) imgBin ( p , n )=255;

else

end end %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( I 4 ) ; h i s t o S o r t i e=i m h i s t ( imgBin ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( I 4 ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( imgBin ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

end

imgBin ( p , n )=0;

La fonction graythresh prend en paramtre l'image binariser et retourne un seuil compris entre 0 et 1. Il nous faut donc multiplier ce seuil par 255 pour pouvoir l'utiliser par la suite. Nous achons ensuite le seuil retourn par la mthode d'Otsu dans un champ texte. Pour cela, la mthode set est utilise. Cette dernire prend en paramtre le contrle dont la valeur doit tre modi, le type de la valeur et la valeur proprement parler. Nous appliquons ensuite la binarisation de la mme manire que prcdemment puis nous achons les images et les histogrammes.

25

Pour raliser une binarisation d'images selon la mthode d'Otsu, il nous sut dsormais de cliquer sur le bouton Binarisation Otsu de l'interface et de saisir le seuil voulu dans le champ texte prvu cet eet. Le rsultat obtenu est le suivant :

Figure 13  Binarisation d'images selon la mthode d'Otsu


La mthode d'Otsu a x un seuil 137 pour obtenir le rsultat ci-dessous. La binarisation est correcte mais on note que de nombreux dtails 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 mthodes probabilistes peuvent montrer leurs limites dans des cas o l'exposition du sujet n'est pas uniforme.

3.4 Quantication
La quantication, l'image de la binarisation, permet de rduire l'chelle chromatique utilise par l'image. Cette rduction peut tre apprciable dans le cadre de la compression d'images. En eet, lorsqu'une image utilise 256 niveau de gris, il est ncessaire d'utiliser un octet pour stocker la valeur de chaque pixel. Si nous pouvons convertir cette image de manire ce qu'elle utilise 16 niveau de gris, nous pourrions alors nous contenter de quatre bits pour coder chaque pixel. La taille de l'image s'en trouverait donc diviser par deux. Pour spcier le nombre de couleurs utilises 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 mmoriser la valeur du slider un instant donn. Nous plaons un gestionnaire d'vnement sur le slider pour mettre jour le champ texte :

26

Algorithme 16 Gestionnaire d'vnements du slider pour la quantication


% Executes on s l i d e r movement . f u n c t i o n slider_nbreNiveau_Callback ( hObject , eventdata , h a n d l e s ) % hObject handle to s l i d e r _ n b r e N i v e a u ( s e e GCBO) % eventdata r e s e r v e d to be d e f i n e d i n a f u t u r e v e r s i o n o f MATLAB % h a n d l e s s t r u c t u r e with h a n d l e s and u s e r data ( s e e GUIDATA) % Hints : g e t ( hObject , ' Value ' ) r e t u r n s p o s i t i o n o f s l i d e r % g e t ( hObject , ' Min ' ) and g e t ( hObject , 'Max ' ) to determine range o f s l i d e r %o b t a i n s the s l i d e r v a l u e from the s l i d e r component v a l e u r S l i d e r = g e t ( h a n d l e s . slider_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 v a l u e i n t o the e d i t t e x t component s e t ( h a n d l e s . nbreNiveau , ' S t r i n g ' , num2str ( v a l e u r S l i d e r ) ) ; % Update h a n d l e s s t r u c t u r e g u i d a t a ( hObject , h a n d l e s ) ;

Dans un premier temps, nous rcuprons la valeur du slider l'aide de la fonction get puis nous stockons cette valeur dans la variable valeurSlider. Il est noter que la valeur du slider est born par un minimum gale zro et un maximum gale 255. On place ensuite la valeur ainsi rcupr dans le champ texte l'aide de la mthode get puis nous mettons jour les dirents composants de l'interface en appelant la fonction guidata. Nous pouvons maintenant dvelopper la fonction permettant de quantier une image :

27

Algorithme 17 Fonction de quantication


%Fonction c h a r g e de r a l i s e r une q u a n t i f i c a t i o n de l ' image en e n t 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 i d e du s l i d e r ) f u n c t i o n q u a n t i f i c a t i o n ( hObject , eventdata , h a n d l e s ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire (" y" : frame c o u l e u r ) I 4 = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s %Rcupration du nombre de niveaux de g r i s n=g e t ( h a n d l e s . nbreNiveau , ' S t r i n g ' ) ; n=str2num ( n ) ; i f ( n<3) n=3; end ; %C a l c u l de l a t a i l l e des t r a n c h e s t r a n c h e=c e i l (256/ n ) ; %C r a t i o n du t a b l e a u contenant l e s c e n 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 dcoupe 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 t a b l e a u de c e n t r e s for p =0:(n 1) c e n t r e I n t e r v a l l e ( p+1)=round ( ( ( 2 5 6 / n ) * p )+((256/ n ) / 2 ) ) ; end %C r a t i o n de l ' image q u a n t i f i e imgQuan=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; %Q u a n t i f i c a t i o n de l ' image for p=1: hauteur for q=1: l a r g e u r i n d i c e =( f l o o r ( I 4 ( p , q )/ t r a n c h e )) +1; i f ( i n d i c e ==(n+1)) i n d i c e =(n ) ; end imgQuan ( p , q)= c e n t r e I n t e r v a l l e ( i n d i c e ) ; end end %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( I 4 ) ; h i s t o S o r t i e=i m h i s t ( imgQuan ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( I 4 ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( imgQuan ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;
Pour raliser la quantication, il nous faut tout d'abord rcupr le nombre de niveaux de gris depuis le champ texte. On calcule ensuite la taille des tranches en divisant l'chelle totale des niveaux de gris (256) par le nombre de niveaux de gris souhaits. Ces tranches sont utiliss pour rpartir les dirents pixels entre les niveaux de gris choisi pour l'image de sortie. Ainsi, si les tranches ont une taille de 50, tous les pixels ayant un niveau de gris entre 0 et 50 se verront aects la valeur choisie pour cette tranche. Les valeurs des niveaux de gris de sortie sont stockes dans le tableau centreIntervalle. Ce dernier a donc une taille gale au nombre de niveaux de gris en sortie. Nous initialisons ensuite ce tableau. Pour cela, nous calculons les centres de chaque

28

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 divise par deux (an d'obtenir le centre de l'intervalle). Pour quantier l'image, il nous faut maintenant parcourir cette dernire l'aide de deux boucles for. Pour chacun des pixels, nous calculons l'intervalle correspondant au niveau du gris du pixel. Pour cela, on divise le niveau de gris par la taille de la tranche (nous ajoutons 1 car les tableaux dmarrent 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 ainsi obtenue. Pour raliser une quantication d'images, il nous sut dsormais de cliquer sur le bouton Quantication de l'interface et de rgler le nombre de niveaux de gris souhaits en sortie l'aide du slider. Avec un nombre de niveaux de gris gale 3, le rsultat obtenu est le suivant :

Figure 14  Quantication d'images (niveaux de gris=3)


Avec un nombre de niveaux de gris gale 5, le rsultat obtenu est le suivant :

29

Figure 15  Quantication d'images (niveaux de gris=5)


Avec un nombre de niveaux de gris gale 10, le rsultat obtenu est le suivant :

Figure 16  Quantication d'images (niveaux de gris=10)


Avec un nombre de niveaux de gris gale 25, le rsultat obtenu est le suivant :

30

Figure 17  Quantication d'images (niveaux de gris=25)


Avec un nombre de niveaux de gris gale 50, le rsultat obtenu est le suivant :

Figure 18  Quantication d'images (niveaux de gris=50)


Nous pouvons tout d'abord voir qu' partir de 25 niveaux de gris, il est dicile de voir que l'image a t quantie. Ce traitement peut donc permettre de comprimer une image tout en conservant une grande partie des dtails. On peut voir galement que lorsque le nombre de niveaux de gris est assez lev, il est assez facile de se faire une ide de la tendance de l'histogramme d'origine.

31

3.5 Amlioration d'images


Nous allons maintenant tudier des traitements qui permettent d'amliorer la qualit de l'image en ralisant des modications se basant sur l'histogramme de l'image en entre.

3.5.1 tirement d'histogrammes


Le premier traitement destin l'amlioration d'images que nous allons prsenter est l'tirement d'histogrammes. Ce traitement est utilis pour renforcer le contraste d'une image. Une image peu contraste est une image n'utilisant pas la totalit de l'chelle chromatique mise sa disposition. Ainsi, une image utilisant des niveaux de gris compris entre 45 et 135 un contraste peu lev relativement une image utilisant l'ensemble des 256 niveaux de gris. L'tirement a donc pour but de redployer les niveaux de gris sur l'ensemble de l'chelle des niveaux de gris. La valeur d'intensit la plus faible aura dsormais pour valeur 0 et la valeur d'intensit la plus haute de l'image aura dsormais pour valeur 255. L'tirement a pour eet d'loigner les valeurs de l'histogramme. Les pixels foncs seront donc un peu plus foncs et les pixels clairs un peu plus clairs. Pour raliser la transformation qu'est l'tirement, il nous faut appliquer la transformation suivante :

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


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

i j = 255

Cette transformation peut tre reprsent par la fonction suivante :

Figure 19  Fonction de transformation pour l'tirement


Le graphique ci-dessus permet de raliser la correspondance entre les niveaux de gris de l'image en entre et les niveaux de gris de l'image en sortie. Les niveaux de gris de l'image en entre, situs en abscisses, sont rpartis entre les bornes a et b. La fonction de transformation permet de rpartir ces niveaux entre 0 et 255 sur l'axe des ordonnes. La fonction Matlab suivante permet de raliser un tirement d'histogramme :

32

Algorithme 18 Fonction d'tirement


%Fonction c h a r g e de l i n a r i s e r l ' image en e n t r e f u n c t i o n e t i r e m e n t ( hObject , eventdata , h a n d l e s ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire ( "y" : frame c o u l e u r ) I 4 = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s %Rcupration du niveau de g r i s minimum de l ' image en e n t r e %( U t i l i s a t i o n des f o n c t i o n s min e t max , on a p e l l e une p r e m i r e f o i s l a %f o n c t i o n pour o b t e n i r l e minimum de chaque l i g n e de l a m a t r i c e image %e t une deuxime f o i s pour o b t e n i r l e minimum des minimums ) minimum=(min ( min ( I 4 ) ) ) ; maximum=(max(max( I 4 ) ) ) ; %C r a t i o n de l ' image l i n a r i s e imgLin=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; %Q u a n t i f i c a t i o n de l ' image f o r p=1: hauteur f o r q=1: l a r g e u r imgLin ( p , q )=255 * (( double ( I 4 ( p , q)minimum)/ double (maximumminimum ) ) ) ; end end %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( I 4 ) ; h i s t o S o r t i e=i m h i s t ( imgLin ) ; %C o n s t r u c t i o n de l a courbe t r a n s f o L 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 o L 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 o L i n e a i r e ( p )=(( double ( t r a n s f o L i n e a i r e ( p)minimum)/ double (maximumminimum ) ) ) * 2 5 5 ; e l s e i f ( p>=maximum) t r a n s f o L i n e a i r e ( p )=255; end end %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( I 4 ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( imgLin ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes5 ) ; plot ( transfoLineaire ) ; x l a b e l ( ' Entre ' ) ; ylabel ( ' Sortie ' );

Nous rcuprons tout d'abord l'image en entre puis nous convertissons celle ci en niveau de gris. On cherche ensuite dnir les bornes a et b de l'image. Pour cela, les fonctions min et max sont utilises. Ces fonctions sont utiliss deux fois conscutivement : la premire 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. Aprs avoir allou l'image rsultat, nous parcourons l'ensemble de l'image en entre pour appliquer la formule donne pr-

33

cdemment. Aprs avoir construit les histogrammes, nous construisons la fonction de transformation. Pour cela, nous allouons un tableau de 256 valeurs nomm transfoLineaire. Chaque case de ce tableau contient la valeur de la fonction de transformation pour le niveau de gris donn par l'indice. Aprs avoir calcul les 256 valeurs du tableau, nous achons les images, les histogrammes et la fonction de transformation dans les axes prvus cet eet. Pour raliser un tirement d'histogrammes, il nous sut dsormais de cliquer sur le bouton tirement de l'interface. Le rsultat obtenu est le suivant :

Figure 20  tirement d'histogrammes


On peut voir sur l'histogramme de sortie que, dsormais, l'ensemble des niveaux de gris est utilis. Cela se traduit par un contraste plus lev sur l'image de sortie. La fonction de transformation nous permet de voir que les niveaux de gris de l'image en entre 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 rpartition des niveaux de gris de l'image en aplatissant l'histogramme de cette dernire. L'galisation d'une image est compos des tapes suivantes. Aprs avoir construit l'histogramme de l'image, on calcule tout d'abord les densits de probabilits de chaque niveau de gris de l'image. Il s'agit de calculer le probabilit d'apparition de chaque niveau de gris. Pour se faire, on comptabilise les pixels ayant un niveau de gris donn puis on divise le chire ainsi obtenu par le nombre total de pixels dans l'image. Grce aux densits de probabilits, nous pouvons construire la fonction de rpartition. Pour cela, il sut de cumuler les densits de probabilits obtenues prcdemment. Grce la fonction de rpartition, il nous est maintenant possible de convertir les niveaux de gris de l'image d'entre l'aide de la formule suivante :

T (a) = (bmax bmin) F (a) + bmin


avec a= niveau de gris convertir, bmin= niveau de gris minimal souhait pour l'image rsultat, bmax= niveau de gris maximal souhait pour l'image rsultat et F= la fonction de rpartition La fonction Matlab suivante permet de raliser une galisation d'histogramme :

34

Algorithme 19 Fonction d'galisation


%Fonction c h a r g e d ' g a l i s e r l ' image en e n t r e f u n c t i o n e g a l i s a t i o n ( hObject , eventdata , h a n d l e s ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire (" y" : frame c o u l e u r ) I 4 = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s %C a l c u l des d e n s i t s de p r o b a b i l i t s %C r a t i o n d ' un v e c t e u r contenant l e s d e n s i t s d e n s i t e P r o b a =0:255; %I n i t i a l i s a t i o n du t a b l e a u de d e n s i t s for p=1:256 d e n s i t e P r o b a ( p )=0; end %Parcours de l ' image e t c a l c u l des d e n 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 c o u l e u r f o r p=1: hauteur f o r n=1: l a r g e u r i n d i c e=y ( p , n )+1; d e n s i t e P r o b a ( i n d i c e )= d e n s i t e P r o b a ( i n d i c e )+1; end end %D i v i s i o n des compteurs par l e nombre de p i x e l s t o t a l pour o b t e n i r l a %p r o b a b i l i t d ' a p p a r i t i o n de chaque niveau de g r i s for p=1:256 d e n s i t e P r o b a ( p)= double ( d e n s i t e P r o b a ( p ) / ( hauteur * l a r g e u r ) ) ; end %C r a t i o n d ' un v e c t e u r contenant l a f o n c t i o n de r p a r t i t i o n fo nc tio nR ep =0:255; %I n i t i a l i s a t i o n du t a b l e a u f o r p=1:256 fo nc tio nR ep ( p )=0; end %C a l c u l de l a f o n c t i o n de r p a r t i t i o n fo nc tio nR ep (1)= d e n s i t e P r o b a ( 1 ) ; f o r p=2:256 fo nc tio nR ep ( p)= double ( d e n s i t e P r o b a ( p))+ double ( fon ct io nRe p ( p 1)) ; end %C r a t i o n de l ' image g a l i s e imgEgal=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; a=0; b=255; %E g a l i s a t i o n de l ' image f o r p=1: hauteur f o r n=1: l a r g e u r imgEgal ( p , n )=(( ( ba ) * fo nc tio nR ep ( ( I 4 ( p , n))+1))+ a ) ; end end %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( I 4 ) ; h i s t o S o r t i e=i m h i s t ( imgEgal ) ; %C o n s t r u c t i o n de l a courbe t r a n s f o L i n e a i r e =0:255;

35

Algorithme 20 Fonction d'galisation (Suite)


t r a n s f o L i n e a i r e ( p )=( (( ba ) * fo nc tio nR ep ( p))+a ) / 2 5 6 ; end %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( I 4 ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( imgEgal ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes5 ) ; plot ( transfoLineaire ) ; x l a b e l ( ' Entre ' ) ; ylabel ( ' Sortie ' );

for p=1:256

Comme nous l'avons dit un peu plus tt, nous calculons tout d'abord les densits de probabilits. Pour se faire, nous allouons un tableau densiteProba de 256 cases. Nous parcourons ensuite l'image en incrmentant les dirents compteurs contenus dans le tableau densiteProba. Pour terminer le calcul des densits, nous divisons chaque compteur du tableau par le nombre de pixels de l'image. Nous crons ensuite la fonction de rpartition en cumulant les valeurs des densits de probabilits. Aprs avoir construit cette fonction, il nous sut de parcourir l'image une dernire fois pour appliquer la formule prsente prcdemment. Pour raliser une galisation d'histogrammes, il nous sut dsormais de cliquer sur le bouton galisation de l'interface. Le rsultat obtenu est le suivant :

Figure 21  galisation d'histogrammes


36

On peut voir que l'galisation a permis de rpartir les pixels parmi l'ensemble des niveaux de gris de l'image. On peut galement remarquer que l'galisation permet galement de raliser un tirement de l'histogramme. On obtient donc un histogramme en sortie utilisant l'ensemble des niveaux de gris et avec des proportions quasi identiques (La discrtisation de l'image ne permet pas d'obtenir un histogramme constant). Enn, la fonction de transformation a une allure similaire celle tudies lors des travaux dirigs de traitements d'images.

4 Filtrages de bruit et de ou


Lors de l'acquisition d'une image, de nombreux facteurs peuvent altrer la qualit du rsultat. Une mauvaise condition d'observation, les dfauts du capteur, les poussires ou les rayures sont autant de sources de bruits et de ous. Nous allons prsenter dans cette partie des traitements permettant de restaurer une image dans le but de pouvoir fournir aux traitements de plus haut niveau (reconnaissances de formes etc etc) des images de qualit.

4.1 Types de bruits


Dans un premier temps, nous allons prsenter les trois types de bruits qui seront utiliss dans le cadre de ces travaux pratiques. Nous prsenterons le code Matlab permettant d'ajouter ces dirents bruits aux images acquises.

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 donnes, la dfaillance d'un capteur ou bien la prsence de particules sur le capteur. Ce bruit se caractrise par l'apparition alatoire de pixels blancs et noirs sur l'image en sortie. Les gures suivantes prsentent une mme image plus ou moins altre par un bruit sel et poivre :

37

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'instar de la lumire blanche, les bruits de ce type sont composs de toutes les frquences. Le bruit Gaussient se traduit par l'ajout d'un grain l'image. Ce dernier dtriore les contours et les dtails les moins marqus de l'image. Les gures suivantes prsentent une mme image plus ou moins altre par un bruit gaussien :

38

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 caractriser l'apparition d'vnements rares sans mmoire (les vnements sont indpendants les uns des autres). Cette loi peut tre utilise pour caractris l'apparition de fautes d'orthographes dans un compte rendu de travaux pratiques ou encore le nombre de personnes atteintes d'une maladie donne. Le bruit de Poisson va donc ajouter des erreurs dans l'image selon la loi de Poisson. Les gures suivantes prsentent une mme image plus ou moins altre par un bruit de Poisson :

39

Figure 24  Bruit suivant la loi de Poisson


4.1.4 Mise en place du bruit sous Matlab
Nous allons maintenant prsenter le code utilis pour ajouter les bruits prsents ci-dessus aux images acquises. Pour choisir le bruit ajouter l'image d'entre, l'utilisateur a sa disposition un ensemble de boutons radios. Les boutons radios radioSelPoivre, radioGaussien et radioPoisson permettant respectivement de choisir le bruit Sel et poivre, Gaussien et Poisson sont ajouts au Button Group selectionBruit. Nous ajoutons galement un champ texte invisible pour stocker la valeur du bruit slectionn. La fonction ci-dessous permet de rcuprer le choix de l'utilisateur :

Algorithme 21 Fonction de slection du bruit


f u n c t i o n s e l e c t i o n B r u i t _ S e l e c t i o n C h a n g e F c n ( hObject , eventdata , h a n d l e s ) % hObject handle to the s e l e c t e d o b j e c t i n s e l e c t i o n B r u i t % eventdata s t r u c t u r e with the f o l l o w i n g f i e l d s ( s e e UIBUTTONGROUP) % EventName : s t r i n g ' SelectionChanged ' ( read only ) % OldValue : handle o f the p r e v i o u s l y s e l e c t e d o b j e c t or empty i f none was s e l e c t e d % NewValue : handle o f the c u r r e n t l y s e l e c t e d o b j e c t % handles s t r u c t u r e with h a n d l e s and u s e r data ( s e e GUIDATA) switch g e t ( eventdata . NewValue , ' Tag ' ) case ' r a d i o G a u s s i e n ' s e t ( h a n d l e s . b r u i t C h o i s i , ' S t r i n g ' , ' Gaussien ' ) ; case ' r a d i o P o i s s o n ' set ( handles . bruitChoisi , ' String ' , ' Poisson ' ) ; case ' r a d i o S e l P o i v r e ' set ( handles . bruitChoisi , ' String ' , ' Sel et poivre ' ) ; otherwise % Code for when t h e r e i s no match . end

Ce gestionnaire d'vnement capte les vnements concernant le Button Group ajout prcdemment. Ainsi, lorsqu'un des radios boutons situs l'intrieur du groupe est modi, le gestionnaire est excut. Nous

40

rcuprons tout d'abord le tag du composant rcemment modi (le radio bouton qui vient d'tre cliqu). En fonction du tag du radio bouton, nous xons ensuite la valeur du champ texte invisible. La fonction ci-dessous permet d'ajouter un bruit l'image en fonction de la valeur du champ texte invisible :

Algorithme 22 Fonction d'ajout de bruits


%Fonction c h a r g e d ' a p p l i q u e r un b r u i t ( c h o i s i par l ' u t i l i s a t e u r l ' a i d e %des r a d i o s buttons ) l ' image d ' e n t r e f u n c t i o n imgBruit=b r u i t ( hObject , eventdata , h a n d l e s ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire ( "y" : frame c o u l e u r ) I 4 = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s imgBruit=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; %A p p l i c a t i o n du b r u i t b r u i t=g e t ( h a n d l e s . b r u i t C h o i s i , ' S t r i n g ' ) ; switch b r u i t case ' Gaussien ' v a r i a n c e=g e t ( h a n d l e s . v a r i a n c e , ' S t r i n g ' ) ; v a r i a n c e=str2num ( v a r i a n c e ) ; imgBruit=i m n o i s e ( I4 , ' g a u s s i a n ' , 0 , v a r i a n c e ) ; case ' P o i s s o n ' gB ruit=i m n o i s e ( I4 , ' p o i s s o n ' ) ; case ' S e l e t p o i v r e ' d e n s i t e=g e t ( h a n d l e s . d e n s i t e , ' S t r i n g ' ) ; d e n s i t e=str2num ( d e n s i t e ) ; imgBruit=i m n o i s e ( I4 , ' s a l t & pepper ' , d e n s i t e ) ; otherwise % Code for when t h e r e i s no match . end

Aprs avoir rcupr l'image en entre et convertit cette dernire en niveau de gris, nous allouons l'image rsultat de la fonction (imgBruit). Il est noter que cette dernire est retourn par la fonction. L'ajout de valeurs de retour est eectu en ajoutant le nom des variables retournes aprs le mot-clef function. Aprs avoir rcupr la valeur du champ texte invisible bruitChoisi, on ajoute le bruit souhait l'aide de la fonction imnoise. Cette fonction prend en paramtre l'image modier, le type du bruit ajouter ainsi qu'un certain nombre d'ventuels paramtres. Le bruit Gaussien peut tre paramtr avec une moyenne et une variance. Dans notre cas, nous ne modierons que la variance. Enn, le bruit Sel et poivre peut tre paramtr avec une densit. La fonction bruit est excut avant le lancement des fonctions de ltrage. Nous allons maintenant prsenter ces dernires.

4.2 Filtre mdian


Le premier ltre que nous allons prsent est le ltre mdian. Il s'agit d'un ltre non linaire. Un ltre est dit non-linaire si chaque pixel rsultat ne peut pas tre obtenu l'aide d'une combinaison linaire des pixels du voisinage. Le principe du ltre mdian est le suivant : chaque pixel de l'image est remplac par la mdiane des valeurs des pixels voisins. La gure suivante prsente le fonctionnement d'un ltre mdian de taille 3x3 :

41

Figure 25  Fonctionnement d'un ltre mdian


L'image ltrer est reprsente par le tableau gauche. On s'intresse plus particulirement au ltrage des pixels entoures de rouge et de vert. Pour ltrer le pixel rouge, on rcupre tout d'abord les valeurs des huit pixels voisins ainsi que la valeur du pixel ltrer. Le nombre de pixels concerns dpend directement de la taille du ltre. Dans le cas d'un ltre de taille 3x3, nous rcuprons neuf valeurs de pixels pour en ltrer un seul. La deuxime tape du ltrage consiste trier les neuf valeurs rcupres. Aprs ce tri, il nous sut de rcuprer la valeur mdiane 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 mdians : le ltrage de bruit impulsionnel. On peut voir que la valeur du pixel en vert est bien suprieur ses voisins. On peut donc imaginer qu'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 mdian va nous permettre de supprimer cette valeur. En eet, lors du tri de la liste des valeurs, les pixels ayant des valeurs extrmes auront tendance se retrouver sur les extrmits de la liste. Ainsi, ils auront peu de chances d'tre lu en tant que valeur mdiane. Ce type de ltres prsente toutefois des inconvnients. Ce ltre a notamment tendance dformer les contours de l'image.

4.2.1 Utilisation de medlt2


Nous allons prsenter une premire fonction ralisant un ltrage mdian qui utilise la mthode Matlab medlt2.

42

Algorithme 23 Fonction de ltrage mdian (medlt2)


%Fonction c h a r g e de c o r r i g e r l ' image b r u i t e en e n t r e l ' a i d e d ' un %f i l t r e mdian f u n c t i o n f i l t r e M e d i a n ( hObject , eventdata , handles , imgBruit ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; i m g B r u i t O r i g i n e=imgBruit ; %Rcupration du nombre de p a s s e s e t de l a t a i l l e du f i l t r e t a i l l e F i l t r e=g e t ( h a n d l e s . 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 1 t a i l l e F i l t r e =3; case 2 t a i l l e F i l t r e =5; case 3 t a i l l e F i l t r e =7; case 4 t a i l l e F i l t r e =9; case 5 t a i l l e F i l t r e =11; otherwise end nombrePasses=g e t ( h a n d l e s . nombrePasses , ' Value ' ) ; %A p p l i c a t i o n du f i l t r e mdian i m g F i l t r e=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; for p=1: nombrePasses i m g F i l t r e=m e d 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=i m g F i l t r e ; end %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( i m g B r u i t O r i g i n e ) ; h i s t o S o r t i e=i m h i s t ( i m g F i l t r e ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( i m g B r u i t O r i g i n e ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( i m g F i l t r e ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

Nous rcuprons tout d'abord les dimensions de l'image. Aprs cela, nous ralisons une copie de l'image bruite passe en entre de la fonction. Cette copie permettra de conserver l'image d'origine en vue de l'achage nal (Achage de l'image bruite gauche et de l'image ltre droite). Nous rcuprons ensuite la conguration du ltre. L'utilisateur peut en eet paramtrer la taille du ltre l'aide d'une liste droulante (3x3, 5x5, 7x7, 9x9 et 11x11). Nous rcuprons galement le nombre de passes (nombre d'applications du ltre). Aprs avoir allou l'image rsultat, nous dmarrons une boucle for. Le nombre d'itrations de cette boucle est x par le nombre de passes rcupr prcdemment. Pour chaque itration, nous ltrons l'image l'aide de la fonction medlt2 en passant en paramtre l'image bruite et les dimensions du ltre. Aprs avoir appliqu le ltre autant de fois que ncessaire, nous achons les histogrammes et les images dans les contrles prvus cet eet. Pour raliser un ltrage mdian de l'image d'entre, il nous sut dsormais de cliquer sur le bouton Filtre

43

mdian de l'interface prsente un peu plus tt dans ce dossier en ayant au pralable congur la taille du ltre et le nombre de passes. Nous allons tout d'abord nous intresser au rsultat d'un ltrage mdian sur un bruit sel et poivre. Avec un bruit sel et poivre de densit 0.005 trait par un ltre mdian de taille 3x3 une seule reprise, le rsultat obtenu est le suivant :

Figure 26  Filtre mdian 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 mdian de taille 3x3 une seule reprise, le rsultat obtenu est le suivant :

44

Figure 27  Filtre mdian 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 mdian de taille 3x3 une seule reprise, le rsultat obtenu est le suivant :

Figure 28  Filtre mdian 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 mdian de taille 7x7 une seule reprise, le rsultat obtenu est le suivant :

45

Figure 29  Filtre mdian 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 mdian de taille 11x11 une seule reprise, le rsultat obtenu est le suivant :

Figure 30  Filtre mdian 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 mdian de taille 3x3 deux reprises, le rsultat obtenu est le suivant :

46

Figure 31  Filtre mdian 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 mdian de taille 3x3 cinq reprises, le rsultat obtenu est le suivant :

Figure 32  Filtre mdian 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 mdian de taille 3x3 dix reprises, le rsultat obtenu est le suivant :

47

Figure 33  Filtre mdian 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 mdian de taille 5x5 deux reprises, le rsultat obtenu est le suivant :

Figure 34  Filtre mdian sur un bruit sel et poivre (densit : 0.5, 2 passes, taille 5x5)
Ces direntes illustrations conrment que le ltre mdian est trs ecace pour liminer les bruits impulsionnels comme le bruit poivre et sel. Pour des densits gale 0.005 et 0.05, l'image ltre est trs proche de l'image d'origine (non bruite). Avec une densit de 0.5, des rsidus subsistent aprs le ltrage. Nous constatons

48

toutefois que sur l'image bruite, il est dicile de dterminer la nature de l'image alors qu'aprs ltrage, il est tout fait possible de distinguer les formes principales. Pour supprimer les rsidus, nous pouvons augmenter la taille du ltre, le nombre de passes ou mme combiner les deux. Nous constatons que l'augmentation de la taille du ltre a tendance diminuer la nettet des contours. Le contraste entre les direntes rgions de l'image deviennent alors moins nettes. En revanche, l'augmentation du nombre de passes conservent relativement bien la nettet des contours. Toutefois, les dformations de ces derniers sont plus important que dans le cas d'une augmentation de la taille du ltre. Pour liminer les rsidus ecacement tout en conservant une qualit de l'image acceptable, nous dcidons d'augmenter un peu ces deux paramtres (2 passes avec un ltre 5x5). Nous obtenons alors un ltrage tout fait satisfaisant. Nous allons maintenant tudier le comportement du ltre mdian sur une image bruite par un bruit gaussien. Avec un bruit gaussien ayant une variance gale 0.001 trait par un ltre mdian de taille 3x3 une reprise, le rsultat obtenu est le suivant :

Figure 35  Filtre mdian 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 mdian de taille 3x3 une reprise, le rsultat obtenu est le suivant :

49

Figure 36  Filtre mdian 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 mdian de taille 3x3 une reprise, le rsultat obtenu est le suivant :

Figure 37  Filtre mdian 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 mdian de taille 7x7 une reprise, le rsultat obtenu est le suivant :

50

Figure 38  Filtre mdian 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 mdian de taille 3x3 deux reprises, le rsultat obtenu est le suivant :

Figure 39  Filtre mdian 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 mdian de taille 7x7 deux reprises, le rsultat obtenu est le suivant :

51

Figure 40  Filtre mdian sur un bruit gaussien (variance :0.01, 2 passes, taille 7x7)
Les captures d'crans ci-dessus nous permettent de voir que le ltre mdian est relativement inecace pour liminer un bruit gaussien. Malgr l'augmentation de la taille du ltre et du nombres de passes, nous n'arrivons pas obtenir une image en sortie correcte. Le ltre mdian a mme tendance taler les eets du bruit sur l'ensemble des pixels. Pour nir, nous allons tudier le comportement du ltre mdian sur une image bruite par un bruit de Poisson. Avec un bruit de Poisson trait par un ltre mdian de taille 3x3 une reprise, le rsultat obtenu est le suivant :

52

Figure 41  Filtre mdian sur un bruit de Poisson (1 passe, taille 3x3)


Avec un bruit de Poisson trait par un ltre mdian de taille 7x7 une reprise, le rsultat obtenu est le suivant :

Figure 42  Filtre mdian sur un bruit de Poisson (1 passe, taille 7x7)


Avec un bruit de Poisson trait par un ltre mdian de taille 3x3 deux reprises, le rsultat obtenu est le suivant :

53

Figure 43  Filtre mdian sur un bruit de Poisson (2 passes, taille 3x3)


Avec un bruit de Poisson trait par un ltre mdian de taille 7x7 deux reprises, le rsultat obtenu est le suivant :

Figure 44  Filtre mdian 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 mdian malgr l'augmentation de la taille du ltre et du nombre de passes (On note une lgre amlioration tout de mme).

54

4.2.2 Algorithme maison


Nous allons maintenant prsenter une deuxime fonction permettant de raliser un ltrage mdian l'aide d'un algorithme maison :

Algorithme 24 Fonction de ltrage mdian (Algorithme maison)


%Fonction c h a r g e de c o r r i g e r l ' image b r u i t e en e n t r e l ' a i d e d ' un %f i l t r e mdian f u n c t i o n f i l t r e M e d i a n M a i s o n ( hObject , eventdata , handles , imgBruit ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; i m g B r u i t O r i g i n e=imgBruit ; %A p p l i c a t i o n du f i l t r e mdian i m g F i l t r e=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; for i =2:( hauteur 1) for j =2:( l a r g e u r 1) %Tri des v a l e u r s v a l e u r = 0:8; i n d i c e =1; for k=( i 1):( i +1) for l =(j 1):( j +1) v a l e u r ( i n d i c e )=imgBruit ( k , l ) ; i n d i c e=i n d i c e +1; end end v a l e u r=s o r t ( v a l e u r ) ; %Changement de l a v a l e u r du p i x e l par l a v a l e u r mdiane du %t a b l e a u t r i i m g F i l t r e ( i , j )= v a l e u r ( 5 ) ; end end %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( i m g B r u i t O r i g i n e ) ; h i s t o S o r t i e=i m h i s t ( i m g F i l t r e ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( i m g B r u i t O r i g i n e ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( i m g F i l t r e ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

Pour appliquer le ltrage mdian, nous parcourons l'ensemble des pixels de l'image acquise l'aide de deux boucles for imbriques. Un tableau de neuf cases nomm valeur est utilis pour stocker les valeurs des pixels utiliss pour ltrer le pixel courant. On rcupre et on stocke les valeurs des voisins l'aide de deux nouvelles boucles for permettant de parcourir le voisinage du pixel courant. Aprs avoir rcupr les valeurs, il nous sut de trier le tableau l'aide de la fonction sort. On rcupre ensuite la valeur mdiane qui sera utilis comme valeur du pixel courant dans l'image rsultat. Nous achons ensuite les histogrammes et les images. Pour raliser un ltrage mdian maison de l'image d'entre, il nous sut dsormais de cliquer sur le bouton Filtre mdian maison de l'interface prsente un peu plus tt dans ce dossier en ayant au pralable congur la taille du ltre et le nombre de passes. Les rsultats obtenus par cette fonction sont identiques aux rsultats prsents prcdemment. L'excution de notre fonction maison est toutefois moins rapide que l'excution de la fonction utilisant la fonction medlt2.

55

4.3 Filtre moyenneur


Nous allons maintenant tudier le ltre moyenneur. Il s'agit d'un ltre linaire. Un ltre est dit linaire si chaque pixel rsultat est obtenu l'aide d'une combinaison linaire des pixels du voisinage. Le ltre moyenneur est un ltre passe-bas. Il permet d'adoucir d'une image. Le principe du ltre moyenneur est le suivant : chaque pixel de l'image est remplac par la moyenne des valeurs des pixels voisins. La gure suivante prsente le fonctionnement d'un ltre moyenneur de taille 3x3 :

Figure 45  Fonctionnement d'un ltre moyenneur


Le ltre moyenneur s'applique grce une convolution.

4.3.1 Utilisation de imlter


Nous allons prsenter une premire fonction de ltre moyenneur utilisant la fonction imlter. Cette fonction permet d'appliquer un ltre une image par convolution :

56

Algorithme 25 Fonction de ltrage moyenneur (imlter)


%Fonction c h a r g e de c o r r i g e r l ' image b r u i t e en e n t r e l ' a i d e d ' un %f i l t r e moyenneur f u n c t i o n f i l t r e M o y e n n e u r ( hObject , eventdata , handles , imgBruit ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; i m g B r u i t O r i g i n e=imgBruit ; %Rcupration du nombre de p a s s e s , de l a t a i l l e du f i l t r e e t du type de %g e s t i o n des b o r d u r e s de l ' image t a i l l e F i l t r e=g e t ( h a n d l e s . 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 1 t a i l l e F i l t r e =3; case 2 t a i l l e F i l t r e =5; case 3 t a i l l e F i l t r e =7; case 4 t a i l l e F i l t r e =9; case 5 t a i l l e F i l t r e =11; otherwise end nombrePasses=g e t ( h a n d l e s . nombrePasses , ' Value ' ) ; bordure=g e t ( h a n d l e s . bordure , ' Value ' ) ; s w i t c h bordure case 1 bordure= ' symmetric ' ; case 2 bordure= ' r e p l i c a t e ' ; case 3 bordure= ' c i r c u l a r ' ; otherwise end %C o n s t r u c t i o n du f i l t r e f i l t r e M o y e n n e=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 e f i l t r e M o y e n n e ( i , j )= f i l t r e M o y e n n e ( 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 ) ; end end %A p p l i c a t i o n du f i l t r e moyenneur i m g F i l t r e=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; f o r p=1: nombrePasses i m g F i l t r e=i m f i l t e r ( imgBruit , f i l t r e M o y e n n e , bordure ) ; imgBruit=i m g F i l t r e ; end %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( i m g B r u i t O r i g i n e ) ; h i s t o S o r t i e=i m h i s t ( i m g F i l t r e ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( i m g B r u i t O r i g i n e ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( i m g F i l t r e ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;
57

Aprs avoir rcupr les dimensions de l'image, nous rcuprons la taille du ltre souhaite, le nombre de passes et le type de gestion des bordures. Ce dernier paramtre peut prendre trois valeurs. Ce paramtre permet de spcier comment seront grs les pixels situs en bordure. En eet, pour ces pixels, il est ncessaire d'utiliser des pixels hors images pour calculer leur valeur. Le mode 'Symmetric' permet de spcier que les pixels situs au del des limites de l'image sont le symtrique de l'image. Ainsi le pixel situ juste aprs la limite de l'image a la mme valeur que celui situ avant la limite. Le mode 'Replicate' permet de spcier que les valeurs situs aprs les limites de l'image ont la mme valeur que les pixels situs en bordure de l'image. Enn, le mode 'Circular' permet de rpter l'image au del des bordures. Ainsi, le pixel situ juste aprs la limite droite de l'image par exemple aura la valeur du pixel le plus gauche dans l'image. Aprs avoir rcupr les paramtres, nous crons le ltre moyenneur. Ce dernier est compos de neuf valeurs gale 1/9. Nous crons tout d'abord un ltre de ct gale la taille du ltre passe en paramtre rempli de 1 l'aide de la fonction ones. Nous parcourons ensuite le ltre l'aide de deux boucles for en divisant chaque valeur par le carr de la taille du ltre. Nous appliquons ensuite ce ltre sur l'image l'aide de la mthode imlter autant de fois que ncessaire (nombre de passes). Pour appliquer un ltre moyenneur l'image d'entre, il nous sut dsormais de cliquer sur le bouton Filtre moyenneur de l'interface prsente un peu plus tt dans ce dossier en ayant au pralable congur la taille du ltre, le nombre de passes et le type de gestion des bordures. Nous allons tout d'abord nous intresser au rsultat 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 rsultat 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 rsultat obtenu est le suivant :

58

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, le rsultat 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 ecaces en prsence de bruit impulsionnel. L'application d'un ltre moyenneur a pour eet de dilater les pixels noirs et blancs. La qualit de l'image rsultat est

59

donc relativement mdiocre. On peut noter toutefois que l'augmentation de la taille du ltre permet de faire disparatre en partie les pixels parasites. Toutefois, nous constatons l'apparition d'un ou important sur l'image rsultat. Nous allons maintenant nous intresser au rsultat 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 une reprise, le rsultat 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 une reprise, le rsultat obtenu est le suivant :

60

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 une reprise, le rsultat 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 une reprise, le rsultat obtenu est le suivant :

61

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 deux reprises, le rsultat 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 deux reprises, le rsultat obtenu est le suivant :

62

Figure 54  Filtre moyenneur sur un bruit gaussien (variance :0.01, 2 passes, taille 7x7)
Nous pouvons voir que les rsultats obtenus par le ltre moyenneur avec le bruit gaussien sont quasiment identiques ceux obtenus avec le ltre mdian. Pour nir, nous allons observer les eets 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 rsultat obtenu est le suivant :

63

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 rsultat obtenu est le suivant :

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 rsultat obtenu est le suivant :

64

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 rsultat obtenu est le 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 prix de l'apparition d'un ou important sur l'ensemble de l'image.

65

4.3.2 Algorithme maison


Nous allons maintenant prsenter une deuxime fonction permettant d'appliquer un ltre moyenneur l'aide d'un algorithme maison :

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


%Fonction c h a r g e de c o r r i g e r l ' image b r u i t e en e n t r e l ' a i d e d ' un %f i l t r e moyenneur f u n c t i o n f i l t r e M o y e n n e u r M a i s o n ( hObject , eventdata , handles , imgBruit ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; i m g B r u i t O r i g i n e=imgBruit ; %A p p l i c a t i o n du f i l t r e moyenneur i m g F i l t r e=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; for i =2:( hauteur 1) for j =2:( l a r g e u r 1) v a l e u r = 0:8; i n d i c e =1; for k=( i 1):( i +1) for l =(j 1):( j +1) v a l e u r ( i n d i c e )=imgBruit ( k , l ) ; i n d i c e=i n d i c e +1; end end %Changement de l a v a l e u r du p i x e l par l a moyenne i m g F i l t r e ( i , j )=mean ( v a l e u r ) ; end end %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( i m g B r u i t O r i g i n e ) ; h i s t o S o r t i e=i m h i s t ( i m g F i l t r e ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( i m g B r u i t O r i g i n e ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( i m g F i l t r e ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b 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 de deux boucles for imbriques. Un tableau de neuf cases nomm valeur est utilis pour stocker les valeurs des pixels utiliss pour ltrer le pixel courant. On rcupre et on stocke les valeurs des voisins l'aide de deux nouvelles boucles for permettant de parcourir le voisinage du pixel courant. Aprs avoir rcupr les valeurs, il nous sut de calculer la moyenne des valeurs du tableau. On place ensuite cette valeur dans le pixel de l'image rsultat. Pour raliser un ltrage moyenneur maison de l'image d'entre, il nous sut dsormais de cliquer sur le bouton Filtre moyenneur maison de l'interface prsente un peu plus tt dans ce dossier en ayant au pralable congur la taille du ltre, le nombre de passes et la gestion des bordures. Les rsultats obtenus par cette fonction sont identiques aux rsultats prsents prcdemment. L'excution de notre fonction maison est toutefois moins rapide que l'excution de la fonction utilisant la fonction imlter.

66

4.4 Flou et ltre de Wiener


Nous allons maintenant nous intresser la correction d'ventuels ous dans l'image acquise. Dans un premier temps, nous prsenterons les fonctions dveloppes par notre binme pour ajouter un eet de ou l'image. Nous prsenterons ensuite une fonction de correction du ou base sur le ltre de Wiener.

4.4.1 Flou
L'application du ou sur une image s'eectue en trois tapes. Nous crons tout d'abord le ou proprement parler l'aide de la fonction suivante :

Algorithme 27 Fonction de cration du ou


%Fonction permettant de c r e r l a f o n c t i o n de f l o u t a g e f u n c t i o n PSF=c r e a t i o n F l o u ( hObject , eventdata , h a n d l e s ) %Rcupration de l a l o n g u e u r e t de l ' a n g l e du f l o u l o n g u e u r=g e t ( h a n d l e s . longueur , ' S t r i n g ' ) ; a n g l e=g e t ( h a n d l e s . angle , ' S t r i n g ' ) ; l o n g u e u r=str2num ( l o n g u e u r ) ; a n g l e=str2num ( a n g l e ) ; %C r a t i o n du f l o u PSF=f s p e c i a l ( ' motion ' , longueur , a n g l e ) ;

Le ou est paramtr l'aide de deux contrles. Un premier champ texte permet de paramtrer la longueur du ou tandis qu'un second champ texte permet de rgler l'angle du ou. Aprs avoir rcupr ces deux paramtres, nous crons le ou l'aide de la fonction fspecial et nous le stockons dans la variable PSF. La fonction fspecial prend en paramtre le type de ou, la longueur et l'angle du ou. Dans notre cas, nous crons un ou de mouvement (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 c h a r g e d ' a p p l i q u e r un b r u i t ( c h o i s i par l ' u t i l i s a t e u r l ' a i d e %des r a d i o s buttons ) l ' image d ' e n t r e f u n c t i o n imgFloute=a p p l i c a t i o n F l o u ( hObject , eventdata , handles , PSF) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire ( "y" : frame c o u l e u r ) I 4 = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s imgFloute=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; %A p p l i c a t i o n du f l o u imgFloute=i m f i l t e r ( I4 , PSF , ' c i r c u l a r ' , ' conv ' ) ;

Nous rcuprons tout d'abord l'image l'aide de la mthode habituelle. Nous appliquons ensuite le ou l'aide de la fonction imlter. Cette dernire permet de convoluer l'image avec le ou PSF pass en paramtre de la fonction. Il est noter qu'un contrle de type 'checkbox' est plac dans l'interface pour permettre l'utilisateur d'ajouter du bruit en supplment du ou. Lorsque la case cocher est valid, l'utilisateur peut alors paramtrer le bruit l'aide des contrles prsents prcdemment. Les gures suivantes prsentent une mme image plus ou moins altre par un ou de mouvement :

67

Figure 59  Flou de mouvement


4.4.2 Filtre de Wiener
Nous allons maintenant prsenter une fonction permettant de corriger le ou de mouvement l'aide du ltre de Wiener :

68

Algorithme 29 Fonction de correction de ou


%Fonction c h a r g e de c o r r i g e r l ' image f l o u t e en e n t r e l ' a i d e d ' un %f i l t r e Wiener f u n c t i o n flouWiener ( hObject , eventdata , handles , imgFloute , PSF) %S u p p r e s s i o n du f l o u imgDefloute=deconvwnr ( imgFloute , PSF ) ; %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( imgFloute ) ; h i s t o S o r t i e=i m h i s t ( imgDefloute ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( imgFloute ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( imgDefloute ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

Pour corriger l'image oute (passe en paramtre de la fonction), il sut d'utiliser la fonction deconvwnr en passant en paramtre l'image corriger et le ou qui a t appliqu (variable PSF passe en paramtre). Il est noter qu'il est possible de donner une approximation du ou la fonction si l'on ne dispose pas du ou exacte. Pour raliser une correction de ou de l'image d'entre, il nous sut dsormais de cliquer sur le bouton Flou Wiener de l'interface prsente un peu plus tt dans ce dossier en ayant au pralable congur la longueur du ou et l'angle de celui ci. Il est galement possible d'ajouter un bruit l'aide de la case cocher prvue cet eet. Avec un ou de longueur 15, un angle nul et aucun bruit, le rsultat obtenu est le suivant :

69

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


Avec un ou de longueur 35, un angle nul et aucun bruit, le rsultat 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 rsultat obtenu est le suivant :

70

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 rsultat 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 rsultat obtenu est le suivant :

71

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 rsultat 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 trs dlement l'image d'origine. On note toutefois l'apparition de nombreux parasites (similaire ceux prsent dans un bruit Gaussien) dans l'image rsultat. Lorsqu'un bruit est ajout, le ltre de Wiener ne permet pas de corriger le ou de mouvement. Il est

72

donc ncessaire d'appliquer au pralable un ltre pour corriger le bruit de l'image avant d'appliquer le ltre de Wiener. Enn, lorsque le ou de mouvement a un angle, le ltre de Wiener se rvle assez peu ecace.

5 Dtection de contours et segmentation d'images


La dtection des contours d'une image ou sa segmentation permettent de prparer le terrain pour des traitements de plus haut niveau tel que la reconnaissance de formes. Dans un premier temps, nous prsenterons un large panel de mthodes permettant de dtecter les contours d'une image. Nous prsenterons ensuite une mthode permettant de segmenter une image.

5.1 Dtection de contours


5.1.1 Gradient Simple
La premire mthode de dtection de contour que nous allons expose est celle du gradient Simple. Cette mthode utilise deux ltres (ou masques de convolution) pour mettre en vidence les contours :

Figure 66  Principe du gradient Simple


La mthode du gradient simple est constitue de deux tapes. Dans un premier temps, on applique les deux ltres de convolution l'image. Le premier de ces ltres permet de dtecter les contours horizontaux tandis que le second ltre permet de dtecter les contours verticaux. Nous obtenons ainsi deux images. Il sut ensuite de fusionner les deux images en utilisant un calcul de norme. La fonction suivante permet de dtecter les contours l'aide du gradient Simple :

73

Algorithme 30 Fonction de dtection de contours l'aide du gradient Simple


%Fonction c h a r g e de d t e c t e r l e s c o n t o u r s de l ' image l ' a i d e du Gradient %Simple f u n c t i o n g r a d i e n t S i m p l e ( hObject , eventdata , h a n d l e s ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire (" y" : frame c o u l e u r ) I 4 = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s %A p p l i c a t i o n v e n t u e l d ' un b r u i t check=g e t ( h a n d l e s . checkBruitContour , ' Value ' ) ; i f ( check==1) I 4=b r u i t 2 ( hObject , eventdata , handles , I 4 ) ; end %Rcupration du " s e u i l C o n t o u r " s e u i l=str2num ( g e t ( h a n d l e s . s e u i l C o n t o u r , ' S t r i n g ' ) ) ; %C r a t i o n de l ' image de s o r t i e imgContour=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; %C r a t i o n des images contenant l e s g r a d i e n t s imgGx=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; imgGy=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; %A p p l i c a t i o n du Gradient Simple H o r i z o n t a l f o r i =1: hauteur f o r j =1:( l a r g e u r 1) imgGx ( i , j )= I 4 ( i , ( j +1)) I 4 ( i , j ) ; end end %A p p l i c a t i o n du Gradient Simple V e r t i c a l f o r i =1:( hauteur 1) f o r j =1: l a r g e u r imgGy ( i , j )=( I 4 ( ( i +1) , j )) I 4 ( i , j ) ; end end %Somme norme des Gradients p u i s b i n a r i s a t i o n v e n t u e l l e de l ' image check=g e t ( h a n d l e s . c h e c k G r a d i e n t S i m p l e B i n a r i s a t i o n , ' Value ' ) ; i f ( check==1) for i =1: hauteur for j =1: l a r g e u r norme=f l o o r ( s q 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

else for i =1: hauteur for j =1: l a r g e u r

end

end

end

imgContour ( i , j )=0;

end

end

%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 ; end

74

Algorithme 31 Fonction de dtection de contours l'aide du gradient Simple (Suite)


%C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( I 4 ) ; h i s t o S o r t i e=i m h i s t ( imgContour ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( I 4 ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( imgContour ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

Aprs avoir rcupr et convertit l'image, nous regardons si la case cocher est valide. Si c'est le cas, nous ajoutons un bruit l'image l'aide des fonctions prsentes prcdemment dans ce dossier. Nous rcuprons ensuite la valeur du seuil saisie par l'utilisateur. Cette valeur inuencera le nombre de contours dtects comme nous pourrons le voir dans les captures d'cran un peu plus loin dans ce dossier. Nous allouons ensuite trois images : une premire image qui contiendra l'image rsultat ainsi que deux images qui permettront de stocker respectivement les contours horizontaux et verticaux Nous commenons tout d'abord par appliquer le gradient horizontal. Pour cela, nous parcourons l'intgralit de l'image et nous appliquons la formule issue du ltre. Pour un pixel (i,j), il nous faut utiliser la valeur de ce pixel ainsi que le pixel situ sa droite (c'est dire le pixel (i,j+1)). Le ltre est centr sur la valeur -1. Pour calculer le gradient horizontal d'un pixel, on soustrait donc la valeur de ce pixel la valeur du pixel situ sa droite. 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 la valeur du pixel situ en dessous. Aprs avoir calcul les gradients horizontaux et verticaux, nous calculons la norme des gradients pour chaque pixel de l'image rsultat. Ainsi, le pixel de l'image rsultat (i,j) sera gale la somme norme des pixels (i,j) des deux images contenant les gradients. La norme utilise est la norme des valeurs absolues. Il est noter qu'il est tout 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 rsultat du gradient simple. Ainsi, l'utilisateur peut spcier qu'il souhaite binariser l'image l'aide d'une case cocher. Lorsque cette dernire est valide, nous appliquons alors une binarisation de l'image rsultat en se basant sur le seuil saisie par l'utilisateur dans le champ texte prvu cet eet. Pour raliser une dtection de contours l'aide du gradient Simple, il nous sut dsormais de cliquer sur le bouton Gradient Simple de l'interface prsente un peu plus tt dans ce dossier en ayant ventuellement ajout un bruit l'aide de la case cocher. Sans binarisation, le rsultat obtenu est le suivant :

75

Figure 67  Dtection de contours l'aide du gradient simple (sans binarisation)


Avec une binarisation de seuil 14, le rsultat obtenu est le suivant :

Figure 68  Dtection de contours l'aide du gradient simple (binarisation de seuil 14)


Avec une binarisation de seuil 8, le rsultat obtenu est le suivant :

76

Figure 69  Dtection de contours l'aide du gradient simple (binarisation de seuil 8)


Avec une binarisation de seuil 3, le rsultat obtenu est le suivant :

Figure 70  Dtection de contours l'aide du gradient simple (binarisation de seuil 3)


Avec une binarisation de seuil 14 et un bruit sel et poivre, le rsultat obtenu est le suivant :

77

Figure
poivre)

71  Dtection de contours l'aide du gradient simple (binarisation de seuil 14 et un bruit sel et

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

Figure 72  Dtection 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 rsultat obtenu est le suivant :

78

Figure 73  Dtection 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 dtecter assez ecacement les contours. Les contours produits par ce traitement sont relativement propres et pour la plupart ferms. Toutefois, ce type de ltre est relativement sensible aux bruits.

5.1.2 Gradient de Roberts


La deuxime mthode de dtection de contour que nous allons prsent est celle du gradient de Roberts. Cette mthode utilise deux ltres pour mettre en vidence les contours :

79

Figure 74  Principe du gradient de Roberts


Le gradient de Roberts 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 dtecter les contours ayant une direction allant du coin suprieure gauche de l'image au coin infrieur droit (ou l'inverse) tandis que le second ltre permet de dtecter les contours ayant une direction allant du coin infrieur gauche de l'image au coin suprieure droit (ou l'inverse). Nous obtenons ainsi deux images. Il sut ensuite de fusionner les deux images en utilisant un calcul de norme. La fonction suivante permet de dtecter les contours l'aide du gradient de Roberts :

80

Algorithme 32 Fonction de dtection de contours l'aide du gradient de Roberts


%Fonction c h a r g e de d t e c t e r l e s c o n t o u r s de l ' image l ' a i d e du Gradient %de Roberts f u n c t i o n g r a d i e n t R o b e r t s ( hObject , eventdata , h a n d l e s ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire (" y" : frame c o u l e u r ) I 4 = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s %A p p l i c a t i o n v e n t u e l d ' un b r u i t check=g e t ( h a n d l e s . checkBruitContour , ' Value ' ) ; i f ( check==1) I 4=b r u i t 2 ( hObject , eventdata , handles , I 4 ) ; end %Rcupration du " s e u i l C o n t o u r " s e u i l=str2num ( g e t ( h a n d l e s . s e u i l C o n t o u r , ' S t r i n g ' ) ) ; %C r a t i o n de l ' image de s o r t i e imgContour=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; %A p p l i c a t i o n du Gradient de Roberts imgContour=edge ( I4 , ' r o b e r t s ' , s e u i l ) ; %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( I 4 ) ; h i s t o S o r t i e=i m h i s t ( imgContour ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( I 4 ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( imgContour ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

Aprs avoir rcupr et convertit l'image, nous regardons si la case cocher est valide. Si c'est le cas, nous ajoutons un bruit l'image l'aide des fonctions prsentes prcdemment dans ce dossier. Nous rcuprons ensuite la valeur du seuil saisie par l'utilisateur. Cette valeur inuencera le nombre de contours dtect comme nous pourrons le voir dans les captures d'cran un peu plus loin dans ce dossier. Aprs avoir allou l'image de sortie imgContour, nous utilisons la fonction Matlab edge pour raliser la dtection des contours de l'image. Cette fonction prend en paramtre l'image d'origine, le nom de la mthode de dtection ('roberts' dans le cas prsent) et le seuil de dtection. Pour raliser une dtection de contours l'aide du gradient de Roberts, il nous sut dsormais de cliquer sur le bouton Gradient de Roberts de l'interface prsente un peu plus tt dans ce dossier en ayant au pralable paramtr le seuil de la dtection et ventuellement ajout un bruit l'aide de la case cocher. Avec un seuil de 0.2, le rsultat obtenu est le suivant :

81

Figure 75  Dtection de contours l'aide du gradient de Roberts (seuil : 0.2)


Avec un seuil de 0.1, le rsultat obtenu est le suivant :

Figure 76  Dtection de contours l'aide du gradient de Roberts (seuil : 0.1)


Avec un seuil de 0.05, le rsultat obtenu est le suivant :

82

Figure 77  Dtection de contours l'aide du gradient de Roberts (seuil : 0.05)


Avec un seuil de 0.01, le rsultat obtenu est le suivant :

Figure 78  Dtection de contours l'aide du gradient de Roberts (seuil : 0.01)


Avec un seuil de 0.05 et un bruit sel et poivre, le rsultat obtenu est le suivant :

83

Figure 79  Dtection 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 rsultat obtenu est le suivant :

Figure 80  Dtection 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 rsultat obtenu est le suivant :

84

Figure 81  Dtection 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 marqus sont dtects. Avec un seuil de 0.05, nous obtenons une grande partie des contours de l'image. Enn, lorsque le seuil est trop bas, beaucoup trop d'lments sont considrs comme des contours par le dtecteur.

5.1.3 Filtre de Prewitt


Nous allons maintenant prsenter deux types de ltres prsentant une sensibilit au bruit un peu moins importante : les ltres de Prewitt et Sobel. Ces deux ltres sont trs similaires. Le principe du Filtre de Prewitt est le suivant :

Figure 82  Principe du ltre de Prewitt


85

L'application d'un ltre de Prewitt 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 dtecter les contours verticaux tandis que le second ltre permet de dtecter les contours horizontaux de l'image. Nous obtenons ainsi deux images. Il sut ensuite de fusionner les deux images en utilisant un calcul de norme. La fonction suivante permet de dtecter les contours l'aide du ltre de Prewitt :

Algorithme 33 Fonction de dtection de contours l'aide du ltre de Prewitt


%Fonction c h a r g e de c o r r i g e r l ' image f l o u t e en e n t r e l ' a i d e du f i l t r e %de P r e w i t t f u n c t i o n f i l t r e P r e w i t t ( hObject , eventdata , h a n d l e s ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire (" y" : frame c o u l e u r ) I 4 = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s %A p p l i c a t i o n v e n t u e l d ' un b r u i t check=g e t ( h a n d l e s . checkBruitContour , ' Value ' ) ; i f ( check==1) I 4=b r u i t 2 ( hObject , eventdata , handles , I 4 ) ; end %Rcupration du " s e u i l C o n t o u r " s e u i l=str2num ( g e t ( h a n d l e s . s e u i l C o n t o u r , ' S t r i n g ' ) ) ; %C r a t i o n de l ' image de s o r t i e imgContour=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; %A p p l i c a t i o n du f i l t r e de P r e w i t t imgContour=edge ( I4 , ' p r e w i t t ' , s e u i l ) ; %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( I 4 ) ; h i s t o S o r t i e=i m h i s t ( imgContour ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( I 4 ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( imgContour ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

Cette fonction est trs similaire celle du gradient de Roberts. La seule dirence se trouve dans l'utilisation de la fonction edge. Le type de dtection utilis est cette fois 'prewitt'. Pour raliser une dtection de contours l'aide du ltre de Prewitt, il nous sut dsormais de cliquer sur le bouton Filtre de Prewitt de l'interface prsente un peu plus tt dans ce dossier en ayant au pralable paramtr le seuil de la dtection et ventuellement ajout un bruit l'aide de la case cocher. Avec un seuil de 0.2, le rsultat obtenu est le suivant :

86

Figure 83  Dtection de contours l'aide du ltre de Prewitt (seuil : 0.2)


Avec un seuil de 0.1, le rsultat obtenu est le suivant :

Figure 84  Dtection de contours l'aide du ltre de Prewitt (seuil : 0.1)


Avec un seuil de 0.05, le rsultat obtenu est le suivant :

87

Figure 85  Dtection de contours l'aide du ltre de Prewitt (seuil : 0.05)


Avec un seuil de 0.01, le rsultat obtenu est le suivant :

Figure 86  Dtection de contours l'aide du ltre de Prewitt (seuil : 0.01)


Avec un seuil de 0.05 et un bruit sel et poivre, le rsultat obtenu est le suivant :

88

Figure 87  Dtection 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 rsultat obtenu est le suivant :

Figure 88  Dtection 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 rsultat obtenu est le suivant :

89

Figure 89  Dtection de contours l'aide du ltre de Prewitt (seuil : 0.05 et bruit de Poisson)
Nous pouvons voir que les rsultats 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 comme en tmoigne la capture d'cran ralise avec un seuil de 0.01. On peut voir galement que ce ltre rsiste assez bien au bruit gaussien.

5.1.4 Filtre de Sobel


Le principe du Filtre de Sobel est le suivant :

90

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 dtecter les contours verticaux tandis que le second ltre permet de dtecter les contours horizontaux de l'image. Nous obtenons ainsi deux images. Il sut ensuite de fusionner les deux images en utilisant un calcul de norme. La fonction suivante permet de dtecter les contours l'aide du ltre de Sobel :

91

Algorithme 34 Fonction de dtection de contours l'aide du ltre de Sobel


%Fonction c h a r g e de d t e c t e r l e s c o n t o u r s de l ' image l ' a i d e du F i l t r e de %Sob el f u n c t i o n f i l t r e S o b e l ( hObject , eventdata , h a n d l e s ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire (" y" : frame c o u l e u r ) I 4 = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s %A p p l i c a t i o n v e n t u e l d ' un b r u i t check=g e t ( h a n d l e s . checkBruitContour , ' Value ' ) ; i f ( check==1) I 4=b r u i t 2 ( hObject , eventdata , handles , I 4 ) ; end %Rcupration du " s e u i l C o n t o u r " s e u i l=str2num ( g e t ( h a n d l e s . s e u i l C o n t o u r , ' S t r i n g ' ) ) ; %C r a t i o n de l ' image de s o r t i e imgContour=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; %A p p l i c a t i o n du f i l t r e de Sobel imgContour=edge ( I4 , ' s o b e l ' , s e u i l ) ; %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( I 4 ) ; h i s t o S o r t i e=i m h i s t ( imgContour ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( I 4 ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( imgContour ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

Cette fonction est trs similaire celle du ltre de Prewitt. La seule dirence se trouve dans l'utilisation de la fonction edge. Le type de dtection utilis est cette fois 'sobel'. Pour raliser une dtection de contours l'aide du ltre de Sobel, il nous sut dsormais de cliquer sur le bouton Filtre de Sobel de l'interface prsente un peu plus tt dans ce dossier en ayant au pralable paramtr le seuil de la dtection et ventuellement ajout un bruit l'aide de la case cocher. Avec un seuil de 0.2, le rsultat obtenu est le suivant :

92

Figure 91  Dtection de contours l'aide du ltre de Sobel (seuil : 0.2)


Avec un seuil de 0.1, le rsultat obtenu est le suivant :

Figure 92  Dtection de contours l'aide du ltre de Sobel (seuil : 0.1)


Avec un seuil de 0.05, le rsultat obtenu est le suivant :

93

Figure 93  Dtection de contours l'aide du ltre de Sobel (seuil : 0.05)


Avec un seuil de 0.01, le rsultat obtenu est le suivant :

Figure 94  Dtection de contours l'aide du ltre de Sobel (seuil : 0.01)


Avec un seuil de 0.05 et un bruit sel et poivre, le rsultat obtenu est le suivant :

94

Figure 95  Dtection 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 rsultat obtenu est le suivant :

Figure 96  Dtection 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 rsultat obtenu est le suivant :

95

Figure 97  Dtection de contours l'aide du ltre de Sobel (seuil : 0.05 et bruit de Poisson)
Nous pouvons voir que les rsultats 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 en tmoigne la capture d'cran ralise avec un seuil de 0.01.

5.1.5 Filtre de Canny


Nous allons maintenant nous intresser un ltre dit optimal. Canny s'est bas sur les critres suivants pour crer son ltre :

un critre de bonne dtection garantissant une rponse forte en sortie du ltre mme en prsence de faibles contours sur l'image d'entre. un critre de bonne localisation du contour. un critre d'unicit de la rponse permettant d'assurer une seule dtection pour un contour et ainsi d'viter les eets de rebond.

Le principe du Filtre de Canny est le suivant :

96

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'image originale l'aide d'un ltre passe-bas an 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 permet de dtecter les contours verticaux tandis que le second ltre permet de dtecter les contours horizontaux de l'image. Nous obtenons ainsi deux images. Il sut ensuite de fusionner les deux images en utilisant un calcul de norme. La fonction suivante permet de dtecter les contours l'aide du ltre de Canny :

97

Algorithme 35 Fonction de dtection de contours l'aide du ltre de Canny


%Fonction c h a r g e de c o r r i g e r l ' image f l o u t e en e n t r e l ' a i d e du f i l t r e %de Canny f u n c t i o n f i l t r e C a n n y ( hObject , eventdata , h a n d l e s ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire (" y" : frame c o u l e u r ) I 4 = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s %A p p l i c a t i o n v e n t u e l d ' un b r u i t check=g e t ( h a n d l e s . checkBruitContour , ' Value ' ) ; i f ( check==1) I 4=b r u i t 2 ( hObject , eventdata , handles , I 4 ) ; end %Rcupration du " s e u i l C o n t o u r " s e u i l=str2num ( g e t ( h a n d l e s . s e u i l C o n t o u r , ' S t r i n g ' ) ) ; %C r a t i o n de l ' image de s o r t i e imgContour=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; %A p p l i c a t i o n du f i l t r e de Canny imgContour=edge ( I4 , ' canny ' , s e u i l ) ; %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( I 4 ) ; h i s t o S o r t i e=i m h i s t ( imgContour ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( I 4 ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( imgContour ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

Cette fonction est trs similaire celle du ltre de Sobel. La seule dirence se trouve dans l'utilisation de la fonction edge. Le type de dtection utilis est cette fois 'canny'. Pour raliser une dtection de contours l'aide du ltre de Canny, il nous sut dsormais de cliquer sur le bouton Filtre de Canny de l'interface prsente un peu plus tt dans ce dossier en ayant au pralable paramtr le seuil de la dtection et ventuellement ajout un bruit l'aide de la case cocher. Avec un seuil de 0.8, le rsultat obtenu est le suivant :

98

Figure 100  Dtection de contours l'aide du ltre de Canny (seuil : 0.8)


Avec un seuil de 0.4, le rsultat obtenu est le suivant :

Figure 101  Dtection de contours l'aide du ltre de Canny (seuil : 0.4)


Avec un seuil de 0.2, le rsultat obtenu est le suivant :

99

Figure 102  Dtection de contours l'aide du ltre de Canny (seuil : 0.2)


Avec un seuil de 0.03, le rsultat obtenu est le suivant :

Figure 103  Dtection de contours l'aide du ltre de Canny (seuil : 0.03)


Avec un seuil de 0.2 et un bruit sel et poivre, le rsultat obtenu est le suivant :

100

Figure 104  Dtection 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 rsultat obtenu est le suivant :

Figure 105  Dtection 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 rsultat obtenu est le suivant :

101

Figure 106  Dtection 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 marqus de l'image ont t parfaitement dtects. Les seuils de 0.4 et 0.2 permettent de dtecter une grande partie des contours de l'image. Enn, lorsque le seuil est trop faible comme c'est le cas pour le seuil gale 0.03, nous constatons l'apparition de nombreuses gries sur l'image rsultat. Nous pouvons voir que les bruits gaussien et de Poisson sont trs bien ltrs par le ltre de Canny. En revanche, le bruit sel et poivre est assez mal support.

5.1.6 Filtre Laplacien


Nous allons maintenant tudier une autre mthode pour dtecter les contours d'une image : le ltre Laplacien. Ce ltre fonctionne sur le mme principe que les prcdents. 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

Figure 108  Principe du ltre Laplacien 8-connexe


Le choix de la connexit du ltre Laplacien sera donne l'utilisateur grce des boutons radios prsents dans l'interface. La gestion des boutons radios est ralis l'aide d'un gestionnaire d'vnement plac sur le groupe de boutons encadrant les boutons radios. La connexit du ltre est stocke dans un champ texte invisible nomm conChoisi. La fonction suivante permet de dtecter les contours l'aide du ltre Laplacien :

103

Algorithme 36 Fonction de dtection de contours l'aide du ltre Laplacien


%Fonction c h a r g e de c o r r i g e r l ' image f l o u t e en e n t r e l ' a i d e du f i l t r e %L a p l a c i e n 4 ou 8 connexe f u n c t i o n imgContour=f i l t r e L a p l a c i e n ( hObject , eventdata , h a n d l e s ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; y = ( g e t d a t a ( h a n d l e s . vid , 1 , ' u i n t 8 ' ) ) ; %a c c s l a frame s t o c k e en mmoire (" y" : frame c o u l e u r ) I 4 = rgb2gray ( y ) ; %on p a s s e "y" en niveau de g r i s %A p p l i c a t i o n v e n t u e l d ' un b r u i t check=g e t ( h a n d l e s . checkBruitContour , ' Value ' ) ; i f ( check==1) I 4=b r u i t 2 ( hObject , eventdata , handles , I 4 ) ; end %C r a t i o n de l ' image de s o r t i e imgContour=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; %Rcupration du type de c o n n e x i t c h o i s i par l ' u t i l i s a t e u r c o n n e x i t e=g e t ( h a n d l e s . conChoisi , ' S t r i n g ' ) ; l a p l a c i e n=im2double ( z e r o s ( 3 , 3 ) ) ; switch c o n n e x i t e case '4Con ' laplacien =[0 ,1 ,0;1 , 4 ,1;0 ,1 ,0]; case '8Con ' laplacien =[1 ,1 ,1;1 , 8 ,1;1 ,1 ,1]; otherwise % Code for when t h e r e i s no match . end imgContour=i m f i l t e r ( I4 , l a p l a c i e n ) ; %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( I 4 ) ; h i s t o S o r t i e=i m h i s t ( imgContour ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( I 4 ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( imgContour ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

Cette fonction est trs similaire aux fonctions de dtection prcdentes. Aprs avoir rcupr le type de connexit choisi pour le ltre, nous construisons ce dernier dans la variable 'laplacien'. Nous appliquons ensuite ce ltre l'image par convolution l'aide de la fonction imlter. Pour raliser une dtection de contours l'aide du ltre Laplacien, il nous sut dsormais de cliquer sur le bouton Filtre Laplacien de l'interface prsente un peu plus tt dans ce dossier en ayant au pralable choisi la connexit du ltre et ventuellement ajout un bruit l'aide de la case cocher. Avec un ltre Laplacien 4-connexe, le rsultat obtenu est le suivant :

104

Figure 109  Dtection de contours l'aide du ltre Laplacien 4-connexe (aucun bruit)
Avec un ltre Laplacien 8-connexe, le rsultat obtenu est le suivant :

Figure 110  Dtection de contours l'aide du ltre Laplacien 8-connexe (aucun bruit)
Avec un ltre Laplacien 8-connexe et un bruit sel et poivre, le rsultat obtenu est le suivant :

105

Figure 111  Dtection de contours l'aide du ltre Laplacien 8-connexe (bruit 'sel et poivre')
Avec un ltre Laplacien 8-connexe et un bruit gaussien, le rsultat obtenu est le suivant :

Figure 112  Dtection de contours l'aide du ltre Laplacien 8-connexe (bruit gaussien)
Avec un ltre Laplacien 8-connexe et un bruit de Poisson, le rsultat obtenu est le suivant :

106

Figure 113  Dtection de contours l'aide du ltre Laplacien 8-connexe (bruit de Poisson)
Le ltre Laplacien permet une dtection de contour trs correcte. Nous pouvons noter que le ltre 8-connexe produit des contours plus nettes que le ltre 4-connexe. Pour nir, nous pouvons voir ce type de ltres ne convient pas lorsque l'image en entre est bruite.

5.1.7 Seuillage par hystrsis


Nous allons terminer notre tude des mthodes de dtection de contours par le seuillage par hystresis. Cette mthode ne constitue pas une fonction de dtection de contours proprement parler car elle s'appuie sur les fonctions vues prcdemment. En eet, le seuillage par hystresis s'appuie sur une image ayant dj subi un traitement permettant le calcul du gradient ou du laplacien. Dans notre cas, nous partirons d'une image trait par un ltre Laplacien. Le seuillage par hystresis se droule de la manire suivante :

tape 1 : Initialisation de l'image rsultat. tape 2 : Identication des pixels ayant une valeur de Laplacien suprieur au seuil haut (dni manuellement). Ces pixels sont stocks en mmoire dans une pile ou une le. On xe leur valeur 1 (ou 255) dans l'image rsultat. tape 3 : Parcours de la pile/le. Pour chaque pixel de la structure, on observe les pixels voisins (il est ncessaire de dterminer ce que l'on entend par voisinage (distance de Manhattan ou autre) avant de raliser ce traitement). Si un pixel voisin a une valeur du Laplacien suprieure au seuil bas (dni manuellement), on xe sa valeur 1 (ou 255) dans l'image rsultat et on l'ajoute la pile/le. On poursuit ainsi jusqu' l'puisement de la pile/le.

La fonction suivante permet de dtecter les contours l'aide du seuillage par hystresis :

107

Algorithme 37 Fonction de dtection de contours l'aide du seuillage par hystresis


%Fonction c h a r g e de s e u i l l e r l ' image c o u r a n t e l ' a i d e d ' un s e u i l l a g e par %h y s t r s i s f u n c t i o n s e u i l l a g e H y s t e r e s i s ( hObject , eventdata , handles , imgContour ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; %C r a t i o n de l ' image de s o r t i e i m g S e u i l=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; %Rcupration des s e u i l s s e u i l H=str2num ( g e t ( h a n d l e s . s e u i l H a u t , ' S t r i n g ' ) ) ; s e u i l B=str2num ( g e t ( h a n d l e s . s e u i l B a s , ' S t r i n g ' ) ) ; %C r a t i o n 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 ) %e t y des p i x e l s p i l e=z e r o s ( ( 2 4 0 * 3 2 0 ) , 2 ) ; i n d i c e H a u t P 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 L a p l a c i e n s u p r i e u r e au %s e u i l haut for i =1: hauteur for j =1: l a r g e u r %S i l e g r a d i e n t du L a p l a c i e n du p i x e l e s t s u p r i e u r au s e u i l H i f ( imgContour ( i , j )> s e u i l H ) %Mise 1 du p i x e l i m g S e u i l ( i , j )=255; %Ajout du p i x e l dans l a p i l e i n d i c e H a u t P i l e=i n d i c e H a u t P i l e +1; p i l e ( i n d i c e H a u t P i l e ,1)= i ; p i l e ( i n d i c e H a u t P i l e ,2)= j ; end end end %Tant que l a p i l e n ' e s t pas v i d e w h i l e ( i n d i c e H a u t P i l e >=1) %On d p i l e un p i x e l posY=p i l e ( i n d i c e H a u t P i l e , 1 ) ; posX=p i l e ( i n d i c e H a u t P i l e , 2 ) ; i n d i c e H a u t P i l e=i n d i c e H a u t P i l e 1; %I n s p e c t i o n du v o i s i n a g e f 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<l a r g e u r ) ) %S i l e g r a d i e n t du L a p l a c i e n du p i x e l e s t s u p r i e u r au %s e u i l B i f ( imgContour ( i , j )> s e u i l B && i m g S e u i l ( i , j )~=255) %Mise 1 du p i x e l i m g S e u i l ( i , j )=255; %Ajout du p i x e l dans l a p i l e i n d i c e H a u t P i l e=i n d i c e H a u t P i l e +1; p i l e ( i n d i c e H a u t P i l e ,1)= i ; p i l e ( i n d i c e H a u t P i l e ,2)= j ; end end end end end

108

Algorithme 38 Fonction de dtection de contours l'aide du seuillage par hystresis (Suite)


%C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( imgContour ) ; h i s t o S o r t i e=i m h i s t ( i m g S e u i l ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( imgContour ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( i m g S e u i l ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

Aprs avoir rcupr le seuil haut et bas, nous crons la pile qui sera utilise dans le traitement. Un tableau est utilise pour reprsenter cette structure et une variable numrique est utilise pour mmoriser l'indice du dernier lment de la pile. Ce tableau est compos de deux colonnes : une colonne pour stocker l'indice en x du pixel et une autre colonne pour stocker l'indice en y. Nous parcourons ensuite l'image la recherche de pixels ayant une valeur du Laplacien suprieure au seuil haut. On xe la valeur de ce pixel 255 sur l'image rsultat puis on ajoute les coordonnes de ce dernier dans la pile. Nous eectuons ensuite la deuxime phase. Celle ci se termine lorsque la pile est vide (boucle while). Nous rcuprons tout d'abord l'lment situ en haut de la pile. Nous inspectons ensuite le voisinage de ce pixel. Si un pixel voisin a une valeur de Laplacien suprieure au seuil bas, on xe la valeur de ce pixel 255 sur l'image rsultat puis on ajoute les coordonnes de ce pixel dans la pile. Pour raliser une dtection de contours l'aide du seuillage par hystresis, il nous sut dsormais de cliquer sur le bouton Seuillage par hystresis de l'interface prsente un peu plus tt dans ce dossier en ayant au pralable x les seuils haut et bas l'aide des champs textes prvus cet eet. Dans les tests ci-dessus, nous utiliserons une image trait par un ltre Laplacien 8-connexe. L'image gauche est l'image en sortie du ltre Laplacien tandis que l'image de droite est l'image rsultant du seuillage. Avec seuil haut de 125 et un seuil bas de 100, le rsultat obtenu est le suivant :

109

Figure 114  Dtection de contours l'aide du seuillage par hystresis (seuil haut : 125, seuil bas : 100, aucun
bruit) Avec seuil haut de 100 et un seuil bas de 75, le rsultat obtenu est le suivant :

Figure 115  Dtection de contours l'aide du seuillage par hystresis (seuil haut : 100, seuil bas : 75, aucun
bruit) Avec seuil haut de 100 et un seuil bas de 25, le rsultat obtenu est le suivant :

110

Figure 116  Dtection de contours l'aide du seuillage par hystresis (seuil haut : 100, seuil bas : 25, aucun
bruit) Avec seuil haut de 40 et un seuil bas de 25, le rsultat obtenu est le suivant :

Figure 117  Dtection de contours l'aide du seuillage par hystresis (seuil haut : 40, seuil bas : 25, aucun
bruit) Avec seuil haut de 100, un seuil bas de 25 et un bruit sel et poivre, le rsultat obtenu est le suivant :

111

Figure 118  Dtection de contours l'aide du seuillage par hystresis (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 rsultat obtenu est le suivant :

Figure 119  Dtection de contours l'aide du seuillage par hystresis (seuil haut : 100, seuil bas : 25, bruit
gaussien) Avec seuil haut de 100, un seuil bas de 25 et un bruit de Poisson, le rsultat obtenu est le suivant :

112

Figure 120  Dtection de contours l'aide du seuillage par hystresis (seuil haut : 100, seuil bas : 25, bruit
de Poisson) On peut voir que le seuillage par hystresis est particulirement ecace lorsque les seuils sont bien rgls. Un seuil haut assez lev permet de dtecter seulement les vrais contours lors de la premire phase en excluant les parasites. La seconde phase se contente ainsi de prolonger ces contours. Un seuil bas assez faible permet de prolonger les contours trouvs dans la premire phase. On peut voir qu'un seuil haut trop bas laisse passer beaucoup de parasites. Enn, nous pouvons voir que le seuillage par hystresis supporte trs mal le bruit. Ce dernier constat tait prvisible tant donn que le seuillage par hystresis se base sur le ltre Laplacien, rsistant lui mme assez mal au bruit.

5.2 Segmentation l'aide de la mthode d'agrgation de pixels


Nous allons terminer ce dossier par l'tude d'une mthode de segmentation. La segmentation est utilise pour retrouver et identier les objets d'une image en partitionnant cette dernire en zone homognes. Les objets d'une image rpondent plusieurs caractristiques :

Ils sont connexes (L'objet est constitu d'un seul et unique morceau). Ils ont une couleur et une texture cohrente. Ils sont dlimits par des contours nets.

Pour identier les objets d'une image, plusieurs approches peuvent tre utiliss :

Les segmentations bases sur les contours : dans cette approche, on cherche trouver les frontires de chacun des objets pour les identier. Pour que cette technique soit ecace, il est ncessaire d'utiliser des techniques de reconstructions de contours (fermeture de contours) car ces derniers sont souvent peu prcis ou morcels.

Les segmentations bases sur les rgions : Cette approche regroupe notamment des techniques comme la croissance de rgion ou le spilt and merge. L'ide principale de cette approche est de placer dans l'image des germes (choisir des pixels) puis de faire grossir des rgions homognes partir de ces derniers. Il existe galement des mthodes de segmentations bass sur les histogrammes, des segmentations hybrides s'appuyant sur plusieurs approches etc etc

Dans cette partie, nous aurons recours l'approche bases sur les rgions et plus prcisment, la mthode d'agrgation de pixels. Le principe de cette mthode est de regrouper les pixels connexes semblables en se basant sur

113

deux paramtres :

Un critre d'adjacence : dnition du voisinage considr pour chaque pixel de l'image : 4-connexit ou 8-connexit (Dans notre cas, nous utiliserons la 8-connexit). Un critre d'homognit : dnition d'une distance entre deux pixels voisins. Plusieurs critres d'homognit seront utiliss dans notre tude.

Aprs avoir dni ces deux critres, on dnit un seuil S qui sera utilis comme comparaison avec le critre d'homognit. On place ensuite un germe dans l'image. Ce dernier est plac d'une manire alatoire ou bien en utilisant les valeurs des gradient des pixels (Cette dernire mthode vite de placer le germe sur un contour). Le germe ainsi choisi reoit une tiquette. Cette tiquette permet d'identier la rgion en cours de traitement. A terme, chaque rgion de l'image aura une tiquette dirente. On cherche ensuite faire crotre la taille de la rgion du germe. Pour cela, on recherche dans le voisinage du germe (dni par le critre d'adjacence) des pixels ayant une distance (dni par le critre d'homognit) infrieure au seuil. Si ces pixels respecte ce critre, ils ont ajout la rgion et nous appliquons ensuite la mme mthode sur leur voisinage. Lorsque tous les pixels susceptibles d'tre intgr la rgion ont t observs, on place un nouveau germe dans une partie de l'image non tiquet puis on recommence le processus. Nous allons tout d'abord prsent une fonction permettant de raliser une agrgation de pixels utilisant le critre d'homognit suivant :

d(E, A) = |gris(E ) gris(A)|


avec gris(E) le niveau de gris du pixel E d'ores et dj dans la rgion et gris(A) le niveau de gris du pixel candidat l'incorporation dans la rgion.

114

Algorithme 39 Fonction d'agrgation de pixels selon la distance simple


%Fonction c h a r g e d ' i d e n t i f i e r l e s r g i o n s de l ' image l ' a i d e de l a %mthode d ' a g r g a t i o n s de p i x e l s ( c r i t r e d ' homognit=d i s t a n c e s i m p l e ) f u n c t i o n a g r e g a t i o n P i x e l s S i m p l e ( hObject , eventdata , handles , img , imgGradient ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; %Rcupration du s e u i l s e u i l=str2num ( g e t ( h a n d l e s . s e u i l A g r e g a t i o n , ' S t r i n g ' ) ) ; %C r a t i o n de l ' image de s o r t i e imgRegion=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; a r r e t =0; %E t i q u e t t e des r g i o n s e t i q u e t t e =1; %On r e c h e r c h e un germe germeX=0; germeY=0; f o r i =1: hauteur f o r j =1: l a r g e u r %S i l e p i x e l n ' e s t pas t i q u e t e t que son g r a d i e n 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 germe i f ( imgRegion ( i , j )==0)% && imgGradient ( i , j ) <50) germeY=i ; germeX=j ; end end end while ( a r r e t ==0) %Traitement de l a r g i o n %C r a t i o n d ' une p i l e u t i l i s e pour s t o c k e r l e s p i x e l s de l a r g i o n %non v i s i t p i l e=z e r o s ( ( hauteur * l a r g e u r ) , 2 ) ; i n d i c e H a u t P i l e =0; i n d i c e H a u t P i l e=i n d i c e H a u t P i l e +1; p i l e ( i n d i c e H a u t P i l e ,1)= germeY ; p i l e ( i n d i c e H a u t P i 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 i d e while ( i n d i c e H a u t P i l e >=1) %On d p i l e un p i x e l posY=p i l e ( i n d i c e H a u t P i l e , 1 ) ; posX=p i l e ( i n d i c e H a u t P i l e , 2 ) ; i n d i c e H a u t P i l e=i n d i c e H a u t P i l e 1; for i =(posY 1):( posY+1) for j =(posX 1): ( posX+1) i f ( i >=1 && i<=hauteur && j >=1 && j<=l a r g e u r ) d i s t a n c e=f l o o r ( abs ( img ( i , j ) img ( posY , posX ) ) ) ; i f ( ( imgRegion ( i , j )==0) && ( d i s t a n c e <s e u i l ) ) i n d i c e H a u t P i l e=i n d i c e H a u t P i l e +1; p i l e ( i n d i c e H a u t P i l e ,1)= i ; p i l e ( i n d i c e H a u t P i l e ,2)= j ; imgRegion ( i , j )= e t i q u e t t e ; end end end end end

115

Algorithme 40 Fonction d'agrgation de pixels selon la distance simple (Suite)


%On r e c h e r c h e un germe germeX=0; germeY=0; for i =1: hauteur for j =1: l a r g e u r %S i l e p i x e l n ' e s t pas t i q u e t e t que son g r a d i e n 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 germe i f ( imgRegion ( i , j )==0)% && imgGradient ( i , j ) <50) germeY=i ; germeX=j ; end end end %S i aucun germe n ' a pu t r e trouv , on stoppe l e t r a i t e m e n t i f ( germeY==0 | | germeX==0) a r r e t =1; e t i q u e t t e=e t i q u e t t e +1; end end %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( img ) ; h i s t o S o r t i e=i m h i s t ( imgRegion ) ; %Ajout de c o u l e u r s pour d i f f r e n c i e r l e s r g i o n s imgRegion=l a b e l 2 r g b ( imgRegion ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( img ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( imgRegion ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

else

La fonction d'agrgation prend en paramtre l'image acquise ainsi que le rsultat de la fonction permettant de calculer le gradient simple de l'image. Nous commenons tout d'abord par rcuprer la dimension de l'image et le seuil saisi par l'utilisateur. Nous initialisons ensuite une variable nomme tiquette 1. Cette variable sera utilis pour tiqueter les direntes rgions 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 rsultat imgRegion gale zro) ayant une valeur de gradient faible pour viter d'obtenir un pixel appartenant un contour. Aprs avoir choisi le premier germe, nous dmarrons une boucle. Cette dernire se termine lorsque tous les pixels de l'image ont t tiquets. A l'instar du seuillage par hystrsis, une pile est utilis pour stocker les pixels tudier. Lors de la premire itration, cette pile contient seulement le germe. On inspecte donc le voisinage de ce germe l'aide de deux boucles for. Pour chaque pixel de ce voisinage, nous vrions tout d'abord que les coordonnes 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 bien dans l'image, nous calculons la distance entre ce pixel et le pixel de la pile. Pour ce critre d'homognit, nous soustrayons simplement la valeur du pixel voisin la valeur du pixel de la pile. Dans le cas o cette distance est infrieure au seuil et que le pixel voisin n'est pas dj tiquet, nous ajoutons ce dernier la rgion en xant la valeur de ce pixel dans l'image imgRegion avec la valeur de l'tiquette. On ajoute ensuite ce pixel dans la pile pour que son voisinage soit tudi par la suite.

116

Lorsque la pile est vide, nous recherchons alors un nouveau germe et nous augmentons la valeur de l'tiquette de un pour dmarrer l'agrgation d'une nouvelle rgion de l'image. Si aucun germe n'a t trouv (tous les pixels de l'image font partie d'une rgion), nous stoppons le traitement. Pour raliser une segmentation l'aide de la mthode d'agrgation de pixels avec ce critre d'homognit, il nous sut dsormais de cliquer sur le bouton Agrgation de pixels de l'interface prsente un peu plus tt dans ce dossier en ayant au pralable slectionn le critre d'homognit Distance simple l'aide des boutons radios et x le seuil l'aide du champ de saisie prvu cet eet. Avec seuil de 20, le rsultat obtenu est le suivant :

Figure 121  Segmentation l'aide de la mthode d'agrgation de pixels (seuil :20)


Avec seuil de 15, le rsultat obtenu est le suivant :

117

Figure 122  Segmentation l'aide de la mthode d'agrgation de pixels (seuil :15)


Avec seuil de 10, le rsultat obtenu est le suivant :

Figure 123  Segmentation l'aide de la mthode d'agrgation de pixels (seuil :10)


Avec seuil de 5, le rsultat obtenu est le suivant :

118

Figure 124  Segmentation l'aide de la mthode d'agrgation de pixels (seuil :5)


Nous pouvons voir que plus le seuil diminue, plus le nombre de rgions identis est important. Un seuil gale dix permet d'obtenir une identication optimale. Dans cette conguration, la majorit des rgions principales de l'image sont identies. Nous constatons que si le seuil est trop lev, le traitement a tendance crer de nombreuses rgions parasites et l'identication n'est alors pas exploitable. Nous allons maintenant prsent une fonction permettant de raliser une agrgation de pixels utilisant le critre d'homognit suivant :

d(E, Ri) = |gris(E ) R |


avec gris(E) le niveau de gris du pixel E candidat l'incorporation dans la rgion et intensits des pixels appartenant la rgion.

la moyenne des

119

Algorithme 41 Fonction d'agrgation de pixels selon la moyenne de rgion


%Fonction c h a r g e d ' i d e n t i f i e r l e s r g i o n s de l ' image l ' a i d e de l a %mthode d ' a g r g a t i o n s de p i x e l s ( c r i t r e d ' homognit=moyenne ) f u n c t i o n a g r e g a t i o n P i x e l s M o y e n n e ( hObject , eventdata , handles , img , imgGradient ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; %Rcupration du s e u i l s e u i l=str2num ( g e t ( h a n d l e s . s e u i l A g r e g a t i o n , ' S t r i n g ' ) ) ; %C r a t i o n de l ' image de s o r t i e imgRegion=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; a r r e t =0; %E t i q u e t t e des r g i o n s e t i q u e t t e =1; %On r e c h e r c h e un germe germeX=0; germeY=0; f o r i =1: hauteur f o r j =1: l a r g e u r %S i l e p i x e l n ' e s t pas t i q u e t e t que son g r a d i e n 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 germe i f ( imgRegion ( i , j )==0)% && imgGradient ( i , j ) <50) germeY=i ; germeX=j ; end end end while ( a r r e t ==0) %Traitement de l a r g i o n %C r a t i o n d ' une p i l e u t i l i s e pour s t o c k e r l e s p i x e l s de l a r g i o n %non v i s i t p i l e=z e r o s ( ( 2 4 0 * 3 2 0 ) , 2 ) ; i n d i c e H a u t P i l e =0; %C r a t i o n d ' un t a b l e a u de s t o c k a g e des v a l e u 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 o n en vue du c a l c u l de l a moyenne i n t e n s i t e =1:(240*320); n br e Va l e ur s =1; %Ajout du germe dans l a p i l e i n d i c e H a u t P i l e=i n d i c e H a u t P i l e +1; p i l e ( i n d i c e H a u t P i l e ,1)= germeY ; p i l e ( i n d i c e H a u t P i l e ,2)= germeX ; moyenne=img ( germeY , germeX ) ; i n t e n s i t e ( n br e Va l eu r s )=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 i d e w h i l e ( i n d i c e H a u t P i l e >=1) %On d p i l e un p i x e l posY=p i l e ( i n d i c e H a u t P i l e , 1 ) ; posX=p i l e ( i n d i c e H a u t P i l e , 2 ) ; i n d i c e H a u t P i l e=i n d i c e H a u t P i 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<l a r g e u r ) d i s t a n c e=abs ( img ( i , j ) moyenne ) ; i f ( ( imgRegion ( i , j )==0) && ( d i s t a n c e <s e u i l ) ) i n d i c e H a u t P i l e=i n d i c e H a u t P i l e +1; p i l e ( i n d i c e H a u t P i l e ,1)= i ; p i l e ( i n d i c e H a u t P i l e ,2)= j ; n b re V al e ur s=nb r e Va l eu r s +1; i n t e n s i t e ( n br e Va l eu r s )=img ( germeY , germeX ) ; %C a l c u l de l a n o u v e l l e moyenne intensiteTemp =1: n b r eV a le u rs ; f o r k=1: n b r eV a le u rs intensiteTemp ( k)= i n t e n s i t e ( k ) ; end moyenne=f l o o r ( mean ( intensiteTemp ) ) ; imgRegion ( i , j )= e t i q u e t t e ; end 120 end end

Algorithme 42 Fonction d'agrgation de pixels selon la moyenne de rgion (Suite)


end end %On r e c h e r c h e un germe germeX=0; germeY=0; for i =1: hauteur for j =1: l a r g e u r %S i l e p i x e l n ' e s t pas t i q u e t e t que son g r a d i e n 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 germe i f ( imgRegion ( i , j )==0)% && imgGradient ( i , j ) <50) germeY=i ; germeX=j ; end end end %S i aucun germe n ' a pu t r e trouv , on stoppe l e t r a i t e m e n t i f ( germeY==0 | | germeX==0) a r r e t =1; e t i q u e t t e=e t i q u e t t e +1; end end %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( img ) ; h i s t o S o r t i e=i m h i s t ( imgRegion ) ; %Ajout de c o u l e u r s pour d i f f r e n c i e r l e s r g i o n s imgRegion=l a b e l 2 r g b ( imgRegion ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( img ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( imgRegion ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

else

Cette fonction est trs similaire la fonction prcdente. Un tableau nomm intensit est utilis pour stocker les valeurs des intensits des pixels de la rgion. On stocke galement le nombre de valeurs prsentes dans ce tableau l'aide d'un compteur. Lorsqu'un pixel est ajout la rgion, nous ajoutons sa valeur dans le tableau. Nous recalculons ensuite la moyenne du tableau l'aide de la fonction mean. La moyenne est utilise pour calculer la distance sparant le pixel tudi de la rgion en cours d'agrgation. Pour raliser une segmentation l'aide de la mthode d'agrgation de pixels avec ce critre d'homognit, il nous sut dsormais de cliquer sur le bouton Agrgation de pixels de l'interface prsente un peu plus tt dans ce dossier en ayant au pralable slectionn le critre d'homognit Moyenne de rgion l'aide des boutons radios et x le seuil l'aide du champ de saisie prvu cet eet. Avec seuil de 20, le rsultat obtenu est le suivant :

121

Figure 125  Segmentation l'aide de la mthode d'agrgation de pixels (seuil :20)


Avec seuil de 15, le rsultat obtenu est le suivant :

Figure 126  Segmentation l'aide de la mthode d'agrgation de pixels (seuil :15)


Avec seuil de 10, le rsultat obtenu est le suivant :

122

Figure 127  Segmentation l'aide de la mthode d'agrgation de pixels (seuil :10)


Avec seuil de 5, le rsultat obtenu est le suivant :

Figure 128  Segmentation l'aide de la mthode d'agrgation de pixels (seuil :5)


L'utilisation de la moyenne comme critre d'homognit permet d'obtenir un rsultat trs satisfaisant, bien que dirent des rsultats obtenus avec le critre d'homognit dirent. Nous pouvons voir que mme en cas de seuil trop bas, aucune rgion parasite n'apparat dans le rsultat de la segmentation. Nous pouvons galement noter que ce critre d'homognit identie mme des rgions ayant un faible contraste entre elles. C'est

123

notamment le cas du fond blanc de l'image dont les parties bncient d'un clairage dirent. Pour nir, nous allons prsent une fonction permettant de raliser une agrgation de pixels utilisant un dernier critre d'homognit :

min(|gris(x) gris(p)|) < seuil |gris(p) R | < 2R


avec gris(p) le niveau de gris du pixel p candidat l'incorporation dans la rgion, gris(x) le niveau de gris du pixel x d'ores et dj dans la rgion,

la moyenne des intensits des pixels appartenant la rgion et

R l'cart

type de la rgion.

124

Algorithme 43 Fonction d'agrgation de pixels selon la moyenne et l'cart type de rgion


%Fonction c h a r g e d ' i d e n t i f i e r l e s r g i o n s de l ' image l ' a i d e de l a %mthode d ' a g r g a t i o n s de p i x e l s ( c r i t r e d ' homognit= c a r t type ) f u n c t i o n a g r e g a t i o n P i x e l s E c a r t ( hObject , eventdata , handles , img , imgGradient ) %Rcupration des dimensions de l ' image hauteur=str2num ( g e t ( h a n d l e s . hauteur , ' S t r i n g ' ) ) ; l a r g e u r=str2num ( g e t ( h a n d l e s . l a r g e u r , ' S t r i n g ' ) ) ; %Rcupration du s e u i l s e u i l=str2num ( g e t ( h a n d l e s . s e u i l A g r e g a t i o n , ' S t r i n g ' ) ) ; %C r a t i o n de l ' image de s o r t i e imgRegion=im2uint8 ( z e r o s ( hauteur , l a r g e u r ) ) ; a r r e t =0; %E t i q u e t t e des r g i o n s e t i q u e t t e =1; %On r e c h e r c h e un germe germeX=0; germeY=0; f o r i =1: hauteur f o r j =1: l a r g e u r %S i l e p i x e l n ' e s t pas t i q u e t e t que son g r a d i e n 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 germe i f ( imgRegion ( i , j )==0)% && imgGradient ( i , j ) <50) germeY=i ; germeX=j ; end end end while ( a r r e t ==0) %Traitement de l a r g i o n %C r a t i o n d ' une p i l e u t i l i s e pour s t o c k e r l e s p i x e l s de l a r g i o n %non v i s i t p i l e=z e r o s ( ( 2 4 0 * 3 2 0 ) , 2 ) ; i n d i c e H a u t P i l e =0; %C r a t i o n d ' un t a b l e a u de s t o c k a g e des v a l e u 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 o n en vue du c a l c u l de l a moyenne i n t e n s i t e =1:(240*320); n br e Va l e ur s =1; %Ajout du germe dans l a p i l e i n d i c e H a u t P i l e=i n d i c e H a u t P i l e +1; p i l e ( i n d i c e H a u t P i l e ,1)= germeY ; p i l e ( i n d i c e H a u t P i l e ,2)= germeX ; moyenne=img ( germeY , germeX ) ; ecartType =5000; i n t e n s i t e ( n br e Va l eu r s )=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 i d e w h i l e ( i n d i c e H a u t P i l e >=1) %On d p i l e un p i x e l posY=p i l e ( i n d i c e H a u t P i l e , 1 ) ; posX=p i l e ( i n d i c e H a u t P i l e , 2 ) ; i n d i c e H a u t P i l e=i n d i c e H a u t P i 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<l a r g e u r ) d i s t a n c e 1=abs ( img ( i , j ) img ( posY , posX ) ) ; d i s t a n c e 2=img ( i , j ) moyenne ; i f ( ( imgRegion ( i , j )==0) && ( d i s t a n c e 1 <s e u i l ) && ( d i s t a n c e 2 <(2 * ecartType ) ) ) i n d i c e H a u t P i l e=i n d i c e H a u t P i l e +1; p i l e ( i n d i c e H a u t P i l e ,1)= i ; p i l e ( i n d i c e H a u t P i l e ,2)= j ; n b re V al e ur s=nb r e Va l eu r s +1; i n t e n s i t e ( n br e Va l eu r s )=img ( germeY , germeX ) ; %C a l c u l de l a n o u v e l l e moyenne e t de l ' c a r t type intensiteTemp =1: n b r eV a le u rs ;

125

Algorithme 44 Fonction d'agrgation de pixels selon la moyenne et l'cart type de rgion (Suite)
intensiteTemp ( k)= i n t e n s i t e ( k ) ; end moyenne=f l o o r ( mean ( intensiteTemp ) ) ; ecartType=c e i l ( s t d ( intensiteTemp ) ) ; i f ( ecartType==0) ecartType =5000; end imgRegion ( i , j )= e t i q u e t t e ; end end end end end %On r e c h e r c h e un germe germeX=0; germeY=0; for i =1: hauteur for j =1: l a r g e u r %S i l e p i x e l n ' e s t pas t i q u e t e t que son g r a d i e n 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 germe i f ( imgRegion ( i , j )==0)% && imgGradient ( i , j ) <10) germeY=i ; germeX=j ; end end end %S i aucun germe n ' a pu t r e trouv , on stoppe l e t r a i t e m e n t i f ( germeY==0 | | germeX==0) a r r e t =1; e t i q u e t t e=e t i q u e t t e +1; end end %C o n s t r u c t i o n des histogrammes h i s t o E n t r e e=i m h i s t ( img ) ; h i s t o S o r t i e=i m h i s t ( imgRegion ) ; %Ajout de c o u l e u r s pour d i f f r e n c i e r l e s r g i o n s imgRegion=l a b e l 2 r g b ( imgRegion ) ; %A f f i c h a g e axes ( h a n d l e s . axes1 ) ; subimage ( img ) ; y l a b e l ( ' Image en e n t r e ' ) ; axes ( h a n d l e s . axes2 ) ; plot ( histoEntree ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ; axes ( h a n d l e s . axes3 ) ; subimage ( imgRegion ) ; y l a b e l ( ' Image en s o r t i e ' ) ; axes ( h a n d l e s . axes4 ) ; plot ( histoSortie ) ; x l a b e l ( ' Niveau de g r i s ' ) ; y l a b e l ( ' Quantit de p i x e l s ' ) ;

for k=1: n b re V al e ur s

else

En plus de la moyenne, nous calculons galement l'cart-type du tableau d'intensits de la rgion. Cette valeur est calcule l'aide de la fonction std. L'cart type et la moyenne sont ensuite utiliss pour le critre d'homognit selon les formules prsentes prcdemment. Pour raliser une segmentation l'aide de la mthode d'agrgation de pixels avec ce critre d'homognit, il nous sut dsormais de cliquer sur le bouton Agrgation de pixels de l'interface prsente un peu plus tt dans ce dossier en ayant au pralable slectionn le critre d'homognit cart type l'aide des boutons

126

radios et x le seuil l'aide du champ de saisie prvu cet eet. Avec seuil de 20, le rsultat obtenu est le suivant :

Figure 129  Segmentation l'aide de la mthode d'agrgation de pixels (seuil :20)


Avec seuil de 15, le rsultat obtenu est le suivant :

Figure 130  Segmentation l'aide de la mthode d'agrgation de pixels (seuil :15)


127

Avec seuil de 10, le rsultat obtenu est le suivant :

Figure 131  Segmentation l'aide de la mthode d'agrgation de pixels (seuil :10)


Avec seuil de 5, le rsultat obtenu est le suivant :

Figure 132  Segmentation l'aide de la mthode d'agrgation de pixels (seuil :5)


Ce critre d'homognit ne permet pas d'obtenir autant de rgions que pour les critres prcdents. De plus et l'instar du premier critre, on note l'apparition de rgions parasites en cas de seuil trop bas.

128

6 Conclusion
Cette srie de travaux pratiques nous a permis de nous initier de nombreuses techniques de traitements d'images. Ces travaux ont t l'occasion d'tudier une partie du cycle de vie d'une image. Partant de l'acquisition de l'image, nous avons pu ensuite nous essayer l'amlioration d'images l'aide des histogrammes, la restauration d'images l'aide des ltres de bruit et de ou. Par la suite, nous avons tudi des traitements de plus haut niveau tel que les traitements de dtection de contours ou de segmentation d'images. Nous avons ainsi acquis une vision globale de ce domaine. Ces travaux pratiques nous ont galement permis d'apprendre dvelopper des applications graphiques avec Matlab. Nous avons pu voir que cette plate-forme tait parfaitement adapte aux problmes de traitements d'images.

129

Das könnte Ihnen auch gefallen