Compter les voisins en contact#
Dans ce notebook, nous visualisons quelles cellules dans un tissu sont voisines en dessinant un maillage. De plus, nous pouvons modifier l’intensité du maillage pour qu’elle corresponde à la distance entre les centroïdes des cellules.
import pyclesperanto_prototype as cle
import numpy as np
import pandas as pd
Données de test#
Générons une structure de type tissulaire composée de cellules qui ont généralement environ 6 voisins.
cells = cle.artificial_tissue_2d(
delta_x=48,
delta_y=32,
random_sigma_x=7,
random_sigma_y=7,
width=250,
height=250)
cle.imshow(cells, labels=True)
Maillage entre cellules voisines#
Avant de compter les voisins, nous devrions visualiser les relations de voisinage. Nous pouvons le faire en dessinant un maillage entre les centroïdes des cellules voisines en contact.
mesh = cle.draw_mesh_between_touching_labels(cells)
cle.imshow(mesh)
Nous pouvons également combiner les deux visualisations en une seule image. Notez que ces images ne doivent pas être utilisées pour une analyse quantitative ultérieure. Elles servent uniquement à des fins de visualisation.
Connexions des centroïdes et bordures cellulaires#
Une façon courante de visualiser les tissus dans ce contexte est de dessiner les bordures cellulaires et le maillage des centroïdes dans différentes couleurs.
visualization = mesh * 2 + cle.detect_label_edges(cells)
cle.imshow(visualization, color_map='jet')
Analyser et visualiser le nombre de voisins en contact#
Nous pouvons également compter les voisins en contact et visualiser le résultat sous forme d’image paramétrique en couleurs.
neighbor_count_image = cle.touching_neighbor_count_map(cells)
cle.imshow(neighbor_count_image, color_map='jet', colorbar=True, min_display_intensity=0)
Notez que les nombres le long de la bordure de l’image peuvent ne pas être précis. Par conséquent, nous devrions exclure les cellules correspondantes de l’analyse ultérieure.
cells_ex_border = cle.exclude_labels_on_edges(cells)
cle.imshow(cells_ex_border, labels=True)
Après avoir corrigé l’image étiquetée, nous pouvons également corriger l’image paramétrique.
neighbor_count_image_ex_border = neighbor_count_image * (cells_ex_border != 0)
cle.imshow(neighbor_count_image_ex_border, color_map='jet', colorbar=True, min_display_intensity=0)
Maintenant, nous pouvons mesurer le nombre de voisins. Nous pouvons soit simplement lire ces nombres et les mettre dans une liste …
cle.read_intensities_from_map(cells_ex_border, neighbor_count_image_ex_border)
cl.Array([[0., 5., 6., 7., 6., 6., 7., 6., 6., 5., 5., 6., 6., 7., 6., 6.,
6., 6., 6., 6., 6.]], dtype=float32)
… nous pouvons également lire ces valeurs avec toutes les autres statistiques et les mettre dans un DataFrame pandas.
statistics = cle.statistics_of_labelled_pixels(neighbor_count_image_ex_border, cells_ex_border)
table = pd.DataFrame(statistics)
# renommer une colonne
table = table.rename(columns={"mean_intensity": "number_of_neighbors"})
# ne filtrer qu'un sous-ensemble de toutes les colonnes ; seulement ce qui nous intéresse
table = table[["label", "number_of_neighbors", "centroid_x", "centroid_y"]]
table
| label | number_of_neighbors | centroid_x | centroid_y | |
|---|---|---|---|---|
| 0 | 1 | 5.0 | 74.592697 | 23.731028 |
| 1 | 2 | 6.0 | 173.741379 | 35.582230 |
| 2 | 3 | 7.0 | 49.460915 | 51.928082 |
| 3 | 4 | 6.0 | 91.783768 | 52.666199 |
| 4 | 5 | 6.0 | 142.728210 | 62.962471 |
| 5 | 6 | 7.0 | 189.973206 | 68.526794 |
| 6 | 7 | 6.0 | 73.699181 | 88.797356 |
| 7 | 8 | 6.0 | 115.321083 | 90.665649 |
| 8 | 9 | 5.0 | 163.097733 | 99.824242 |
| 9 | 10 | 5.0 | 58.206852 | 122.341309 |
| 10 | 11 | 6.0 | 98.847565 | 134.280228 |
| 11 | 12 | 6.0 | 147.731705 | 127.326218 |
| 12 | 13 | 7.0 | 200.522903 | 112.817368 |
| 13 | 14 | 6.0 | 67.880905 | 162.991592 |
| 14 | 15 | 6.0 | 122.943306 | 157.515717 |
| 15 | 16 | 6.0 | 171.010025 | 153.333328 |
| 16 | 17 | 6.0 | 43.426266 | 189.492981 |
| 17 | 18 | 6.0 | 96.272728 | 192.326477 |
| 18 | 19 | 6.0 | 140.815964 | 194.446030 |
| 19 | 20 | 6.0 | 193.817596 | 193.019318 |
Exercice#
Analysez un champ de vision plus large avec plus de cellules et faites varier les paramètres random_sigma_x et random_sigma_y de la fonction artificial_tissue_2d. Utilisez une carte de comptage des voisins en contact pour compter le nombre de voisins en contact avant et après l’application d’un filtre médian à la carte.