Watershed con semillas para segmentación celular basada en membranas#

En esta sección utilizaremos un enfoque de watershed con semillas para la segmentación celular. Este enfoque es muy común cuando se realiza la segmentación celular basada en imágenes de marcadores de membrana. Por lo tanto, usamos el plugin de napari napari-segment-blobs-and-things-with-membranes. Internamente, este plugin utiliza funciones de scikit-image.

Ver también

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

Cargamos la imagen de ejemplo Cells3d de scikit-image, que es una imagen de dos canales que muestra núcleos y membranas.

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

Etiquetado Voronoi-Otsu para segmentación de núcleos#

Primero, comenzamos segmentando los núcleos utilizando el algoritmo de Etiquetado 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

Watershed con semillas#

Podemos usar la imagen de núcleos etiquetados como punto de partida para inundar las áreas de baja intensidad en la imagen de membrana. Esto nos permite determinar una segmentación celular.

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

Si los contornos de las células no son 100% precisos, puede tener sentido desenfocar un poco la imagen de la membrana antes de segmentar las células.

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

Watershed con semillas usando detección automática de semillas#

En caso de que no hayamos capturado un canal de núcleos separado y solo tengamos disponible el canal de membrana para la segmentación, podemos usar la imagen de membrana para buscar mínimos locales (áreas oscuras).

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

Esta función también tiene algunos parámetros para permitir el ajuste fino de la segmentación. El parámetro outline_sigma permite controlar un filtro de desenfoque gaussiano que permite ajustar los contornos de las células segmentadas como se mostró anteriormente.

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

Si hay múltiples células pegadas entre sí, puede tener sentido especificar spot_sigma. Este parámetro permite configurar qué tan cercanas / grandes son las células.

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

Ejercicio#

Carga el siguiente conjunto de datos y encuentra buenos parámetros para procesarlo utilizando un enfoque de watershed con semillas. Estos datos de imagen de ejemplo son cortesía de Sascha M. Kuhn, Nadler Lab, MPI-CBG Dresden.

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

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