Séparation d’objets en contact#

Un cas d’utilisation courant de l’algorithme du watershed est la séparation d’objets en contact. Dans ce notebook, nous allons séparer des objets dans des images binaires qui ont une forme arrondie et se touchent.

from skimage.io import imread
import napari_segment_blobs_and_things_with_membranes as nsbatwm
import napari_simpleitk_image_processing as nsitk
import stackview

Le point de départ est une image binaire, par exemple créée en utilisant le seuillage.

nuclei = imread('../../data/mitosis_mod.tif')

stackview.insight(nuclei)
shape(70, 70)
dtypeuint8
size4.8 kB
min8
max255
binary = nsbatwm.threshold_otsu(nuclei).astype(bool)

binary
<__array_function__ internals>:180: RuntimeWarning: Converting input from bool to <class 'numpy.uint8'> for compatibility.
nsbatwm made image
shape(70, 70)
dtypebool
size4.8 kB
minFalse
maxTrue

Nous pouvons ensuite séparer les objets en contact en ne tenant compte que de l’image binaire. L’algorithme sous-jacent vise à produire des résultats similaires à l’algorithme de watershed binaire d’ImageJ et l’implémentation ici fonctionne également en 3D.

split_objects = nsbatwm.split_touching_objects(binary)
split_objects
nsbatwm made image
shape(70, 70)
dtypebool
size4.8 kB
minFalse
maxTrue

La fonction split_touching_objects a également un paramètre sigma qui permet de contrôler l’agressivité de la séparation des objets. Pour faire plus de séparations, entrez un nombre inférieur à 3,5 qui est la valeur par défaut.

split_objects2 = nsbatwm.split_touching_objects(binary, sigma=2)
split_objects2
nsbatwm made image
shape(70, 70)
dtypebool
size4.8 kB
minFalse
maxTrue

Il est également possible d’obtenir une image étiquetée comme résultat. Notez que dans ce cas, la ligne/espace noir entre les objets ne sera pas présent.

touching_labels = nsitk.touching_objects_labeling(binary)
touching_labels
n-sitk made image
shape(70, 70)
dtypeuint32
size19.1 kB
min0
max13