确定弯曲细长区域的中线

时间:2010-12-29 16:05:59

标签: language-agnostic image-processing geometry

想象一下,我有一个热狗的二维图像。我可以在两端的热狗上划一条直线。称之为中线。它的一个特性是它是(2D)热狗具有最低惯性矩的轴。

现在,如果我将热狗弯成弧形,这条中线也会扭曲。

鉴于弯曲的热狗的照片,我如何确定这个弯曲的中线?该算法应该容忍图像中适量的噪声。

4 个答案:

答案 0 :(得分:5)

如果我理解你的问题,你需要穿过你的物体的一条线,其中每个点都在物体的中间,即如果你从中线的任何一点开始并沿垂直于中线的方向行走,你必须在两个方向上走相同的距离,直到你遇到物体的边界:

Hotdog with midline

(这只是一个例子 - 可能不是几何正确的中线!)

我的快速和肮脏的解决方案是从中间轴开始(可以很容易地从一阶和二阶矩计算)并通过获取该线上的每个点并在垂直线上找到最近的边界点来细化它。到那个点的当前方向,并将点移动到这两个点的几何中心:

Hotdog iteration 0

如果你对每个点都这样做,你应该得到一个更好的近似中线。

我说这是快速和肮脏的,因为我不确定是否只是重复这个过程总是收敛到一个稳定的解决方案。这可能取决于在弯曲和扭结的情况下如何计算中线的垂直方向。

解决这个问题的一种方法是使用更具物理风格的模型:

  • 计算物体内部的距离变换(每个点到最近边界点的距离)
  • 在最大化距离变换图像的路径积分的对象中找到一条平滑线:

Distance transform

要找到这一行,我会使用类似于活动轮廓/蛇的算法:

  • 从中轴开始
  • 对每个点施加两个力:
    • 一条力量沿着距离变换的梯度方向“推”线(即远离最近的边界)
    • 另一种力量对抗蛇的拉伸和弯曲,因此在没有清晰距离变换梯度的情况下保持平滑的形状。 (谷歌的活跃轮廓 - 这是相当标准的简历,你会发现很多关于它的好文章。)
  • 重复直到收敛或达到某个固定的迭代限制

您需要为曲线的这些平滑度调整一些参数(与活动轮廓一样),但是您获得定义明确且表现良好的近似值的机会远远优于上述简单方法。

答案 1 :(得分:3)

答案 2 :(得分:2)

如果镂空方法不起作用,你可能会看到一个更难的问题 - 这会带来一些问题:你的形状有多受限制?它们总是凸出来的吗?根据答案,您可以考虑参数化形状。

对于初学者,我会考虑计算一个凸壳(谷歌QHull),然后确定形状的Delaunay三角剖分。从那里,我相信你可以计算一个Voronoi图并实现你需要的中线。注意:这是一项很多工作 - 考虑到这种程度的努力,看看是否可以调整一个简单的骨架化就足够了。

答案 3 :(得分:0)

您可能正在寻找Voronoi图表,它将为您提供与“热狗”形状边缘等距的所有点 - 例如中间的路径/脊柱/脊/中线。

这是一张有助于形象化的图片:http://vision.ai.uiuc.edu/~sintod/images/research/VoronoiDiag.png

将此图像映射到您的示例,重蓝色轮廓是您的“热狗”形状,内部的细蓝色脊柱/中线由Voronoi图表给出。中线脊上的点与厚重的蓝色边缘相等。