Étiquetage des objets en contact#

Lors du traitement d’images de microscopie à fluorescence, nous sommes souvent confrontés à des objets collés les uns aux autres qui devraient être différenciés. Cependant, si nous appliquons un étiquetage par composantes connexes après seuillage, nous obtenons un seul objet étiqueté, alors que nous pensons qu’il devrait y en avoir deux. Les utilisateurs d’ImageJ utiliseraient alors l’algorithme “Watershed” qui est capable de séparer les objets si la forme d’un objet suggère qu’il en contient deux. Certaines fonctions de SimpleITK nous permettent de faire la même chose. Encore une fois, pour des raisons pratiques de programmation, nous utilisons le plugin napari scriptable napari-simpleitk-image-processing.

import numpy as np
from skimage.io import imread
from pyclesperanto_prototype import imshow
from napari_simpleitk_image_processing import threshold_otsu, touching_objects_labeling, gaussian_blur

Notre point de départ est une image binaire avec quelques objets en forme de 8 que nous aimerions séparer.

blobs = imread('../../data/blobs.tif')
binary = threshold_otsu(blobs)
imshow(binary)
../_images/aac24fde3fd260040b5033ca92c02ff51dae5ae320de2449b8e8e86ef339dc9d.png

La fonction touching_objects_labeling prend une image binaire en entrée et produit une image étiquetée, tout comme l’étiquetage par composantes connexes. Le résultat diffère cependant : les objets en forme de 8 sont séparés.

touching_labels = touching_objects_labeling(binary)
imshow(touching_labels, labels=True)
../_images/085fe1c8193f4184424dd2906f65a85e2b936768f3244a1076c369e8382f0cfb.png

Ajustement fin du résultat#

Si tous les objets ne doivent pas être séparés, on peut affiner le résultat de ce processus en modifiant l’image binaire avant de la passer à touching_objects_labeling. Par exemple, si nous appliquons un filtre de flou gaussien avant de seuiller l’image, nous pouvons obtenir une image étiquetée où moins d’objets sont séparés.

blurred = gaussian_blur(blobs, variance_x=25, variance_y=25)

binary2 = threshold_otsu(blurred)
imshow(binary2)
../_images/31cbe81776263a510c37583ed870c7788f40b99fe6c478cfd4cac4e432a36191.png
touching_labels = touching_objects_labeling(binary2)
imshow(touching_labels, labels=True)
../_images/4ce25d636a55076ac620b9fe73263ce5c71e27ddfe11dbd6049156659a975462.png