Medir la distancia a células en otra imagen de etiquetas#

En algunos proyectos de imagen de células, núcleos y otros orgánulos con múltiples marcadores, estamos interesados en medir distancias entre células con diferentes patrones de expresión. Dado un tejido donde no todas las células expresan un cierto marcador, es posible que queramos medir la distancia de cada célula a la siguiente célula que expresa ese marcador. Por lo tanto, queremos medir y visualizar esa distancia en un mapa.

import numpy as np
import pyclesperanto_prototype as cle
import pandas as pd

cle.get_device()
<gfx90c on Platform: AMD Accelerated Parallel Processing (2 refs)>

Nuestro punto de partida es una imagen de etiquetas y otra imagen de etiquetas, donde algunas de las etiquetas en la primera imagen son seleccionadas. La primera imagen de etiquetas representa todas las células. La segunda imagen de etiquetas representa las células que expresan el marcador.

label_image = cle.artificial_tissue_2d()
cle.imshow(label_image, labels=True)
../_images/2c1d06d9ddf3b0dd71c6103ed21a8e78ccfbbd371340fc908f5ef81e21973b47.png
random_vector = np.random.random((1, int(label_image.max() + 1)))
sparse_labels = cle.exclude_labels_with_values_out_of_range(random_vector, label_image, minimum_value_range=0, maximum_value_range=0.3)
cle.imshow(sparse_labels, labels=True)
../_images/18bb673441a6d7fc351df9ae499ddbbbcba59732615f7ac1e8b5104a52c88bbc.png

Ahora contamos para cada etiqueta en label_image, cuántas etiquetas están próximas a ella en la imagen sparse_labels. Para medir la distancia, usamos la distancia al centroide.

distance_map = cle.average_distance_to_n_nearest_other_labels_map(label_image, sparse_labels, n=1)
cle.imshow(distance_map)
../_images/d5bd76895266a6ef7b0f17af19cb9fe2819696a0c1a05562ab36121a5cbe96cd.png

También podemos leer estos valores.

statistics = cle.statistics_of_labelled_pixels(distance_map, label_image)

table = pd.DataFrame(statistics)

# La tabla anterior contiene demasiada información.
# Por lo tanto, renombramos una columna y eliminamos la mayoría de las otras
table = table.rename(columns={"mean_intensity": "centroid_distance"})
table[['label', 'centroid_distance']]
label centroid_distance
0 1 13.957838
1 2 0.000000
2 3 15.516336
3 4 17.409723
4 5 16.673353
... ... ...
170 171 20.870539
171 172 0.000000
172 173 24.419371
173 174 0.000000
174 175 32.159912

175 rows × 2 columns