Mesure des distances entre les objets#

Ce notebook démontre comment mesurer la distance des objets dans une image par rapport à l’objet le plus proche dans une autre image. Un cas d’utilisation de ceci est la mesure de la distance d’objets tels que des cellules à un vaisseau. La procédure suivante est démontrée en 2D et devrait fonctionner de manière analogue en 3D.

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

Comme données d’exemple, nous utilisons deux images synthétiques : une image binaire montrant où se trouve un vaisseau sous forme de bande, et une image d’étiquettes montrant où se trouvent les cellules / objets.

vessel = np.asarray([
    [0, 0, 0, 1, 1, 1, 0, 0, 0, 0],
    [0, 0, 0, 1, 1, 1, 0, 0, 0, 0],
    [0, 0, 0, 1, 1, 1, 0, 0, 0, 0],
    [0, 0, 1, 1, 1, 0, 0, 0, 0, 0],
    [0, 0, 1, 1, 1, 0, 0, 0, 0, 0],
    [0, 0, 1, 1, 1, 0, 0, 0, 0, 0],
    [0, 0, 1, 1, 1, 0, 0, 0, 0, 0],
])

objects = np.asarray([
    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
    [1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
    [1, 1, 0, 0, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0, 0, 0, 5, 5],
    [0, 0, 0, 0, 2, 0, 0, 0, 5, 5],
    [0, 4, 4, 0, 0, 0, 3, 0, 0, 0],
    [0, 4, 4, 0, 0, 0, 3, 0, 0, 0],
])

cle.imshow(vessel, continue_drawing=True)
cle.imshow(objects, labels=True, alpha=0.7)
../_images/c0cfac3fba21d7ff47458094e99b430ffa3b333ddcee645acd6d76186ea4351f.png

Cartes de distance#

Pour mesurer la distance moyenne des pixels étiquetés à un autre objet, une stratégie implique l’utilisation de cartes de distance. Ici, nous utilisons la carte de distance de Maurer signée implémentée dans SimpleITK. Plus précisément, nous utilisons le plugin napari scriptable napari-simpleitk-image-processing pour accéder à cette carte. Si les valeurs sont positives, nous sommes à l’extérieur du vaisseau. Les valeurs négatives suggèrent que nous sommes à l’intérieur.

not_vessel = cle.binary_not(vessel)

distance_from_vessel = nsitk.signed_maurer_distance_map(not_vessel)

cle.imshow(distance_from_vessel, colorbar=True, colormap="jet")
../_images/b33a02ff5f61b3265a39cf451fe935a438924951fedef22a3b7937b9937f9b4c.png

Carte de distance des objets#

Ensuite, nous mesurons l’intensité moyenne dans la carte de distance où se trouvent les objets. Ces intensités représentent la distance moyenne de ces objets au vaisseau. L’intensité de fond dans ces cartes (distance dans notre cas) est 0, par définition.

mean_distance_map = cle.mean_intensity_map(distance_from_vessel, objects)

cle.imshow(mean_distance_map, colorbar=True, colormap="jet")
../_images/4cd86f25e183c16a9c5e450cb190f8c3223d6fac0d3f5b10c45adc6da1db78fa.png

Alternativement à cette visualisation, nous pouvons également lire la distance moyenne en utilisant des statistiques de pixels et les imprimer en utilisant un DataFrame pandas.

statistics = cle.statistics_of_labelled_pixels(distance_from_vessel, objects)

table = pd.DataFrame(statistics)
table = table[['label', 'mean_intensity']]
table = table.rename(columns={'mean_intensity':'mean_distance'})

table
label mean_distance
0 1 0.853553
1 2 -1.000000
2 3 1.000000
3 4 -0.500000
4 5 2.599586

Filtrage des objets#

Vous pouvez également filtrer les objets en fonction de leur distance par rapport au vaisseau.

min_distance = -4
max_distance = 2
objects_close_by_vessel = cle.exclude_labels_with_map_values_out_of_range(
    mean_distance_map,
    objects,
    minimum_value_range=min_distance,
    maximum_value_range=max_distance
)

cle.imshow(vessel, continue_drawing=True)
cle.imshow(objects_close_by_vessel, labels=True, alpha=0.7)
../_images/481caaa883d7a0eac25e7064502fb105f8038b6111cca43c16ac31ba1388bb17.png