Seleccionar etiquetas basadas en su tamaño#

Después de que una imagen ha sido segmentada y los objetos están etiquetados, es posible que queramos eliminar objetos que son demasiado pequeños o demasiado grandes para ser considerados como objetos, núcleos por ejemplo.

import pyclesperanto_prototype as cle

from skimage.io import imread
import matplotlib
import numpy as np
import stackview

# initialize GPU
cle.select_device("GTX")
c:\structure\code\pyclesperanto_prototype\pyclesperanto_prototype\_tier0\_device.py:77: UserWarning: No OpenCL device found with GTX in their name. Using gfx1035 instead.
  warnings.warn(f"No OpenCL device found with {name} in their name. Using {device.name} instead.")
<gfx1035 on Platform: AMD Accelerated Parallel Processing (2 refs)>

Comenzamos con una versión etiquetada de la imagen de manchas.

# load data
label_image = imread('../../data/blobs_labeled.tif')

stackview.insight(label_image)
shape(254, 256)
dtypeuint32
size254.0 kB
min0
max63

Supongamos que no estamos interesados en los objetos muy pequeños ya que podrían ser el resultado de una falsa segmentación de algún ruido. Sabemos que los objetos que hemos fotografiado tienen un cierto tamaño mínimo. A partir de esta suposición física, necesitamos estimar un número de píxeles (en 2D) o vóxeles (en 3D) que sean grandes los objetos. Podemos entonces usar este número como size_threshold en píxeles o vóxeles.

size_threshold = 200 # pixels

large_labels_only = cle.exclude_small_labels(label_image, maximum_size=size_threshold)

large_labels_only
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min0.0
max52.0

Podemos usar una función similar para visualizar los objetos que se han eliminado anteriormente en una imagen de etiquetas separada.

small_labels_only = cle.exclude_large_labels(label_image, minimum_size=size_threshold)

small_labels_only
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min0.0
max11.0