Verschmelzen von Labels basierend auf Zentroid-Abständen#

In diesem Notebook werden wir Labels in einem Label-Bild basierend auf ihren Zentroid-Abständen zueinander verschmelzen. Nahe beieinander liegende Labels werden zusammengeführt.

Siehe auch

import pyclesperanto_prototype as cle
from skimage.io import imread

Zu Demonstrationszwecken verwenden wir eine modifizierte Version der Labels, die aus dem Blobs-Beispielbild abgeleitet wurden. Wir führen künstlich Lücken zwischen ihnen ein.

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

Aus diesem Bild extrahieren wir die Koordinaten der Zentroide. Aus diesen Zentroiden können wir eine Abstandsmatrix erstellen. In dieser Matrix wird der Abstand aller Zentroide zu allen anderen Zentroiden berechnet. Die Diagonale ist null, da sie dem Abstand eines Zentroids zu sich selbst entspricht. Außerdem ist der Abstand zum Hintergrund (erste Zeile und erste Spalte) ebenfalls null, da der Hintergrund bei der Abstandsberechnung nicht berücksichtigt wird.

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

Wir können diese Abstandsmatrix mit einem gegebenen maximalen Abstand schwellenwertbasiert verarbeiten. Das Ergebnis ist eine binäre Matrix.

maximum_distance = 40

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

Wenn wir Labels mit dem Hintergrund verschmelzen würden, würden alle Labels verschmolzen werden, da alle den Hintergrund berühren. Um dies zu verhindern, setzen wir die erste Zeile und Spalte auf null.

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

Mit der obigen binären Matrix können wir nun die Labels entsprechend verschmelzen.

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