霍夫变换未能检测到突出线条

7
在一张图片上运行Canny边缘检测器后,我得到了清晰的线条。但是当在Canny边缘图像上运行Hough线函数时,似乎会漏掉相当明显的线条。 我只保留垂直和水平的Hough线(容差为15度)。出现了许多额外的线条,但是明显可见的用于界定矩形的线条没有被捕捉到。
以下是代码片段:
cvCanny( img, canny, 0, 100, 3 );
lines = cvHoughLines2( canny, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 35, 20, 10 );

主要目的是检测表示链表节点的矩形框。然而,squares.c示例程序只会检测完美的矩形,而不会检测箭头是否触及矩形边界。

您能否解释一下对Hough线函数进行哪种更改可以帮助我获得与Canny边缘图中清晰可见的线相对应的Hough线?

hough


4
本周已经是第5次了:图像处理函数的关键在于使用正确的参数。尝试调整传递给cvHoughLines2()的参数,直到找到满足需求的参数组合。 - karlphillip
3个回答

13

(添加: 一个预处理步骤,由shernshiou建议。)

预处理步骤:

  1. 对图像进行阈值处理,
  2. 使用连通组件,
  3. 从连通组件结果中检测并删除小物体-即每个框下方和中间的四位数字集合。

(注:阈值处理是仅为了满足连通组件而进行的预处理步骤。)


如果您想要检测仅完全水平和垂直的线条,我的建议是在Hough变换之前进行水平和垂直边缘增强(通过卷积)。

这将使真实的线条更有可能在Hough-projection中“高峰”,并增加OpenCV捕获线条的机会。

具体步骤如下:

  1. 从输入图像中计算Canny边缘图像
  2. 在Canny边缘图像上应用水平Sobel过滤器
  3. 在经过水平增强的边缘图像上应用Hough线条检测。
  4. 在Canny边缘图像上应用垂直Sobel过滤器。(注:使用步骤1的结果,而不是步骤2的结果)
  5. 在经过垂直增强的边缘图像上应用Hough线条检测。
  6. 组合水平和垂直线并呈现结果。

7

你读过文档了吗?

这里有几个选项:

  1. 你错过的线(特别是图像最右边盒子上最左边的垂直线)相当短。尝试降低阈值(cvHoughLines2的第五个输入变量)。该阈值是在线上必须存在的像素数。从图片上看,我猜确实有35个像素以下的线你错过了。
  2. 第六个输入变量表示最小线长。我假设这是以像素为单位的,所以第五个参数要求在线上有35个像素,但你却只寻找长度为20像素或更长的线段,因此你设置的方式是无效的。降低第5个变量,如果找到太多无用的短线,则将其提高。
  3. 降低第7个参数的值,以不允许线段中出现大的空隙。这会消除一些倾斜的线段。

简而言之,请尝试使用不同的参数5、6和7再次进行操作。

我建议你尝试较低的参数5和7值,并使用类似或略高于参数6的值。由于2中提到的原因,5始终应该小于或等于6才能发挥作用。如果5更低,则7至少应该等于5和6之间的差异。


1

通常人们不会直接从盒子里使用霍夫线。正常的做法是对图像进行预处理(例如改变亮度、改变颜色、锐化图像...)。


谢谢,您提醒了我可以添加两个步骤来改进这个想法:对图像进行阈值处理,然后使用连通组件检测小字母(数字)并在执行Hough之前将其删除,从而减少噪音。 - rwong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接