Python 如何防止HoughLines多次检测某些线条

Python 如何防止HoughLines多次检测某些线条,python,opencv,hough-transform,canny-operator,houghlines,Python,Opencv,Hough Transform,Canny Operator,Houghlines,所以我正在编写这段代码,从图像中的一些图形中提取数据。这些图像都是从一本书中扫描出来的。既然我们在这里谈论的是100多张图像,我当然想自动化这个过程。我的第一步是确保所有图像都对齐。因为这本书的书页是用手扫描的,所以扫描都会稍微移动或旋转。幸运的是,图像上有一些虚线,可以用作对齐它们的参考点。然后,通过在这些虚线上切片图像,我可以将图像分成更小的子图像。这样,所有扫描图像的所有子图像都将相等 所以,第一步当然是检测这些虚线。我的策略可以分为4个步骤: 使用形态变换将虚线转换为实线 使用Cann

所以我正在编写这段代码,从图像中的一些图形中提取数据。这些图像都是从一本书中扫描出来的。既然我们在这里谈论的是100多张图像,我当然想自动化这个过程。我的第一步是确保所有图像都对齐。因为这本书的书页是用手扫描的,所以扫描都会稍微移动或旋转。幸运的是,图像上有一些虚线,可以用作对齐它们的参考点。然后,通过在这些虚线上切片图像,我可以将图像分成更小的子图像。这样,所有扫描图像的所有子图像都将相等

所以,第一步当然是检测这些虚线。我的策略可以分为4个步骤:

  • 使用形态变换将虚线转换为实线
  • 使用Canny边缘检测检测所有边缘
  • 使用HoughLines识别线
  • 在遮罩上画这些线,以便进一步使用
现在可能会出现几个问题。有时HoughLines会检测到错误的行(例如书中下一页的折叠),但这可能通过在右侧稍微裁剪图像来修复(欢迎使用更好的解决方案)。第二个(也是最大的)问题是HoughLines有时倾向于将一条线识别为多条线。我认为这与Canny边缘检测的边缘过于粗糙或模糊有关,因此HoughLines实际上可以看到多条线。是否有一种方法可以“平滑”Canny的输出,以便HoughLines精确地检测每条线一次

在这个特定图像的情况下,中间的垂直虚线没有被识别,而在书中的下一页的折叠。此外,垂直虚线被识别为多条线。(左侧源图像,检测到中间边缘,检测到右侧线条)


在脚本中,像素箱和旋转箱对于您设置的阈值来说太细:

lines = cv2.HoughLines(edges, 1, np.pi/180, 200)

因此,您可以调整阈值参数(200)以仅获得一行,或者调整rho(1)和θ(np.pi/180)参数,或者调整所有这些参数。您可以从图像中选择一组仅包含一条水平线或垂直线的图像。然后进行网格搜索,以查找仅检测测试图像集中一条线的参数。

这些参数通常是由于沿对角线走楼梯造成的。我唯一的建议是尝试更粗的角度分辨率和/或你自己过滤和合并接近平行的线条。或者尝试其他两种有更多选项的Hough线变换方法之一。基于fireant的答案:您可以使用轨迹栏轻松地对值进行实验。您可以通过检查
轮廓区域
来处理小轮廓,并丢弃低于阈值的轮廓。在这两种方法中都使用了。哪些常用值可用作这些参数?我一直在网上找。但是1和pi/180看起来非常标准,所以我找不到太多关于它们的内容。@FrederikVanclooster很可能教程使用这些值来确保检测到大多数或所有行,即使这意味着多次检测同一行。这些参数没有典型的值,这就是为什么opencv首先将它们公开为没有默认值的参数。这意味着用户应该了解算法的工作原理,并决定如何为他们的应用程序找到好的值。因此,我可以选择多高或多低是没有界限的?如果你了解该方法的工作原理,你就会知道这些值的合理范围,我只需要花时间在这里解释。
lines = cv2.HoughLines(edges, 1, np.pi/180, 200)