Formatos de archivo de imagen en mosaico: zarr#

Cuando se trabaja con grandes datos de imágenes, comúnmente se utilizan formatos de archivo especiales como el formato zarr. Zarr almacena los datos de imagen en fragmentos. En lugar de cargar un conjunto de datos de imagen enorme desde el disco y luego dividirlo en mosaicos, es posible cargar mosaicos individuales de zarr, procesarlos y guardar el resultado de vuelta en el disco. De esta manera, se pueden procesar imágenes grandes sin necesidad de cargar la imagen completa en la memoria.

El uso de estos formatos trae desafíos adicionales, por ejemplo, volver a guardar la imagen grande en pequeños mosaicos basados en zarr debe hacerse en una computadora capaz de abrir la imagen grande en primer lugar. Este notebook muestra cómo hacer esto en un escenario ligeramente poco realista: Primero cargamos el conjunto de datos para volver a guardarlo como mosaicos y al final, cargamos estos mosaicos desde el disco y los visualizamos. En un escenario realista, estos dos pasos no serían posibles. Dependiendo del escenario, estos dos pasos deben improvisarse.

Ver también

import zarr
import dask.array as da
import numpy as np
from skimage.io import imread, imshow
from numcodecs import Blosc

Para fines de demostración, utilizamos un conjunto de datos proporcionado por Theresa Suckert, OncoRay, Hospital Universitario Carl Gustav Carus, TU Dresden. El conjunto de datos está licenciado bajo Licencia: CC-BY 4.0. Aquí estamos utilizando una versión recortada que se ha guardado como imagen de 8 bits para poder proporcionarla con el notebook. Puedes encontrar la imagen completa de 16 bits en formato de archivo CZI en línea.

image = imread('../../data/P1_H_C3H_M004_17-cropped.tif')[1]

# para fines de prueba, recortamos aún más la imagen.
# comenta la siguiente línea para ejecutar en los 5000x2000 píxeles completos
image = image[1000:1500, 1000:1500]

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

Guardando como zarr#

Ahora volveremos a guardar nuestra imagen grande en el formato de archivo zarr.

#comprimir Y cambiar el array numpy a un array 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)

Luego verás que se crea una carpeta con el nombre dado. En esa carpeta se ubicarán muchos archivos. Cada uno de estos archivos corresponde a un mosaico de imagen.

Cargando zarr#

Solo con fines de demostración, cargaremos la imagen en mosaico respaldada por zarr y la visualizaremos. Al trabajar con grandes datos, este paso podría no ser posible.

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