【问题标题】:Detecting straight lines in an image检测图像中的直线
【发布时间】:2016-09-08 16:54:06
【问题描述】:

我正在尝试提取由水平直线分隔的图像的一部分。该图像是一个文本文档,其中大部分与我的目的无关。文档的标题部分通常是我需要的全部内容,由两条水平直线分隔(线条样式与一条线或一条双线稍有不同,一条比另一条粗),一条位于顶部和底部标题部分。标题部分的长度是可变的,因此我无法设置固定位置。

如何提取这部分图像?我已经研究了一些东西,比如使用 Hough 变换和 OpenCV 或 Accord.net 等库,但对于如此简单的事情来说,所有这些似乎都是多余的。如果可能的话,我宁愿不必使用额外的库。

理想情况下,我想输入一个图像,它会给出它检测到的每条水平直线的位置,然后我用它来设置裁剪图像的边界。谁能指出我正确的方向?

【问题讨论】:

  • 在 SO 上提问“对于如此简单的事情似乎有点矫枉过正”:) 只有当你能保证线条是严格水平和垂直的(而不是你可以只计算每行或列来找到它们),否则就很简单了。
  • 你知道线条的宽度是多少像素吗?这条线是水平的,所以当我说宽度时,我的意思是高度 XD

标签: c# .net


【解决方案1】:

这通常使用霍夫变换来完成。

很难在单个答案帖子中解释它是如何工作的,并且可能超出了您的问题范围,但是在 OpenCV 和 AForge 等许多视觉库中可以找到霍夫变换的有效实现 (there is also a .NET version of aforge called AForge.NET)

霍夫变换将输出检测到的线,并允许您按角度过滤它们。 这应该可以很容易地过滤掉不是水平线的所有内容。

下图是使用 Hough 变换检测到的线条示例,并将其转换回正常图像。 (覆盖为红线)

【讨论】:

    【解决方案2】:

    如果你知道线条有多粗,你可以穿过图像中每一行的前 10 个像素,所以x < 10 and y < imageheight

    使用bool 检查值逐行运行,您将每个像素行设置为true,如果您找到不是该行颜色的像素,则设置为false

    如果检查该行的布尔值是否为假,则计数设置为 0,如果为真则递增。

    如果您找到count > linethickness 并使用y 的位置来了解该行的位置,则可以中断循环。

    【讨论】:

      猜你喜欢
      • 2020-03-07
      • 2015-09-05
      • 2020-09-27
      • 2021-09-08
      • 2010-10-15
      • 2020-04-23
      • 2020-09-05
      • 2012-11-25
      • 1970-01-01
      相关资源
      最近更新 更多