Images étiquetées#
Conceptuellement, les images étiquetées sont une extension des images binaires. Dans une image étiquetée, tous les pixels avec une valeur de 0 correspondent à l’arrière-plan, une région spéciale qui n’est considérée comme aucun objet. Les pixels avec une valeur supérieure à 0 indiquent que le pixel appartient à un objet et identifient cet objet avec le numéro donné. Un pixel avec la valeur 1 appartient au premier objet et les pixels avec la valeur 2 appartiennent à un deuxième objet et ainsi de suite. Idéalement, les objets sont étiquetés successivement, car ainsi, l’intensité maximale dans une image étiquetée correspond au nombre d’objets étiquetés dans cette image.
Étiquetage des composantes connexes#
Nous pouvons techniquement utiliser les deux alternatives pour l’étiquetage des composantes connexes, en fonction de la connectivité utilisée pour connecter les pixels dans la fonction d’étiquetage.
Connectivité
Étiquetage des composantes 4-connexes#
Voir aussi
Nous commençons avec une image binaire inventée.
import numpy as np
import pyclesperanto_prototype as cle
from pyclesperanto_prototype import imshow
binary_image = np.asarray([
[1, 1, 0, 0, 0, 0 ,0],
[0, 0, 1, 0, 0, 0 ,0],
[0, 0, 0, 1, 1, 1 ,0],
[0, 0, 0, 1, 1, 1 ,0],
[1, 1, 0, 0, 0, 0 ,0],
[1, 1, 0, 0, 1, 1 ,1],
[1, 1, 0, 0, 1, 1 ,1],
])
imshow(binary_image, color_map='Greys_r')
c:\structure\code\pyclesperanto_prototype\pyclesperanto_prototype\_tier9\_imshow.py:14: UserWarning: The imshow parameter color_map is deprecated. Use colormap instead.
warnings.warn("The imshow parameter color_map is deprecated. Use colormap instead.")
Cette image binaire peut être interprétée de deux manières : Soit il y a cinq rectangles avec une taille allant de 1 à 6. Alternativement, il y a deux rectangles de taille 6 et une structure en forme de serpent de 9 pixels.
from skimage.measure import label
labeled_4_connected = label(binary_image, connectivity=1)
imshow(labeled_4_connected, labels=True)
Étiquetage des composantes 8-connexes#
from skimage.measure import label
labeled_8_connected = label(binary_image, connectivity=2)
imshow(labeled_8_connected, labels=True)
En pratique, pour compter les cellules, la connectivité n’est pas si importante. C’est pourquoi le paramètre de connectivité n’est souvent pas fourni.
Étiquetage des composantes connexes dans clesperanto#
Dans clesperanto, les deux options de connectivité pour l’étiquetage des composantes connexes sont implémentées dans deux fonctions différentes. Lors de l’étiquetage des objets en utilisant le voisinage de pixels 4-connexes, nous considérons le voisinage “diamant” de tous les pixels.
labeled_4_connected2 = cle.connected_components_labeling_diamond(binary_image)
imshow(labeled_4_connected2, labels=True)
Le voisinage 8-connexe considère une “boîte” autour de tous les pixels.
labeled_8_connected2 = cle.connected_components_labeling_box(binary_image)
imshow(labeled_8_connected2, labels=True)
Étiquetage en pratique#
Pour démontrer l’étiquetage dans un cas d’utilisation pratique, nous étiquetons l’image blobs.tif.
# Charger les données
from skimage.io import imread
blobs = imread("../../data/blobs.tif")
# Seuillage
from skimage.filters import threshold_otsu
threshold = threshold_otsu(blobs)
binary_blobs = blobs > threshold
# Étiquetage des composantes connexes
from skimage.measure import label
labeled_blobs = label(binary_blobs)
# Visualisation
import matplotlib.pyplot as plt
fig, axs = plt.subplots(1, 3, figsize=(15,15))
cle.imshow(blobs, plot=axs[0])
cle.imshow(binary_blobs, plot=axs[1])
cle.imshow(labeled_blobs, plot=axs[2], labels=True)
Exercice#
Découvrez expérimentalement quel est le paramètre de connectivité par défaut de la fonction skimage.measure.label.