【问题标题】:fitting lines in an image拟合图像中的线条
【发布时间】:2016-04-30 17:23:50
【问题描述】:

我正在尝试实现边缘绘制算法。我获得了图像的线条,下一步是用给定的阈值拟合线条,我的问题是给定 1 和 0 的矩阵,(线条的一部分)穿过所有像素并开始拟合线条。 想法是通过最小二乘线拟合方法生成最小长度的初始线段,然后通过添加更多像素来扩展该线段。在检测到最小长度的初始线段之后,我们应该遍历链的剩余像素并计算每个像素到当前拟合线的距离。只要像素在当前行的一定距离内,就会将像素添加到当前行。我们继续向当前线段添加像素 直到我们转弯并且线的方向发生变化。此时,我们输出当前的线段。然后对链的剩余像素进行递归处理以提取更多线段。

我的问题是我不知道如何开始遍历像素...如果有特定的方向我应该首先采取...

【问题讨论】:

  • 通过标记 C++ 和 Matlab,您的意思是它们中的任何一个的解决方案都是可以接受的?没有像 OpenCV 这样的 CV 库的 C++ 将变得如此困难和多余
  • 您未能提供足够的上下文。你所说的大部分内容都是毫无意义的,没有任何进一步的解释。

标签: c++ matlab image-processing


【解决方案1】:

我同意缺陷。如果没有更多信息,如输入图像和想要的结果示例,很难回答。我猜您的某些对象的轮廓不完整,并且想要回归/推断 2D 空间中的间隙。在这种情况下,我会:

  1. 获取可见轮廓线

    你已经有了这个。

  2. 按方向角度对线条进行排序

    如果 line(i) 端点是A(i),B(i) 那么:

    ang(i)=atan2(B(i).y-A(i).y,B(i).x-A(i).x)
    
  3. 合并行

    合并所有行:

    • 相似角度
    • 不会太远
    • 垂直距离很小(好像是平行的)
    • 合并的线不与任何其他线相交
  4. 缩小差距

    合并后只需找到所有轮廓边缘点。这些点只连接到一条线。现在您可以应用您在 OP 中提出的推断,但我会尝试用简单的线将最近的这些点相互连接(如果连接不跨越任何线)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    相关资源
    最近更新 更多