根据质心距离合并标签#

在这个笔记本中,我们将根据标签之间的质心距离来合并标签图像中的标签。相互靠近的标签将被合并。

另请参阅

import pyclesperanto_prototype as cle
from skimage.io import imread

为了演示目的,我们使用了从斑点示例图像派生的标签的修改版本。我们人为地在它们之间引入了间隙。

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

从这个图像中,我们提取质心的坐标。从这些质心,我们可以构建一个距离矩阵。在这个矩阵中,计算了所有质心到所有其他质心的距离。对角线为零,因为它对应于一个质心到自身的距离。此外,到背景的距离(第一行和第一列)也为零,因为在距离计算中不考虑背景。

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

我们可以用给定的最大距离对这个距离矩阵进行阈值处理。结果是一个二元矩阵。

maximum_distance = 40

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

如果我们将标签与背景合并,所有标签都会被合并,因为它们都接触背景。为了防止这种情况,我们将第一行和第一列设置为零。

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

使用上面的二元矩阵,我们现在可以相应地合并标签。

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