Maillages voisins en trois dimensions#
Les maillages voisins que nous avons étudiés dans ce chapitre fonctionnent généralement aussi en trois dimensions. C’est simplement plus difficile à visualiser.
from skimage.io import imread
import pyclesperanto_prototype as cle
import matplotlib.pyplot as plt
Les données d’image que nous utilisons ici montrent une coupe d’un embryon de Tribolium castaneum en développement imagé par microscopie à feuille de lumière par Daniela Vorkel, laboratoire Myers, MPI-CBG / CSBD Dresden.
raw_image = imread("../../data/Lund_000500_resampled-cropped.tif")
raw_image.shape
(100, 256, 256)
Pour faciliter l’utilisation, nous écrivons une courte fonction pour visualiser notre pile d’images en trois projections maximales de différentes perspectives.
def orthogonal_show(image, labels=False):
fig, axs = plt.subplots(1, 3, figsize=(15, 7))
cle.imshow(cle.maximum_x_projection(image), plot=axs[0], labels=labels)
cle.imshow(cle.maximum_y_projection(image), plot=axs[1], labels=labels)
cle.imshow(cle.maximum_z_projection(image), plot=axs[2], labels=labels)
axs[0].set_title("Intensité maximale le long de X")
axs[1].set_title("Intensité maximale le long de Y")
axs[2].set_title("Intensité maximale le long de Z")
orthogonal_show(raw_image)
Nous pouvons maintenant segmenter les noyaux dans notre jeu de données.
background_subtracted = cle.top_hat_box(raw_image, radius_x=5, radius_y=5, radius_z=5)
nuclei = cle.voronoi_otsu_labeling(background_subtracted)
orthogonal_show(nuclei, labels=True)
Après la segmentation, nous élargissons un peu les étiquettes pour qu’elles se touchent.
expanded_nuclei = cle.dilate_labels(nuclei, radius=4)
orthogonal_show(expanded_nuclei, labels=True)
Et ensuite, nous pouvons visualiser un maillage de distance (centroïde) entre les voisins qui se touchent.
mesh = cle.draw_distance_mesh_between_touching_labels(expanded_nuclei)
orthogonal_show(mesh)