Segmentation d’image#
L’image parking.png est une observation aérienne d’un parking d’usine. L’objectif est de segmenter l’image en deux classes pour distinguer les véhicules du reste de l’image.
Segmentation manuelle
Affichez l’histogramme de l’image et déterminez une valeur de seuil qui permette de faire la distinction.
Appliquez le seuil choisi sur l’image avec l’instruction
seg = (img > seuil) * 1oùsegest l’image segmentée,imgest l’image à niveau de gris etseuilest le seuil. La multiplication par 1 permet d’obtenir un résultat numérique et non booléen, facilitant les traitements qui seront faits par la suite. Le résultat correspond-il à vos attentes ?Calculez l’exactitude (accuracy,
sklearn.metrics.accuracy_score) en utilisant la vérité terrain. Pour rappel, une image peut être vectorisée avec l’instruction.ravel(). Prenez garde également à comparer des vecteurs de même amplitude : il peut être utile de diviser l’intensité des images par leur valeurs maximale (.max()). Que constatez-vous ?
Segmentation avec la méthode de Otsu
La méthode de Otsu permet de déterminer une valeur de seuil de façon automatique, à partir de l’histtogramme de l’image.
Effectuez la segmentation de l’image avec le seuil de Otsu (
skimage.filters.threshold_otsu). Le résultat correspond-il à vos attentes ? Qu’en est-il de l’exactitude ?
Dénombrement automatique des véhicules
Pour terminer, on cherche enfin à dénombrer automatiquement le nombre de véhicules. La « labellisation » de l’image consiste à numéroter chaque objet d’une segmentation binaire.
Labellisez la meilleure segmentation obtenue (
skimage.measure.label) et déterminez le nombre d’objets en récupérant la valeur la plus grande de la labellisation (.max()).Vous pouvez améliorer la segmentation binaire en réduisant la taille de chaque objet. De ce fait, les petits objets, qui ne correspondent pas à de vrais véhicules, seront supprimés. Pour cela, faite une érosion (
skimage.morphology.binary_erosion) avec un élément structurant (footprint) carré de 3 pixels de côté.