确定弯曲细长区域的中线

Mar*_*arc 8 language-agnostic geometry image-processing

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

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

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

Nik*_*iki 5

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

热狗与中线

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

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

热狗迭代0

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

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

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

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

距离变换

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

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

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