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)
|
|
|
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
|
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
|
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
|
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
|