Seeded Watershed für membranbasierte Zellsegmentierung#

In diesem Abschnitt werden wir einen Seeded-Watershed-Ansatz zur Zellsegmentierung verwenden. Dieser Ansatz ist sehr verbreitet, wenn die Zellsegmentierung auf Bildern von Membranmarkern basiert. Daher verwenden wir das napari-Plugin napari-segment-blobs-and-things-with-membranes. Im Hintergrund verwendet dieses Plugin Funktionen von scikit-image.

Siehe auch

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

Wir laden das Cells3d-Beispielbild aus scikit-image, das ein zweikanaliges Bild ist, das Zellkerne und Membranen zeigt.

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

Voronoi-Otsu-Labeling für Zellkernsegmentierung#

Zunächst beginnen wir mit der Segmentierung der Zellkerne unter Verwendung des Voronoi-Otsu-Labeling-Algorithmus.

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

Seeded Watershed#

Wir können das Bild der markierten Zellkerne als Ausgangspunkt für die Flutung der Bereiche mit niedriger Intensität im Membranbild verwenden. Dies ermöglicht uns, eine Zellsegmentierung zu bestimmen.

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

Wenn die Umrisse der Zellen nicht zu 100% genau sind, kann es sinnvoll sein, das Membranbild vor der Segmentierung der Zellen etwas zu verwischen.

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

Seeded Watershed mit automatischer Keimpunktdetektion#

Falls wir keinen separaten Zellkernkanal aufgenommen haben und nur den Membrankanal für die Segmentierung zur Verfügung haben, können wir das Membranbild verwenden, um nach lokalen Minima (dunkle Bereiche) zu suchen.

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

Diese Funktion verfügt auch über einige Parameter, die eine Feinabstimmung der Segmentierung ermöglichen. Der Parameter outline_sigma ermöglicht die Steuerung eines Gauß’schen Weichzeichnungsfilters, der eine Feinabstimmung der Umrisse der segmentierten Zellen ermöglicht, wie oben gezeigt.

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

Wenn mehrere Zellen zusammenkleben, kann es sinnvoll sein, spot_sigma festzulegen. Dieser Parameter ermöglicht die Konfiguration, wie nah / groß Zellen sind.

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

Übung#

Laden Sie den folgenden Datensatz und finden Sie gute Parameter für die Verarbeitung mit einem Seeded-Watershed-Ansatz. Dieses Beispielbildmaterial wurde freundlicherweise von Sascha M. Kuhn, Nadler Lab, MPI-CBG Dresden zur Verfügung gestellt.

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

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