Opérations morphologiques

Parfois, après avoir traité votre image avec un seuil (Threshold), vous avez du bruit indésirable dans l’image binaire résultante. Les opérations morphologiques peuvent aider à supprimer ce bruit.

Noyau (Kernel)

Le noyau est une forme simple où l’origine est superposée à chaque pixel de valeur 1 de l’image binaire. OpenCV limite le noyau à une matrice NxN où N est un nombre impair. L’origine du noyau est le centre. Un noyau commun est:

\[\begin{split}kernel = \begin{pmatrix} 1 & 1 & 1\\ 1 & 1 & 1\\ 1 & 1 & 1 \end{pmatrix}\end{split}\]

Différents noyaux peuvent affecter l’image différemment, tels que l’érosion ou la dilatation appliquée verticalement.

Pour référence, voici notre image binaire que nous avons créée:

Image binaire d’origine.

Érosion

L’érosion en vision par ordinateur est similaire à l’érosion sur le sol. Elle amenuise les rebords des objets de premier plan. Ce processus peut supprimer le bruit de l’arrière-plan.

kernel = np.ones((3, 3), np.uint8)
binary_img = cv2.erode(binary_img, kernel, iterations = 1)
Image après érosion. Les petites taches ont disparu et les grandes taches ont été réduites en taille.

Pendant l’érosion, les pixels de l’image binaire qui ne sont pas superposés par les pixels du noyau sont supprimés.

Dilatation

La dilatation est le contraire de l’érosion. Au lieu d’amenuiser les rebords, on les renforcit. Ce processus peut contribuer à supprimer de petits trous à l’intérieur d’une plus grande région.

kernel = np.ones((3, 3), np.uint8)
binary_img = cv2.dilate(binary_img, kernel, iterations = 1)
Image après dilatation. Toutes les taches ont été agrandies.

Pendant la dilatation, chaque pixel de chaque noyau superposé est inclus dans la dilatation.

Ouverture

L’ouverture est une érosion suivie d’une dilatation. Ce processus supprime le bruit sans affecter la forme des entités plus grandes.

kernel = np.ones((3, 3), np.uint8)
binary_img = cv2.morphologyEx(binary_img, cv2.MORPH_OPEN, kernel)
Image après ouverture. Ce opération a supprimé la plupart des petits artefacts, mais conserve toujours la grande taille des éléments plus grands.

Note

Dans ce cas précis, il convient de faire quelques itérations d’ouverture afin de se débarrasser des pixels en haut à droite.

Fermeture

La fermeture est une dilatation suivie d’une érosion. Ce processus supprime les petits trous ou les ruptures sans affecter la forme des entités plus grandes.

kernel = np.ones((3, 3), np.uint8)
binary_img = cv2.morphologyEx(binary_img, cv2.MORPH_CLOSE, kernel)
De petits trous autour de l’image ont été supprimés, mais la taille globale de chaque objet est restée à peu près la même.