Traitement des données de time-lapse#
Ce notebook démontre comment traiter les données de time-lapse image par image.
from skimage.io import imread, imsave
import pyclesperanto_prototype as cle
import numpy as np
Tout d’abord, nous devons définir l’origine des données que nous voulons traiter et où les résultats doivent être sauvegardés.
input_file = "../../data/CalibZAPWfixed_000154_max.tif"
output_file = "../../data/CalibZAPWfixed_000154_max_labels.tif"
Ensuite, nous ouvrons le jeu de données et voyons quelles dimensions d’image il possède.
timelapse = imread(input_file)
timelapse.shape
(100, 235, 389)
S’il n’est pas évident de savoir quelle dimension est la dimension temporelle, il est recommandé de découper le jeu de données dans différentes directions.
cle.imshow(timelapse[:,:,150])
cle.imshow(timelapse[50,:,:])
Évidemment, la dimension temporelle est la première dimension (index 0).
Ensuite, nous définissons le flux de traitement d’image que nous voulons appliquer à notre jeu de données. Il est recommandé de le faire dans une fonction pour que nous puissions la réutiliser plus tard sans tout copier-coller.
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)
Après avoir fait fonctionner cette fonction sur un seul point temporel, nous devrions programmer une boucle for qui parcourt le time-lapse, applique la procédure à quelques images et visualise les résultats. Note : Nous parcourons le time-lapse par pas de 10 images, pour avoir un aperçu.
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)
Lorsque nous sommes convaincus que la procédure fonctionne, nous pouvons l’appliquer à l’ensemble du time-lapse, collecter les résultats dans une liste et les sauvegarder sous forme de pile sur le disque.
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)
Juste pour être sûr que tout a bien fonctionné, nous rouvrons le jeu de données et affichons sa dimensionnalité. Elle est censée être identique à celle du jeu de données timelapse original.
result = imread(output_file)
result.shape
(100, 235, 389)
timelapse.shape
(100, 235, 389)