TP Traitement d’images SEGMENTATION D’IMAGES BINAIRES Sujets abordés : lecture et affichage d’images, histogrammes de projection, parcours d’histogrammes, localisation et segmentation de caractères, seuillage d’histogrammes, marquage de composantes connexes, segmentation de composantes connexes, filtrage de composantes connexes. 1. Segmentation par projection d’histogrammes Le but de cette première partie est de réaliser une segmentation d’images binaires par projection d’histogrammes. Pour réaliser cette segmentation, on utilisera des images binaires composées de suites de caractères numériques. On propose dans un premier temps de réaliser cette segmentation sur l’image sans bruit suivante : Question : Implémenter les fonctions Matlab permettant la lecture d’une image, la récupération de cette image sous forme matricielle, et l’affichage de la matrice image. Pour ces deux questions vous pouvez vous aider de l’annexe des TP. Vous pouvez mettre en œuvre ces fonctions dans un fichier principal Matlab (TP11.m par exemple). Question : Ecrire l’algorithme (sous forme de fonction) pour le calcul de l’histogramme de projection verticale d’une image binaire et implémenter le. Cet histogramme de projection verticale correspond à un vecteur (de taille égale à la largeur de l’image) sommant les pixels noirs par colonne de l’image. On peut s’aider pour cela de la fonction sum de Matlab. Ecrire une seconde fonction permettant de créer une image représentant l’histogramme (cf ci-dessous). Expliquer la différence entre un histogramme de projection, et un histogramme d’amplitude. Question : Ecrire l’algorithme (sous forme de fonction) permettant de compter le nombre de caractères (ici 11) et de les localiser. Ce traitement se fera à partir de l’analyse de l’image de l’histogramme de projection verticale. Le critère de détection se basera sur les successions des projections nulles et non nulles. Stocker et retourner les coordonnées (début ;fin) de l’ensemble des caractères de l’image dans une matrice (n,2), avec n le nombre de ligne de texte. Question : A partir du résultat de la localisation des caractères, implémenter une fonction permettant de réaliser leur segmentation. En pratique, cette segmentation pourrait se traduire par l’extraction des caractères de l’image (recopie d’imagettes de caractère par exemple). Dans ce TP, on se limitera à la création d’une image d’encadrement à la manière de l’image suivante. On se propose dans un second temps de réaliser une segmentation sur la même image de caractères numériques, mais dans des conditions bruitées (cf ci-dessous). Pour cela, il nécessaire de compléter votre programme complet avec une méthode de seuillage d’histogramme. Vous pouvez mettre en œuvre ce deuxième programme dans un fichier principal Matlab (TP12.m par exemple). Question : Ecrire l’algorithme (sous forme de fonction) permettant de seuiller l’histogramme de projection verticale à partir d’un seuil manuel défini dans votre programme. Ce filtrage consiste en un effacement des pics de l’histogramme de projection verticale de taille inférieure au seuil, comme le montre l’exemple suivant : Vérifier l’influence du choix du seuil sur le nombre de caractères détectés (cf cidessous). Quelle(s) technique(s) vue(s) dans un autre TP permettrai(en)t la réduction du bruit de l’image afin d’améliorer les résultats de segmentation sur des images bruitées. 2. Segmentation par marquage de composantes connexes Dans cette seconde partie on se propose de réaliser la segmentation sur une image constituée de formes imbriquées (cf ci-dessous). Sur ce type d’image, la segmentation par projection d’histogramme vue en première partie de ce TP ne peut être utilisée. Pour réaliser la segmentation de cette image nous allons utiliser la technique de marquage de composantes connexes (blob coloring). La composante connexe en traitement d’image représente une agrégation de pixels connectés sur une image. L’image des formes imbriquées par exemple (cf ci-dessus) est composée de 4 composantes connexes. La technique de marquage de composantes connexes est basée sur une détection des contours des composantes. Suite à cette détection des contours, les pixels d’une composante donnée sont marqués par un même label suivant leur relation de connexité (4 ou 8 connexe). L’exemple cidessous donne un exemple de résultat d’un marquage de composantes en 4-connexité. 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 2 2 2 0 0 0 0 0 2 2 2 0 0 3 0 0 0 0 0 0 0 3 3 0 0 0 0 0 0 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 Exemple de marquage de composantes en 4-connexité Pour réaliser ce marquage on se propose d’utiliser la fonction de marquage de composantes connexes de la bibliothèque image de Matlab. Il est possible de spécifier un marquage 4 ou 8 connexe. La fonction de marquage de composantes connexes s’appelle de la manière suivante : imagemcs =bwlabel(imagei,8) Question : Ecrire l’algorithme en Matlab permettant de réaliser la segmentation par marquage de composantes connexes. Recopier chaque composante dans une imagette de même dimension. On peut pour cela s’aider de la fonction Matlab find. Question : Ecrire l’algorithme et le programme Matlab permettant de sélectionner les composantes connexes selon des critères de surface. Appliquer cet algorithme à l’image de texte bruitée pour la segmentation des caractères. Comparer les deux méthodes et commenter.