Zusammenführen von Labels basierend auf Kante-zu-Kante-Abständen#

In diesem Notebook werden wir Labels in einem Labelbild basierend auf ihren Kante-zu-Kante-Abständen zueinander zusammenführen. Nahe beieinander liegende Labels werden verschmolzen.

Siehe auch

import pyclesperanto_prototype as cle
from skimage.io import imread
import numpy as np

Zu Demonstrationszwecken verwenden wir eine modifizierte Version der Labels, die aus dem Blobs-Beispielbild abgeleitet wurden. Wir fügen 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

Zunächst dilatieren wir die Labels um die Hälfte des maximalen Abstands, den die Kanten haben dürfen.

maximum_distance = 12

dilated_labels = cle.dilate_labels(labels, radius=maximum_distance/2)
dilated_labels
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min0.0
max47.0

Dann führen wir die Labels zusammen, wenn sie sich berühren.

merged_dilated_labels = cle.merge_touching_labels(dilated_labels)
merged_dilated_labels
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min0.0
max5.0

Anschließend maskieren wir die zusammengeführten Labels mit der ursprünglichen Form der Labels. Wir konvertieren das Ergebnis dieser Operation auch in 32-Bit-Integer, damit die Visualisierung als Label-Bild funktioniert.

merged_labels = (merged_dilated_labels * (labels > 0)).astype(np.uint32)
merged_labels
cle._ image
shape(254, 256)
dtypeuint32
size254.0 kB
min0.0
max5.0