Dessiner des maillages de distance entre voisins#
Lors de l’étude des relations de voisinage entre cellules, par exemple pour déterminer si les cellules peuvent communiquer entre elles, leurs distances les unes par rapport aux autres sont pertinentes. Nous pouvons visualiser celles-ci en utilisant des maillages de distance.
import pyclesperanto_prototype as cle
from numpy import random
from skimage.io import imread
Nous utilisons un ensemble de données publié par Heriche et al. sous licence CC BY 4.0 disponible dans la Image Data Resource.
raw_image = imread("../../data/plate1_1_013 [Well 5, Field 1 (Spot 5)].png")[:,:,0]
nuclei = cle.voronoi_otsu_labeling(raw_image, spot_sigma=15)
cle.imshow(nuclei, labels=True)
Un maillage peut par exemple être dessiné entre des voisins proximaux, des noyaux qui sont plus proches qu’une distance maximale donnée.
max_distance = 320
proximal_neighbor_mesh = cle.draw_mesh_between_proximal_labels(nuclei, maximum_distance=max_distance)
# nous rendons les lignes un peu plus épaisses à des fins de visualisation
proximal_neighbor_mesh = cle.maximum_box(proximal_neighbor_mesh, radius_x=5, radius_y=5)
cle.imshow(proximal_neighbor_mesh)
proximal_distance_mesh = cle.draw_distance_mesh_between_proximal_labels(nuclei, maximum_distance=max_distance)
# nous rendons les lignes un peu plus épaisses à des fins de visualisation
proximal_distance_mesh = cle.maximum_box(proximal_distance_mesh, radius_x=5, radius_y=5)
cle.imshow(proximal_distance_mesh)
Maillages de distance en détail#
Pour dessiner un maillage de distance, nous devons combiner une matrice de distance, une représentation abstraite des distances de tous les objets les uns par rapport aux autres, avec une matrice de voisinage, qui représente quelles cellules sont voisines.
Nous commençons par la matrice de distance.
centroids = cle.centroids_of_background_and_labels(nuclei)
distance_matrix = cle.generate_distance_matrix(centroids, centroids)
# nous ignorons les distances à l'objet d'arrière-plan
cle.set_column(distance_matrix, 0, 0)
cle.set_row(distance_matrix, 0, 0)
cle.imshow(distance_matrix, colorbar=True)
Ensuite, nous devrions configurer une matrice qui représente pour chaque noyau (de gauche à droite) quels sont ses n voisins les plus proches.
proximal_neighbor_matrix = cle.generate_proximal_neighbors_matrix(distance_matrix, max_distance=max_distance)
cle.imshow(proximal_neighbor_matrix)
distance_touch_matrix = distance_matrix * proximal_neighbor_matrix
cle.imshow(distance_touch_matrix, colorbar=True)
distance_mesh1 = cle.touch_matrix_to_mesh(centroids, distance_touch_matrix)
# nous rendons les lignes un peu plus épaisses à des fins de visualisation
distance_mesh1 = cle.maximum_box(distance_mesh1, radius_x=5, radius_y=5)
cle.imshow(distance_mesh1, colorbar=True)
Pour vérifier si les noyaux ci-dessus sont toujours les centroïdes du maillage, nous les mettons ensemble dans une seule image.
visualization = cle.maximum_images(nuclei > 0, distance_mesh1 > 0)
cle.imshow(visualization)