Étiquetage des composants connectés dans les tuiles#

L’étiquetage des objets dans les tuiles est une tâche difficile. Si cette étape ne peut être contournée, dask-image offre la fonctionnalité appropriée pour récupérer des images étiquetées avec des étiquettes traversant plusieurs tuiles.

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

Nous utiliserons la fonction label() de scikit-image pour traiter notre image.

procedure = skimage_label

tile_map = da.map_blocks(procedure, tiles)

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

Dans cette image, nous pouvons déjà voir que le résultat présente des artefacts aux bordures des tuiles au centre horizontal et vertical de l’image. Pour vérifier davantage le résultat, nous allons calculer l’étiquetage des composants connectés de l’image sans découpage en tuiles.

reference = skimage_label(image)

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

Ensuite, nous pouvons comparer l’intensité maximale dans l’image étiquetée pour voir si le nombre total d’étiquettes dans ces deux images est égal. Ils ne le sont pas :

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

En calculant l’écart-type de l’intensité des pixels dans l’image résultante groupée par les étiquettes de référence, nous pouvons visualiser quels objets ne sont pas segmentés correctement.

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

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

Étiquetage des composants connectés en tuiles utilisant dask-image#

La bibliothèque de traitement d’images dask-image dispose d’une version distribuée de l’étiquetage des composants connectés disponible dask_image.ndmeasure.label :

result_di, num_labels = daskimage_label(image)

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

Notez que le résultat de cette opération est un dask-array, et le calcul du maximum par exemple n’est pas simple :

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)