Separación de objetos en contacto#

Un caso de uso común para el algoritmo de watershed es la separación de objetos en contacto. En este cuaderno, separaremos objetos en imágenes binarias que tienen una forma redondeada y se tocan entre sí.

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

El punto de partida para esto es una imagen binaria, por ejemplo, creada usando umbralización.

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

Luego podemos separar los objetos en contacto considerando solo la imagen binaria. El algoritmo subyacente tiene como objetivo producir resultados similares al algoritmo de watershed binario de ImageJ y la implementación aquí también funciona en 3D.

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

La función split_touching_objects también tiene un parámetro sigma que permite controlar cuán agresivamente se deben separar los objetos. Para hacer más divisiones, ingrese un número menor que 3.5, que es el valor predeterminado.

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

También es posible obtener una imagen etiquetada como resultado. Tenga en cuenta que en este caso, la línea/espacio negro entre objetos no estará presente.

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