Dibujar mallas de distancia entre vecinos#
Al estudiar las relaciones de vecindad entre células, por ejemplo, para determinar si las células pueden comunicarse entre sí, sus distancias entre sí son relevantes. Podemos visualizar estas utilizando mallas de distancia.
import pyclesperanto_prototype as cle
from numpy import random
from skimage.io import imread
Estamos utilizando un conjunto de datos publicado por Heriche et al. bajo licencia CC BY 4.0 disponible en el 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)
Por ejemplo, se puede dibujar una malla entre vecinos próximos, núcleos que están más cerca que una distancia máxima dada.
max_distance = 320
proximal_neighbor_mesh = cle.draw_mesh_between_proximal_labels(nuclei, maximum_distance=max_distance)
# hacemos las líneas un poco más gruesas para propósitos de visualización
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)
# hacemos las líneas un poco más gruesas para propósitos de visualización
proximal_distance_mesh = cle.maximum_box(proximal_distance_mesh, radius_x=5, radius_y=5)
cle.imshow(proximal_distance_mesh)
Mallas de distancia en más detalle#
Para dibujar una malla de distancia, necesitamos combinar una matriz de distancia, una representación abstracta de las distancias de todos los objetos entre sí, con una matriz de vecindad, que representa qué células son vecinas.
Comenzamos con la matriz de distancia.
centroids = cle.centroids_of_background_and_labels(nuclei)
distance_matrix = cle.generate_distance_matrix(centroids, centroids)
# ignoramos las distancias al objeto de fondo
cle.set_column(distance_matrix, 0, 0)
cle.set_row(distance_matrix, 0, 0)
cle.imshow(distance_matrix, colorbar=True)
A continuación, debemos configurar una matriz que represente para cada núcleo (de izquierda a derecha) cuáles son sus n vecinos más cercanos.
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)
# hacemos las líneas un poco más gruesas para propósitos de visualización
distance_mesh1 = cle.maximum_box(distance_mesh1, radius_x=5, radius_y=5)
cle.imshow(distance_mesh1, colorbar=True)
Para verificar si los núcleos de arriba siguen siendo los centroides de la malla, los ponemos juntos en una imagen.
visualization = cle.maximum_images(nuclei > 0, distance_mesh1 > 0)
cle.imshow(visualization)