Etiquetado de componentes conectados en mosaicos#

Etiquetar objetos en mosaicos es una tarea desafiante. Si este paso no se puede evitar, dask-image ofrece la funcionalidad adecuada para obtener imágenes etiquetadas con etiquetas que cruzan múltiples mosaicos.

import numpy as np
import dask
import dask.array as da
from skimage.data import cells3d
from skimage.io import imread
from skimage.measure import label as skimage_label
import pyclesperanto_prototype as cle
from pyclesperanto_prototype import imshow
from dask_image.ndmeasure import label as daskimage_label
image = imread("../../data/blobs.tif") > 128
imshow(image)
../_images/bc8b964563969e824e1e452e9ee92af0a0b36f9e58fefa5725be34bf21a7f04b.png
tiles = da.from_array(image, chunks=(128, 128))
tiles
Array Chunk
Bytes 63.50 kiB 16.00 kiB
Shape (254, 256) (128, 128)
Count 4 Tasks 4 Chunks
Type bool numpy.ndarray
256 254

Usaremos la función label() de scikit-image para procesar nuestra imagen.

procedure = skimage_label

tile_map = da.map_blocks(procedure, tiles)

result = tile_map.compute()
imshow(result, labels=True)
../_images/85f5dc7fe2faef30a7c0698b3ac33dd3c8f3c7351c3eabf940aa698f5020eab0.png

En esta imagen, ya podemos ver que el resultado tiene artefactos en los bordes de los mosaicos en el centro horizontal y vertical de la imagen. Para verificar aún más el resultado, calcularemos el etiquetado de componentes conectados de la imagen sin mosaicos.

reference = skimage_label(image)

imshow(reference, labels=True)
../_images/cdc69e90459a3a8cba2befb95af73d5516bbe4e985521e69b09df76db2dc5308.png

A continuación, podemos comparar la intensidad máxima en la imagen etiquetada para ver si el número total de etiquetas en estas dos imágenes es igual. No lo son:

result.max(), reference.max()
(20, 63)

Al calcular la desviación estándar de la intensidad de píxeles en la imagen resultante agrupada por las etiquetas de referencia, podemos visualizar qué objetos no están segmentados correctamente.

stddev_map = cle.standard_deviation_intensity_map(result, reference) > 0

imshow(stddev_map)
../_images/eb860aef8140012781f0c648b5db2f14c66501acef97671110743f440349f90c.png

Etiquetado de componentes conectados en mosaicos utilizando dask-image#

La biblioteca de procesamiento de imágenes dask-image tiene disponible una versión distribuida de etiquetado de componentes conectados dask_image.ndmeasure.label:

result_di, num_labels = daskimage_label(image)

imshow(result_di, labels=True)
../_images/cdc69e90459a3a8cba2befb95af73d5516bbe4e985521e69b09df76db2dc5308.png

Ten en cuenta que el resultado de esta operación es un dask-array, y calcular el máximo, por ejemplo, no es sencillo:

result_di.max(), reference.max()
(dask.array<amax-aggregate, shape=(), dtype=int32, chunksize=(), chunktype=numpy.ndarray>,
 63)
np.asarray(result_di).max(), reference.max()
(63, 63)