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é

  1. von Neumann, 4-connecté

  2. Moore, 8-connecté

É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.")
../_images/6247bce24e7fe5f93f52f603857ee6e3fda9ff2b3d697f1fc42cbc1decc10772.png

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)
../_images/6ca23d0e6c3bed80061b4d4721b6f2dd21ee388025034df3ec7aea7da8d06538.png

Étiquetage des composantes 8-connexes#

from skimage.measure import label
labeled_8_connected = label(binary_image, connectivity=2)

imshow(labeled_8_connected, labels=True)
../_images/616ac94fb987723296d1c6bfac12b5b8217ee86e55a385672e9302290113fa3c.png

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)
../_images/ce74ef9e0ec06590008c0add62a30c42cdf12bdaad59d8f5b812f5eff979d954.png

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)
../_images/616ac94fb987723296d1c6bfac12b5b8217ee86e55a385672e9302290113fa3c.png

É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)
../_images/847e0c5376cb41852f804765b2ae51d1412c19228168e8a83038c063d2ed8c1e.png

Exercice#

Découvrez expérimentalement quel est le paramètre de connectivité par défaut de la fonction skimage.measure.label.