Etiquetado Gauss-Otsu#
Hasta ahora hemos procesado imágenes utilizando filtros como el desenfoque gaussiano, algoritmos de umbral como el método de Otsu y hemos etiquetado objetos utilizando el etiquetado de componentes conectados. La combinación de estos tres algoritmos en particular es tan común que existen funciones de conveniencia disponibles para ejecutar estas tres operaciones de una sola vez. Este flujo de trabajo para la segmentación de imágenes es un enfoque muy simple, por ejemplo, para detectar y segmentar núcleos en imágenes de microscopía de fluorescencia. Funcionará si los objetos no están demasiado densos.
from skimage.io import imread
import matplotlib.pyplot as plt
import pyclesperanto_prototype as cle
Para demostrar el flujo de trabajo, estamos utilizando datos de imágenes del Broad Bio Image Challenge: Utilizamos el conjunto de imágenes BBBC022v1 Gustafsdottir et al., PLOS ONE, 2013, disponible en la Broad Bioimage Benchmark Collection Ljosa et al., Nature Methods, 2012.
Cargamos la imagen y, con fines de visualización, recortamos una subregión:
input_image = imread("../../data/BBBC022/IXMtest_A02_s9.tif")[:,:,0]
input_crop = input_image[0:200, 200:400]
fig, axs = plt.subplots(1, 2, figsize=(15, 15))
cle.imshow(input_image, plot=axs[0])
cle.imshow(input_crop, plot=axs[1])
Aplicando el algoritmo#
El etiquetado Gauss-Otsu es un comando en pyclesperanto y el plugin scriptable de napari napari-segment-blobs-and-things-with-membranes. La operación tiene un parámetro outline_sigma para controlar qué tan precisos son los contornos de los objetos segmentados.
sigma_outline = 1
segmented = cle.gauss_otsu_labeling(input_image, outline_sigma=sigma_outline)
segmented_crop = segmented[0:200, 200:400]
fig, axs = plt.subplots(1, 2, figsize=(15, 15))
cle.imshow(segmented, labels=True, plot=axs[0])
cle.imshow(segmented_crop, labels=True, plot=axs[1])
sigma_outline = 7
segmented = cle.gauss_otsu_labeling(input_image, outline_sigma=sigma_outline)
segmented_crop = segmented[0:200, 200:400]
fig, axs = plt.subplots(1, 2, figsize=(15, 15))
cle.imshow(segmented, labels=True, plot=axs[0])
cle.imshow(segmented_crop, labels=True, plot=axs[1])
Como puede ver, si los objetos están demasiado cerca, se segmentarán juntos. En estos casos se recomienda probar Voronoi-Otsu-Labeling.