Formats de fichiers d’images en tuiles : zarr#

Lorsqu’on travaille avec de grandes données d’images, des formats de fichiers spéciaux tels que le format zarr sont couramment utilisés. Zarr stocke les données d’image en morceaux. Au lieu de charger un énorme ensemble de données d’image à partir du disque puis de le découper en tuiles, il est possible de charger des tuiles zarr individuelles, de les traiter et de sauvegarder le résultat sur le disque. De cette façon, on peut traiter de grandes images sans jamais charger la grande image en mémoire.

L’utilisation de ces formats apporte des défis supplémentaires, par exemple la réenregistrement de la grande image en petites tuiles basées sur zarr doit se faire sur un ordinateur capable d’ouvrir la grande image au départ. Ce notebook montre comment faire cela dans un scénario légèrement irréaliste : Nous chargeons d’abord l’ensemble de données pour le réenregistrer sous forme de tuiles et à la fin, nous chargeons ces tuiles à partir du disque et les visualisons. Dans un scénario réaliste, ces deux étapes ne seraient pas possibles. Selon le scénario, ces deux étapes doivent être improvisées.

Voir aussi

import zarr
import dask.array as da
import numpy as np
from skimage.io import imread, 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]

image.shape
(500, 500)
imshow(image)
<matplotlib.image.AxesImage at 0x2ca194abf70>
../_images/2f703e718a1144a45bc33612dc5d898fe92d8e3dc9405ac96d73a93c0b743902.png

Sauvegarde au format zarr#

Nous allons maintenant réenregistrer notre grande image au format de fichier zarr.

#compresser ET transformer le tableau numpy en un tableau zarr
compressor = Blosc(cname='zstd', clevel=3, shuffle=Blosc.BITSHUFFLE)

chunk_size = (100, 100)

zarray = zarr.array(image, chunks=chunk_size, compressor=compressor)
zarr_filename = '../../data/P1_H_C3H_M004_17-cropped.zarr'
zarr.convenience.save(zarr_filename, zarray)

Vous verrez alors qu’un dossier est créé avec le nom donné. Dans ce dossier se trouveront de nombreux fichiers. Chacun de ces fichiers correspond à une tuile d’image.

Chargement de zarr#

Juste à des fins de démonstration, nous allons charger l’image en tuiles stockée en zarr et la visualiser. Lors du travail avec de grandes données, cette étape pourrait ne pas être possible.

zarr_result = da.from_zarr(zarr_filename)
zarr_result
Array Chunk
Bytes 244.14 kiB 9.77 kiB
Shape (500, 500) (100, 100)
Dask graph 25 chunks in 2 graph layers
Data type uint8 numpy.ndarray
500 500
result = zarr_result.compute()

imshow(result)
<matplotlib.image.AxesImage at 0x2ca19586b80>
../_images/2f703e718a1144a45bc33612dc5d898fe92d8e3dc9405ac96d73a93c0b743902.png