Imágenes etiquetadas#

Conceptualmente, las imágenes etiquetadas son una extensión de las imágenes binarias. En una imagen etiquetada, todos los píxeles con valor 0 corresponden al fondo, una región especial que no se considera como ningún objeto. Los píxeles con un valor mayor que 0 indican que el píxel pertenece a un objeto e identifica ese objeto con el número dado. Un píxel con valor 1 pertenece al primer objeto y los píxeles con valor 2 pertenecen a un segundo objeto y así sucesivamente. Idealmente, los objetos se etiquetan de manera consecutiva, porque entonces, la intensidad máxima en una imagen etiquetada corresponde al número de objetos etiquetados en esta imagen.

Etiquetado de componentes conectados#

Técnicamente podemos usar ambas alternativas para el etiquetado de componentes conectados, dependiendo de la conectividad que se utilice para conectar píxeles en la función de etiquetado.

Conectividad

  1. von Neumann, 4-conectado

  2. Moore, 8-conectado

Etiquetado de componentes 4-conectados#

Ver también

Comenzamos con una imagen binaria inventada.

import numpy as np
import pyclesperanto_prototype as cle
from pyclesperanto_prototype import imshow

binary_image = np.asarray([
    [1, 1, 0, 0, 0, 0 ,0],
    [0, 0, 1, 0, 0, 0 ,0],
    [0, 0, 0, 1, 1, 1 ,0],
    [0, 0, 0, 1, 1, 1 ,0],
    [1, 1, 0, 0, 0, 0 ,0],
    [1, 1, 0, 0, 1, 1 ,1],
    [1, 1, 0, 0, 1, 1 ,1],    
])
imshow(binary_image, color_map='Greys_r')
c:\structure\code\pyclesperanto_prototype\pyclesperanto_prototype\_tier9\_imshow.py:14: UserWarning: The imshow parameter color_map is deprecated. Use colormap instead.
  warnings.warn("The imshow parameter color_map is deprecated. Use colormap instead.")
../_images/6247bce24e7fe5f93f52f603857ee6e3fda9ff2b3d697f1fc42cbc1decc10772.png

Esta imagen binaria puede interpretarse de dos maneras: O bien hay cinco rectángulos con tamaños que van de 1 a 6. Alternativamente, hay dos rectángulos de tamaño 6 y una estructura en forma de serpiente de 9 píxeles de tamaño.

from skimage.measure import label
labeled_4_connected = label(binary_image, connectivity=1)

imshow(labeled_4_connected, labels=True)
../_images/6ca23d0e6c3bed80061b4d4721b6f2dd21ee388025034df3ec7aea7da8d06538.png

Etiquetado de componentes 8-conectados#

from skimage.measure import label
labeled_8_connected = label(binary_image, connectivity=2)

imshow(labeled_8_connected, labels=True)
../_images/616ac94fb987723296d1c6bfac12b5b8217ee86e55a385672e9302290113fa3c.png

En la práctica, para contar células, la conectividad no es tan importante. Por eso a menudo no se proporciona el parámetro de conectividad.

Etiquetado de componentes conectados en clesperanto#

En clesperanto, ambas opciones de conectividad para el etiquetado de componentes conectados están implementadas en dos funciones diferentes. Al etiquetar objetos usando el vecindario de píxeles 4-conectados, consideramos el vecindario “diamante” de todos los píxeles.

labeled_4_connected2 = cle.connected_components_labeling_diamond(binary_image)

imshow(labeled_4_connected2, labels=True)
../_images/ce74ef9e0ec06590008c0add62a30c42cdf12bdaad59d8f5b812f5eff979d954.png

El vecindario 8-conectado considera una “caja” alrededor de todos los píxeles.

labeled_8_connected2 = cle.connected_components_labeling_box(binary_image)

imshow(labeled_8_connected2, labels=True)
../_images/616ac94fb987723296d1c6bfac12b5b8217ee86e55a385672e9302290113fa3c.png

Etiquetado en la práctica#

Para demostrar el etiquetado en un caso de uso práctico, etiquetamos la imagen blobs.tif.

# Cargar datos
from skimage.io import imread
blobs = imread("../../data/blobs.tif")

# Umbralización
from skimage.filters import threshold_otsu
threshold = threshold_otsu(blobs)
binary_blobs = blobs > threshold

# Etiquetado de componentes conectados
from skimage.measure import label
labeled_blobs = label(binary_blobs)

# Visualización
import matplotlib.pyplot as plt
fig, axs = plt.subplots(1, 3, figsize=(15,15))

cle.imshow(blobs, plot=axs[0])
cle.imshow(binary_blobs, plot=axs[1])
cle.imshow(labeled_blobs, plot=axs[2], labels=True)
../_images/847e0c5376cb41852f804765b2ae51d1412c19228168e8a83038c063d2ed8c1e.png

Ejercicio#

Descubre experimentalmente cuál es la configuración predeterminada del parámetro de conectividad de la función skimage.measure.label.