Aller au contenu principal

Descripteurs et morphologie

Cours​

Calculs de descripteurs basés régions​

L'humain est capable de décrire les régions grâce à leurs propriétés ; la machine n'est pas encore capable de telles descriptions. Par contre, elle est capable de calculer des propriétés mathématiques permettant de classifier les images ou les régions : descripteurs. L'utilisation des descripteurs est fondamentale dans la reconnaissance de formes.

Quelques types de descripteurs​

  • Contours : calculer les contours intérieurs et extérieurs des objets
  • Descripteur de forme : par exemple, l'un des plus simples, la taille (nombre total de pixels), robuste aux transformations géométriques (translations, rotations, etc.)
  • Descripteur géométrique : par exemple, le périmètre de la région : longueur du contour extérieur. La région doit être connexe. L'aire (la taille)
  • La compacité, circularité : relation entre l'aire et le périmètre
  • Boîte englobante : rectangle minimal qui englobe tous les points de la région
  • Enveloppe convexe : polygone minimal qui englobe tous les points de la région
  • Propriétés statistiques : moyenne, écart-type, variance, etc.
  • Asymétrie : l'écart au barycentre de la région

Il existe des centaines de descripteurs, chaque pixel ou région est maintenant décrit par un vecteur de descripteurs (taille, périmètre, couleur, barycentre). Ce vecteur appartient à Rn\mathbb{R}^n, où nn peut être très grand. Il y a donc un problème : comment normaliser ce vecteur, qui contient des descripteurs sémantiquement différents ?

Quelques traitements morphologiques​

  • Gradient morphologique / laplacien morphologique (avec δB\delta_B la dilatation et ϵB\epsilon_B l'érosion) : ∇BI=∂+I+∂−I=(δB(I)−I)+(I−ϵB(I))=δB(I)−ϵB(I)\nabla_B I = \partial^+ I + \partial^- I = (\delta_B(I) - I) + (I - \epsilon_B(I)) = \delta_B(I) - \epsilon_B(I) et ΔBI=∂+I−∂−I=(δB(I)−I)−(I−ϵB(I))=δB(I)+ϵB(I)−2I\Delta_B I = \partial^+ I - \partial^- I = (\delta_B(I)-I) - (I - \epsilon_B(I)) = \delta_B(I) + \epsilon_B(I) - 2I
  • Calcul de la distance : chaque point de l'objet est étiqueté avec la distance au point du fond le plus proche
  • Remplissage de régions
  • Composantes connexes
  • Transformation tout ou rien
  • Extraction de squelette

Érosion et dilatation ensembliste​

Érosion ensembliste : ϵB(A)={x:Bx⊆A}\epsilon_B(A) = \{x : B_x \subseteq A \}, c'est-à-dire trouver toutes les positions où BB est inclus dans AA. C'est ce qu'on appelle la soustraction de Minkowski (⊖)(\ominus) : ϵB(A)=A⊖B=∩b∈BA−b\epsilon_B(A) = A \ominus B = \cap_{b\in B} A_{-b}. Cela entraîne la diminution de la taille des objets ; les objets avec concavités et trous se séparent, les petits objets et détails disparaissent.

Dilatation ensembliste : δB(A)={x:Bˇx∩A≠∅}=A⊕B=∪b∈BAb\delta_B(A) = \{x : \check{B}_x \cap A \neq \emptyset \} = A \oplus B = \cup_{b \in B} A_{b}, où Bˇ\check{B} est le symétrique de BB (égal à BB pour un élément structurant symétrique). C'est ce qu'on appelle l'addition de Minkowski (⊕)(\oplus). Cela revient à translater AA par rapport à BB et prendre l'union des translations.

Composition d'érosion et dilatation​

Ouverture : γB(A)=δB(ϵB(A))=∪x{Bx:Bx⊆A}\gamma_B(A)= \delta_B(\epsilon_B(A)) = \cup_x \{B_x : B_x \subseteq A \}. Séparation et élimination des objets plus petits que BB : ils sont éliminés par l'érosion. Les objets restants sont filtrés et retrouvent leur taille initiale (dilatation).

Fermeture : ϕB(A)=ϵB(δB(A))=∩x{(Bx)c:A⊆(Bx)c}\phi_B(A) = \epsilon_B(\delta_B(A)) = \cap_x \{(B_x)^c : A \subseteq (B_x)^c \} (pour un élément structurant symétrique). Elle fusionne les objets proches (connexion des contours) et élimine les trous plus petits que BB.

Propriétés :

  • dualité : l'ouverture de la forme correspond à la fermeture du fond
  • anti-extensivité / extensivité : γB(A)⊆A⊆ϕB(A)\gamma_B(A) \subseteq A \subseteq \phi_B(A)
  • croissance : si A⊆CA \subseteq C alors γB(A)⊆γB(C)\gamma_B(A) \subseteq \gamma_B(C) et ϕB(A)⊆ϕB(C)\phi_B(A) \subseteq \phi_B(C)
  • idempotence : γB(γB(A))=γB(A)\gamma_B(\gamma_B(A)) = \gamma_B(A) et ϕB(ϕB(A))=ϕB(A)\phi_B(\phi_B(A)) = \phi_B(A)

Mise en application​

Remarque importante sur la partie morphologie mathématique​

Il est sous-entendu que tous les programmes doivent être faits "à la main", sans utiliser les fonctions d'OpenCV qui implémentent presque les mêmes opérations morphologiques.

make-se <shape> <halfsize> <se-name>​

Écrire le programme make-se.cpp

  • ce programme permet de créer un élément structurant de type shape de taille (2⋅halfsize+1)2(2 \cdot halfsize+1)^2, et le sauve dans une image binaire nommée se-name
  • shape est de type entier enum{SQUARE, DIAMOND, DISK, LINE_V, DIAG_R, LINE_H, DIAG_L, CROSS, PLUS} correspondant aux éléments structurants suivants : un carré, un losange, un disque, une ligne verticale, une diagonale à droite, une ligne horizontale, une diagonale à gauche, une croix, un plus

morphology.cpp​

Écrire le programme morphology.cpp

  • compléter le programme morphology.cpp permettant de réaliser les algorithmes de base de la morphologie mathématique. Les fonctions à compléter se trouvent dans l'en-tête morphology.hpp
  • ce module sert de module de base aux programmes que vous réalisez par la suite.

dilatation / erosion <se-name> <ims-name> <imd-name>​

Écrire le programme dilatation.cpp / erosion.cpp

  • ce programme permet de charger une image donnée en paramètre par <ims-name> (considérée en niveaux de gris) et un élément structurant se-name
  • le programme réalise l'opération de dilatation ou d'érosion et sauve l'image résultante dans <imd-name>

labeling-color <ims-name> <reg-name> <color-name>​

Écrire le programme labeling-color.cpp

  • ce programme permet de charger une image donnée (considérée comme binaire) en paramètre
  • étudier et tester le programme labeling.cpp qui permet de compter les composantes connexes
  • modifier le programme labeling.cpp et labeling-color.cpp afin que ce dernier puisse générer une carte de région (une carte de labels) reg-name et une version en fausses couleurs des composantes connexes

Règle extract-gear du Makefile​

Modifier et compléter la règle extract-gear du Makefile fourni

  • cette règle permet de traiter l'image gear.png et d'extraire les dents de l'engrenage à l'aide d'une chaîne de traitement utilisant entre autres, les opérateurs morphologiques
  • cette règle affiche les différentes étapes de la chaîne de traitements via pvisu
  • vous pouvez, selon les besoins, écrire un programme de binarisation binarization <thmin> <thmax> <ims> <imd>

Règle extract-cell du Makefile​

Modifier et compléter la règle extract-cell du Makefile fourni

  • cette règle permet de traiter l'image cell.png et d'extraire les cellules dans l'image à l'aide d'une chaîne de traitements utilisant, entre autres, les opérateurs morphologiques
  • cette règle affiche les différentes étapes de la chaîne de traitements via pvisu
  • afin de visualiser les contours, vous pouvez, selon les besoins écrire un programme permettant d'ajouter les contours à l'image finale add-boundary <im-boundary> <ims> <imd>