Segmentation des cellules par ligne de partage des eaux avec graines basée sur les membranes#

Dans cette section, nous utiliserons une approche de ligne de partage des eaux avec graines pour la segmentation cellulaire. Cette approche est très courante lorsqu’on dispose d’images de segmentation cellulaire basées sur des marqueurs membranaires. Par conséquent, nous utilisons le plugin napari napari-segment-blobs-and-things-with-membranes. En coulisse, ce plugin utilise des fonctions de scikit-image.

Voir aussi

from napari_segment_blobs_and_things_with_membranes import voronoi_otsu_labeling, \
                                                           seeded_watershed, \
                                                           local_minima_seeded_watershed
from skimage.io import imread
from skimage.filters import gaussian
from skimage import data
from pyclesperanto_prototype import imshow

Nous chargeons l’image exemple Cells3d de scikit-image, qui est une image à deux canaux montrant les noyaux et les membranes.

cells = data.cells3d()
cells.shape
(60, 2, 256, 256)
nuclei_channel = cells[30, 1]

imshow(nuclei_channel)
../_images/48ec40b26877c86f9b1576deb06dea99716314d4f2bc2fca2ce0422e1ddee3bb.png
membrane_channel = cells[30, 0]

imshow(membrane_channel, max_display_intensity=6000)
../_images/94deb1a34bb5d8ad6a58f232d0c3369dee64e6b96553da040e3b8b544c546b8c.png

Étiquetage Voronoi-Otsu pour la segmentation des noyaux#

Tout d’abord, nous commençons par segmenter les noyaux en utilisant l’algorithme d’étiquetage Voronoi-Otsu.

labeled_nuclei = voronoi_otsu_labeling(nuclei_channel, spot_sigma=10, outline_sigma=2)
labeled_nuclei
nsbatwm made image
shape(256, 256)
dtypeint32
size256.0 kB
min0
max25

Ligne de partage des eaux avec graines#

Nous pouvons utiliser l’image des noyaux étiquetés comme point de départ pour inonder les zones de faible intensité dans l’image de la membrane. Cela nous permet de déterminer une segmentation cellulaire.

labeled_cells = seeded_watershed(membrane_channel, labeled_nuclei)
labeled_cells
nsbatwm made image
shape(256, 256)
dtypeint32
size256.0 kB
min1
max25

Si les contours des cellules ne sont pas 100% précis, il peut être judicieux de flouter légèrement l’image de la membrane avant de segmenter les cellules.

blurred = gaussian(membrane_channel, sigma=3)

labeled_cells = seeded_watershed(blurred, labeled_nuclei)
labeled_cells
nsbatwm made image
shape(256, 256)
dtypeint32
size256.0 kB
min1
max25

Ligne de partage des eaux avec graines utilisant une détection automatique des graines#

Dans le cas où nous n’aurions pas imagé un canal séparé pour les noyaux et que nous n’aurions que le canal membranaire disponible pour la segmentation, nous pouvons utiliser l’image de la membrane pour rechercher les minima locaux (zones sombres).

labeles_cells2 = local_minima_seeded_watershed(membrane_channel)
labeles_cells2
nsbatwm made image
shape(256, 256)
dtypeint32
size256.0 kB
min1
max27

Cette fonction dispose également de certains paramètres permettant d’affiner la segmentation. Le paramètre outline_sigma permet de contrôler un filtre de flou gaussien qui permet d’affiner les contours des cellules segmentées comme montré ci-dessus.

labeles_cells3 = local_minima_seeded_watershed(
                      membrane_channel, 
                      outline_sigma=3)
labeles_cells3
nsbatwm made image
shape(256, 256)
dtypeint32
size256.0 kB
min1
max27

S’il y a plusieurs cellules collées ensemble, il peut être judicieux de spécifier spot_sigma. Ce paramètre permet de configurer à quel point les cellules sont proches / grandes.

labeles_cells4 = local_minima_seeded_watershed(
                       membrane_channel, 
                       spot_sigma=9, 
                       outline_sigma=3)
labeles_cells4
nsbatwm made image
shape(256, 256)
dtypeint32
size256.0 kB
min1
max28

Exercice#

Chargez le jeu de données suivant et trouvez de bons paramètres pour le traiter en utilisant une approche de ligne de partage des eaux avec graines. Ces données d’image d’exemple sont une gracieuseté de Sascha M. Kuhn, Nadler Lab, MPI-CBG Dresden.

image_slice = imread("../../data/membrane_2d_timelapse.tif")[2]

imshow(image_slice)
../_images/89170cd60610412fc7cc87e64ecf0259448f516bd2ea1014fbaa5d85c41d7f86.png