Fusión de etiquetas según las distancias entre centroides#

En este notebook fusionaremos etiquetas en una imagen etiquetada según las distancias entre sus centroides. Las etiquetas cercanas se fusionarán.

Ver también

import pyclesperanto_prototype as cle
from skimage.io import imread

Con fines de demostración, usamos una versión modificada de las etiquetas derivadas de la imagen de ejemplo de blobs. Introducimos artificialmente espacios entre ellas.

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

De esta imagen, extraemos las coordenadas de los centroides. A partir de estos centroides, podemos construir una matriz de distancias. En esta matriz, se calcula la distancia de todos los centroides a todos los demás centroides. La diagonal es cero, ya que corresponde a la distancia de un centroide a sí mismo. Además, la distancia al fondo (primera fila y primera columna) también es cero, ya que el fondo no se considera para el cálculo de distancias.

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

Podemos aplicar un umbral a esta matriz de distancias con una distancia máxima dada. El resultado es una matriz binaria.

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 fusionáramos etiquetas con el fondo, todas las etiquetas se fusionarían porque todas tocan el fondo. Para evitar esto, establecemos la primera fila y columna en cero.

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

Usando la matriz binaria anterior, ahora podemos fusionar las etiquetas en consecuencia.

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