使用Voronoi图查找多边形的中线

时间:2018-11-22 18:32:59

标签: python polygon computational-geometry curve-fitting voronoi

我正在使用here中概述的基于Voronoi图的方法来查找根图像的二进制掩码的中线。我或多或少完全按照描述使用了Python代码:

import skimage.morphology as morphology

WHITE = 255

image_bool = binary_mask == WHITE
d = morphology.disk(2)
img = morphology.binary_closing(image_bool, selem=d)
skeleton = morphology.medial_axis(img)

然后是图形:如用户Gabriel的iPython笔记本中所述,我将骨架化的图像输入到buildTree中: https://github.com/gabyx/WormAnalysis/blob/master/SkeletonTest/Skeletonize.ipynb

通常,这会产生很好的结果。但是,该方法有时会以两种不同的方式失败:

1)图并不总是延伸根的全长:

enter image description here

Midline that does not extend fully

2)图形有时会“过早地”连接到沿根轮廓的点,这似乎是最长的路径,但显然不符合我所说的“中线”。各种各样的多边形会发生这种情况:

rod-like polygon with graph

rod-like polygon with midline

circle-like polygon with graph

circle-like polygon with midline

rod-like polygon with midline with graph

polygon with sharp vertices with midline

最后一个案例是一个人造面具-我的实际根部都没有完美的笔尖-但我认为它很好地表示了问题。

对Voronoi图有更深入的了解的人在保持这种通用方法的同时,也有解决这些问题的任何技巧。

谢谢!

1 个答案:

答案 0 :(得分:1)

这两个问题都是Voronoi方法的中轴“特征”。

中间轴上的点具有距两个或多个边界相等距离的属性。那是因为中间轴点是Voronoi点,或者是双重Delaunay三角剖分中心。这意味着有一个圆心,该圆心在整个边界内,穿过三个边界点。至少当边界离散化变为无穷大时会是这种情况。由于边界没有无限多个点,因此这种方法是您观察到的问题的近似值。

1)圆弧的中轴是一个点。这个结果很好。如果形状以非常干净的圆弧结束,则中间轴“停止”在圆弧零件的中间轴上的点。通过比较Skeletonize page上的不同方法可以看出这一点。

2)两条线的中轴穿过等分线。这意味着,如果边界上有更多的“角”,则将有更多的轴“指”进入这些角。像正方形的中间轴是X形。如果您使用的是WormAnalysis方法(您已提到),则仅提取轴上的最长路径。这对蠕虫很有用,但通常情况下不行。在一般情况下,最好通过除去覆盖边界的一小部分的零件来清洁轴。就像您在主题2的第一张图片中一样,轴部分向上移动。那部分是边界左上角小角的中间轴。边界上该角的左侧是具有较小中间轴的弧形部分。由于采用了最长的路径,因此取了覆盖边界的一小部分的“手指”,而省略了覆盖边界的一大部分的中轴的一小部分。