Eliminar etiquetas en los bordes de la imagen#

Cuando se analizan imágenes científicamente, a menudo es relevante que solo se analicen los objetos en la imagen que están completamente capturados.

import pyclesperanto_prototype as cle
from skimage.segmentation import clear_border, relabel_sequential
from skimage.io import imread
import stackview
import numpy as np

Nuestro punto de partida será una imagen etiquetada; por ejemplo, derivada de blobs.tif mediante umbralización y etiquetado de componentes conectados:

# load data
image = imread('../../data/blobs.tif')

# process the image
blurred = cle.gaussian_blur(image, sigma_x=1, sigma_y=1)
binary = cle.threshold_otsu(blurred)
labeled = cle.connected_components_labeling_box(binary)

# show result
labeled
c:\structure\code\pyclesperanto_prototype\pyclesperanto_prototype\_tier9\_imshow.py:34: UserWarning: cle.imshow is deprecated, use stackview.imshow instead.
  warnings.warn("cle.imshow is deprecated, use stackview.imshow instead.")
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min0.0
max62.0
num_labels = len(np.unique(labeled)) - 1
print("Number of objects in the image: " + str(num_labels))
Number of objects in the image: 62

En caso de que el tamaño de los objetos sea relevante, se deben excluir los objetos que no fueron completamente capturados y, por lo tanto, tocan el borde de la imagen.

labels_excl_edges = clear_border(np.asarray(labeled))

stackview.insight(labels_excl_edges)
shape(254, 256)
dtypeuint32
size254.0 kB
min0
max55

Observa que la intensidad máxima en la imagen etiquetada anterior es 55 y el número de objetos es 44 (ver abajo). Por lo tanto, esta es una imagen etiquetada donde no todas las etiquetas entre 1 y 44 están presentes.

num_labels = len(np.unique(labels_excl_edges)) - 1
print("Number of objects in the image: " + str(num_labels))
Number of objects in the image: 44

Etiquetado subsecuente#

Muchos algoritmos para el procesamiento posterior de imágenes etiquetadas requieren que las etiquetas estén etiquetadas de manera subsecuente. Por lo tanto, necesitamos arreglar esto con la imagen anterior.

relabeled, _, _ = relabel_sequential(labels_excl_edges)

stackview.insight(relabeled)
shape(254, 256)
dtypeuint32
size254.0 kB
min0
max44

Otras implementaciones para eliminar objetos en los bordes de la imagen no requieren este paso:

# Exclude Labels On Edges
labels_excl_edges = cle.exclude_labels_on_edges(labeled)

labels_excl_edges
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min0.0
max44.0
num_labels = len(np.unique(labels_excl_edges)) - 1
print("Number of objects in the image: " + str(num_labels))
Number of objects in the image: 44