Fusion d’étiquettes selon les distances des centroïdes#

Dans ce notebook, nous allons fusionner les étiquettes dans une image d’étiquettes selon les distances de leurs centroïdes les uns par rapport aux autres. Les étiquettes proches seront fusionnées.

Voir aussi

import pyclesperanto_prototype as cle
from skimage.io import imread

À des fins de démonstration, nous utilisons une version modifiée des étiquettes dérivées de l’image d’exemple des blobs. Nous introduisons artificiellement des espaces entre elles.

image = imread("../../data/blobs.tif")
image[:, 80:150] = 0
image[80:130, 100:] = 0

image = cle.asarray(image)
labels = cle.voronoi_otsu_labeling(image, spot_sigma=4, outline_sigma=3)
labels
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min0.0
max47.0

À partir de cette image, nous extrayons les coordonnées des centroïdes. À partir de ces centroïdes, nous pouvons construire une matrice de distances. Dans cette matrice, la distance de tous les centroïdes à tous les autres centroïdes est calculée. La diagonale est nulle car elle correspond à la distance d’un centroïde à lui-même. De plus, la distance à l’arrière-plan (première ligne et première colonne) est également nulle, car l’arrière-plan n’est pas pris en compte pour le calcul des distances.

centroids = cle.centroids_of_labels(labels)

distance_matrix = cle.generate_distance_matrix(centroids, centroids)
distance_matrix
cle._ image
shape(48, 48)
dtypefloat32
size9.0 kB
min0.0
max324.1848

Nous pouvons seuiller cette matrice de distances avec une distance maximale donnée. Le résultat est une matrice binaire.

maximum_distance = 40

merge_matrix = distance_matrix <= maximum_distance
merge_matrix
cle._ image
shape(48, 48)
dtypeuint8
size2.2 kB
min0.0
max1.0

Si nous fusionnions les étiquettes avec l’arrière-plan, toutes les étiquettes seraient fusionnées car toutes touchent l’arrière-plan. Pour éviter cela, nous mettons la première ligne et la première colonne à zéro.

cle.set_column(merge_matrix, 0, 0)
cle.set_row(merge_matrix, 0, 0)

merge_matrix
cle._ image
shape(48, 48)
dtypeuint8
size2.2 kB
min0.0
max1.0

En utilisant la matrice binaire ci-dessus, nous pouvons maintenant fusionner les étiquettes en conséquence.

merged_labels = cle.merge_labels_according_to_touch_matrix(labels, merge_matrix)
merged_labels
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min0.0
max4.0