Etiquetado de objetos en contacto#

Al procesar imágenes de microscopía de fluorescencia, a menudo nos enfrentamos a objetos que se adhieren entre sí y que deberían diferenciarse. Sin embargo, si aplicamos el etiquetado de componentes conectados después de la umbralización, obtenemos un objeto etiquetado, donde creemos que debería haber dos. Los usuarios de ImageJ utilizarían entonces el algoritmo “Watershed” que es capaz de dividir objetos si la forma de un objeto sugiere que contiene dos. Algunas funciones en SimpleITK nos permiten hacer lo mismo. De nuevo, por conveniencia de programación, utilizamos el plugin scriptable de napari napari-simpleitk-image-processing.

import numpy as np
from skimage.io import imread
from pyclesperanto_prototype import imshow
from napari_simpleitk_image_processing import threshold_otsu, touching_objects_labeling, gaussian_blur

Nuestro punto de partida es una imagen binaria con algunos objetos en forma de 8 que nos gustaría dividir.

blobs = imread('../../data/blobs.tif')
binary = threshold_otsu(blobs)
imshow(binary)
../_images/aac24fde3fd260040b5033ca92c02ff51dae5ae320de2449b8e8e86ef339dc9d.png

La función touching_objects_labeling toma una imagen binaria como entrada y produce una imagen de etiquetas, al igual que el etiquetado de componentes conectados. Sin embargo, el resultado difiere: los objetos en forma de 8 se dividen.

touching_labels = touching_objects_labeling(binary)
imshow(touching_labels, labels=True)
../_images/085fe1c8193f4184424dd2906f65a85e2b936768f3244a1076c369e8382f0cfb.png

Ajuste fino del resultado#

Si no todos los objetos deben dividirse, se puede ajustar el resultado de este proceso modificando la imagen binaria antes de pasarla a touching_objects_labeling. Por ejemplo, si aplicamos un filtro de desenfoque gaussiano antes de umbralizar la imagen, podemos obtener una imagen de etiquetas donde se dividen menos objetos.

blurred = gaussian_blur(blobs, variance_x=25, variance_y=25)

binary2 = threshold_otsu(blurred)
imshow(binary2)
../_images/31cbe81776263a510c37583ed870c7788f40b99fe6c478cfd4cac4e432a36191.png
touching_labels = touching_objects_labeling(binary2)
imshow(touching_labels, labels=True)
../_images/4ce25d636a55076ac620b9fe73263ce5c71e27ddfe11dbd6049156659a975462.png