想象一下我有一个热狗的二维图像。我可以在热狗两端之间画一条直线。将此称为中线。它的属性之一是(2D)热狗围绕它具有最低惯性矩的轴。
现在,如果我将热狗弯曲成弧形,这条中线也会扭曲。
给定一张弯曲热狗的图片,我如何确定这条弯曲的中线?该算法应该容忍图像中适量的噪声。
如果我理解你的问题,你想要一条穿过你的物体的线,其中每个点都在物体的中间,也就是说,如果你从中线上的任何点开始并沿着垂直于中线的方向行走,你必须走同样的路两个方向上的距离,直到遇到对象的边界:
(这只是一个插图 - 可能不是几何上正确的中线!)
我的快速而肮脏的解决方案是从一个中轴开始(可以很容易地从一阶矩和二阶矩计算),并通过获取这条线上的每个点来细化它,并在垂直于当前方向的线上找到最近的边界点该点,并将该点移动到这两点的几何中心:
如果您对每个点都执行此操作,您应该获得更好的中线近似值。
我说这又快又脏,因为我不确定简单地重复这个过程是否总能收敛到一个稳定的解决方案。这可能取决于在存在弯曲和扭结的情况下如何计算中线的垂直方向。
解决这个问题的一种方法是使用更受物理启发的模型:
- 计算对象内部的距离变换(每个点到最近边界点的距离)
- 找到一条穿过物体的平滑线,使距离变换图像的路径积分最大化:
为了找到这条线,我将使用类似于活动轮廓/蛇的算法:
- 从中轴开始
- Apply two forces to each point:
- 一股力将线“推”向距离变换的梯度方向(即远离最近的边界)
- 另一个力抵消蛇的拉伸和弯曲,因此它保持平滑的形状,没有明显的距离变换梯度。 (谷歌搜索活动轮廓 - 这是相当标准的简历内容,你会发现很多关于它的好文章。)
- 重复直到收敛或达到某个固定的迭代限制
您需要调整一些参数来实现曲线的平滑度(与活动轮廓一样),但是获得定义良好且表现良好的近似值的机会比使用上面的简单方法要好得多。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)