Segmentation d’image#
La segmentation d’image est le processus de séparation d’une image en plusieurs régions.
Voir aussi
Commençons à nouveau par définir une image comme un tableau à deux dimensions et la visualiser en utilisant pyclesperanto.
import numpy as np
from pyclesperanto_prototype import imshow
import matplotlib.pyplot as plt
image = np.asarray([
[1, 0, 2, 1, 0, 0, 0],
[0, 3, 1, 0, 1, 0, 1],
[0, 5, 5, 1, 0, 1, 0],
[0, 6, 6, 5, 1, 0, 2],
[0, 0, 5, 6, 3, 0, 1],
[0, 1, 2, 1, 0, 0, 1],
[1, 0, 1, 0, 0, 1, 0]
])
imshow(image, colorbar=True)
Images binaires#
La façon la plus basique de faire cela est la binarisation, transformant l’image en une région “positive” et une région “négative”. Typiquement, des images binaires sont utilisées pour cela, qui pourraient par exemple contenir deux valeurs de pixels différentes True et False représentant respectivement “positif” et “négatif”. Techniquement, toute image peut être interprétée comme une image binaire en utilisant le raisonnement “Chaque pixel est considéré comme positif s’il n’est ni False ni 0.”
Seuillage d’image#
Un algorithme très basique pour séparer les régions de faible intensité des régions de forte intensité dans l’image est le seuillage.
Nous allons maintenant créer une nouvelle image contenant True et False comme valeurs de pixels en fonction de si l’image originale avait une intensité inférieure ou supérieure à un seuil donné. Comme cette image n’a que deux valeurs de pixels différentes, c’est une image binaire :
threshold = 4
binary_image = image > threshold
binary_image
array([[False, False, False, False, False, False, False],
[False, False, False, False, False, False, False],
[False, True, True, False, False, False, False],
[False, True, True, True, False, False, False],
[False, False, True, True, False, False, False],
[False, False, False, False, False, False, False],
[False, False, False, False, False, False, False]])
imshow(binary_image)
Matplotlib pourrait être plus flexible pour visualiser des images, par exemple pour dessiner des contours autour des régions d’intérêt :
# créer un nouveau graphique
fig, axes = plt.subplots(1,1)
# ajouter deux images
axes.imshow(image, cmap=plt.cm.gray)
axes.contour(binary_image, [0.5], linewidths=1.2, colors='r')
<matplotlib.contour.QuadContourSet at 0x1a542ce37f0>