Procesamiento de datos de lapso de tiempo#
Este notebook demuestra cómo procesar datos de lapso de tiempo cuadro por cuadro.
from skimage.io import imread, imsave
import pyclesperanto_prototype as cle
import numpy as np
Primero, debemos definir el origen de los datos que queremos procesar y dónde se deben guardar los resultados.
input_file = "../../data/CalibZAPWfixed_000154_max.tif"
output_file = "../../data/CalibZAPWfixed_000154_max_labels.tif"
A continuación, abrimos el conjunto de datos y vemos qué dimensiones de imagen tiene.
timelapse = imread(input_file)
timelapse.shape
(100, 235, 389)
Si no es obvio cuál es la dimensión del tiempo, se recomienda cortar el conjunto de datos en diferentes direcciones.
cle.imshow(timelapse[:,:,150])
cle.imshow(timelapse[50,:,:])
Obviamente, la dimensión del tiempo es la primera dimensión (índice 0).
A continuación, definimos el flujo de trabajo de procesamiento de imágenes que queremos aplicar a nuestro conjunto de datos. Se recomienda hacer esto en una función para que luego podamos reutilizarla sin copiar y pegar todo.
def process_image(image,
# define default parameters for the procedure
background_subtraction_radius=10,
spot_sigma=1,
outline_sigma=1):
"""Segment nuclei in an image and return labels"""
# pre-process image
background_subtracted = cle.top_hat_box(image,
radius_x=background_subtraction_radius,
radius_y=background_subtraction_radius)
# segment nuclei
labels = cle.voronoi_otsu_labeling(background_subtracted,
spot_sigma=spot_sigma,
outline_sigma=outline_sigma)
return labels
# Try out the function
single_timepoint = timelapse[50]
segmented = process_image(single_timepoint)
# Visualize result
cle.imshow(segmented, labels=True)
Después de hacer que esta función funcione en un solo punto de tiempo, debemos programar un bucle for que recorra el lapso de tiempo, aplique el procedimiento a un par de imágenes y visualice los resultados. Nota: Avanzamos en pasos de 10 imágenes a través del lapso de tiempo, para obtener una visión general.
max_t = timelapse.shape[0]
for t in range(0, max_t, 10):
label_image = process_image(timelapse[t])
cle.imshow(label_image, labels=True)
Cuando estamos convencidos de que el procedimiento funciona, podemos aplicarlo a todo el lapso de tiempo, recopilar los resultados en una lista y guardarlos como pila en el disco.
label_timelapse = []
for t in range(0, max_t):
label_image = process_image(timelapse[t])
label_timelapse.append(label_image)
# convert list of 2D images to 3D stack
np_stack = np.asarray(label_timelapse)
# save result to disk
imsave(output_file, np_stack)
C:\Users\rober\AppData\Local\Temp\ipykernel_27924\219181406.py:10: UserWarning: ../../data/CalibZAPWfixed_000154_max_labels.tif is a low contrast image
imsave(output_file, np_stack)
Solo para estar seguros de que todo funcionó bien, volvemos a abrir el conjunto de datos e imprimimos su dimensionalidad. Se supone que es idéntica al conjunto de datos original timelapse.
result = imread(output_file)
result.shape
(100, 235, 389)
timelapse.shape
(100, 235, 389)