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

现在,如果我将热狗弯成弧形,则此中线也会变形。

给定弯曲的热狗的图片,我如何确定该弯曲的中线?该算法应容忍图像中适度的噪声。

最佳答案

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

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

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

如果对每个点都执行此操作,则应该获得更好的中线近似值。

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

解决此问题的一种方法是使用更具 body 启发性的模型:

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


  • 为了找到这条线,我将使用与事件轮廓/蛇相似的算法:
  • 从中轴开始
  • 对每个点施加两个力:
  • 一个力沿距离变换的梯度方向(即远离最近的边界)“插入”直线
  • 另一个力抵消了蛇的拉伸(stretch)和弯曲,因此在没有清晰的距离变换渐变的情况下,它保持了平滑的形状。 (Google提供了主动轮廓-这是相当标准的简历,您会发现很多关于它的不错的文章。)
  • 重复直到收敛或达到某个固定的迭代限制为止

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

    关于language-agnostic - 确定弯曲的细长区域的中线,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4555682/

    10-12 02:09