Hough变换未检测到突出的线条

时间:2011-06-30 05:58:36

标签: visual-c++ image-processing opencv computer-vision

在图像上运行Canny边缘检测器后,我得到清晰的线条。但是当在Canny edgemap图像上运行时,Hough线功能似乎在相当突出的线上丢失了。  我只保留垂直和水平的Hough线(公差为15度)。很多额外的线条出现了,但是没有拾取明确可见的矩形边界线。

以下是片段:

cvCanny( img, canny, 0, 100, 3 );
lines = cvHoughLines2( canny, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI/180, 35, 20, 10 );

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

你能否解释一下Hough线功能的变化,这将有助于我获得与Canny边缘图像中清晰可见线相对应的线条?

hough

3 个答案:

答案 0 :(得分:11)


已添加:预处理步骤,由shernshiou建议。

预处理步骤:

  1. 对图像进行阈值处理,
  2. 使用connected-component
  3. 从连接组件结果中,检测并移除小对象 - 每个框下方和中间的四位数组。
  4. (备注。阈值处理步骤只是连接组件所需的预处理步骤。)


    如果你想只检测完美的水平和垂直线,我的建议是在Hough变换之前执行水平和垂直边缘增强(通过卷积)。

    这将使真实线条更容易在Hough投影中“达到峰值”,并增加OpenCV线拾取线的可能性。

    步骤如下:

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

答案 1 :(得分:7)

你确实读过the documentation吗?

我有几个选择:

  1. 您错过的线条(最值得注意的是图像中最右侧框中最左侧的垂直线条)相当短。尝试降低阈值(cvHoughLines2的第5个输入变量)。此阈值只是必须位于该行上的像素数。从图像中我猜测你错过的线上确实有不到35个像素。
  2. 第6个输入变量表示最小行长度。我假设这是以像素为单位,所以使用第5个参数,你需要35行像素,但你搜索20像素或更长的行。您设置此变量的方式不起作用。降低第5个变量,如果你发现许多无用的短线,请提高这个变量。
  3. 降低第7个参数以禁止线条中存在较大间隙。这将消除一些斜线。
  4. 简而言之,请使用参数5,6和7的不同值再次尝试。

    我会尝试参数5和7的较低值,以及6的相似或略高的值。由于2以上5应始终小于或等于6才能产生效果。如果5较低,则7应至少等于5和6之间的差值。

答案 2 :(得分:1)

通常人们不会直接使用霍夫线。通常的做法包括预处理图像(例如,改变亮度,改变颜色,锐化图像......)。