Cartographier la surface des objets dans des tuiles#
Dans ce notebook, nous allons segmenter les noyaux dans des tuiles et mesurer leur surface. Nous sauvegarderons ensuite la carte de surface résultante à nouveau sous forme de tuiles dans un fichier zarr. Cette stratégie peut être utilisée pour traiter des données qui, dans leur ensemble, ne tiennent pas dans la mémoire de l’ordinateur.
import zarr
import dask.array as da
import numpy as np
from skimage.io import imread
import pyclesperanto_prototype as cle
from pyclesperanto_prototype import imshow
from numcodecs import Blosc
À des fins de démonstration, nous utilisons un ensemble de données fourni par Theresa Suckert, OncoRay, Hôpital Universitaire Carl Gustav Carus, TU Dresden. L’ensemble de données est sous licence Licence : CC-BY 4.0. Nous utilisons ici une version recadrée qui a été réenregistrée en tant qu’image 8 bits pour pouvoir la fournir avec le notebook. Vous trouverez l’image 16 bits en taille réelle au format de fichier CZI en ligne.
image = imread('../../data/P1_H_C3H_M004_17-cropped.tif')[1]
# à des fins de test, nous recadrons encore plus l'image.
# commentez la ligne suivante pour exécuter sur l'ensemble des 5000x2000 pixels
image = image[1000:1500, 1000:1500]
#compresser ET transformer le tableau numpy en un tableau zarr
compressor = Blosc(cname='zstd', clevel=3, shuffle=Blosc.BITSHUFFLE)
# Convertir l'image en tableau zarr
chunk_size = (100, 100)
zarray = zarr.array(image, chunks=chunk_size, compressor=compressor)
# sauvegarder zarr sur le disque
zarr_filename = '../../data/P1_H_C3H_M004_17-cropped.zarr'
zarr.convenience.save(zarr_filename, zarray)
Cartes de surface des objets en tuiles#
Dask offre un support intégré pour le format de fichier zarr. Nous pouvons créer des tableaux dask directement à partir d’un fichier zarr.
zarr_image = da.from_zarr(zarr_filename)
zarr_image
|
Nous pouvons appliquer le traitement d’image directement à cet ensemble de données en tuiles.
def area_map(image):
"""
Étiqueter les objets dans une image binaire et produire une image de carte de comptage de pixels.
"""
print("Traitement d'une image de taille", image.shape)
labels = cle.voronoi_otsu_labeling(image, spot_sigma=3.5)
result = cle.pixel_count_map(labels)
print(result.shape)
return np.asarray(result)
Test du traitement d’image par tuiles#
Nous devrions tester notre algorithme de cartographie de surface sur une seule tuile. En réalité, dans un scénario réel, le flux de travail de traitement d’image est développé sur des tuiles individuelles, par exemple dans un notebook comme celui-ci. Dès que nous sommes sûrs que l’algorithme fonctionne, nous pouvons l’appliquer à toutes les tuiles.
test_image = image[100:200,100:200]
imshow(test_image)
test_result = area_map(test_image)
imshow(test_result, colorbar=True)
Processing image of size (100, 100)
(100, 100)
Application du traitement d’image par tuiles à un ensemble de données supporté par zarr#
L’application de la fonction à notre ensemble de données zarr donnera également un tableau dask.
overlap_width = 30
tile_map = da.map_overlap(area_map, zarr_image, depth=overlap_width, boundary=0)
tile_map
Processing image of size (0, 0)
Processing image of size (1, 1)
(1, 1)
Processing image of size (0, 0)
|
Avant de pouvoir commencer le calcul, nous devons désactiver l’exécution asynchrone des opérations dans pyclesperanto. Voir aussi le problème lié.
cle.set_wait_for_kernel_finish(True)
Lorsque nous invoquons la sauvegarde des résultats sur le disque, le traitement se fera sur des tuiles individuelles.
processed_zarr_filename = '../../data/P1_H_C3H_M004_17-processed.zarr'
tile_map.to_zarr(processed_zarr_filename, overwrite=True)
Processing image of size (160, 160)
Processing image of size (160, 160)
Processing image of size (160, 160)
Processing image of size (160, 160)
Processing image of size (160, 160)
Processing image of size Processing image of size (160, 160)
(160, 160)
Processing image of size (160, 160)
Processing image of size (160, 160)
Processing image of size (160, 160)
(160, 160)
Processing image of size (160, 160)
(160, 160)
(160, 160)
(160, 160)
Processing image of size Processing image of size (160, 160)
(160, 160)
(160, 160)
(160, 160)
(160, 160)
Processing image of size (160, 160)
Processing image of size(160, 160)
(160, 160)
Processing image of size (160, 160)
(160, 160)
Processing image of size (160, 160)
Processing image of size (160, 160)
Processing image of size (160, 160)
(160, 160)
Processing image of size (160, 160)
(160, 160)
Processing image of size (160, 160)
(160, 160)
(160, 160)
(160, 160)
(160, 160)Processing image of sizeProcessing image of size(160, 160)
(160, 160)
(160, 160)
Processing image of size (160, 160)
Processing image of size (160, 160)
(160, 160)
(160, 160)
(160, 160)
(160, 160)
(160, 160)
(160, 160)
(160, 160)
(160, 160)
(160, 160)
Chargement de zarr#
Juste à des fins de démonstration, nous allons charger l’image en tuiles supportée par zarr et la visualiser. Lors du travail avec de grandes données, cette étape pourrait ne pas être possible.
zarr_result = da.from_zarr(processed_zarr_filename)
zarr_result
|
result = zarr_result.compute()
cle.imshow(result)