导航

霍夫直线检测进行复杂环境的树干提取

Posted on 2016-07-22 18:50  Joekk  阅读(1263)  评论(0编辑  收藏  举报

                                                        霍夫直线检测进行复杂环境的树干提取

霍夫直线检测是常用的直线检测算法,原理比较简单。

我叙述一下我对霍夫直线检测算法的理解:将像素点在图像中的二维坐标,通过坐标变换转化为极坐标,然后通过比较每个点在极坐标下的角度值,如果角度值相同,则判定为同直线。

该算法有几个可调参数:

C++: void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0 )

  • 第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中。
  • 第六个参数,double类型的minLineLength,有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。
  • 第七个参数,double类型的maxLineGap,有默认值0,允许将同一行点与点之间连接起来的最大的距离。

要想将这个算法使出威力,需要对这几个直线检测算法有足够的了解。本人由于水平有限,搞起来感觉比较失败。

我的代码参考自毛星云的博客,连接如下:

http://blog.csdn.net/poem_qianmo/article/details/26977557

先贴出树干提取前的原图:

图中白色的就是需要提取的树干。很明显,树干非常不清晰,环境干扰量大,十分不好直接分离。

我再贴处理后的最终效果图(由于本人很菜,误检率比较高,漏检率也比较高)

要完成这个直线检测的步骤大概如下(包括图片预处理):

1.RGB转灰度图,这一步一般来说没什么要注意的,提醒一下。如果目标在某一个通道(R、G、B)和环境相差很大,最好保留这个通道作为灰度图。本例中由于树干为白色,就不用考虑这个

2.选择合适阈值进行二值化,(域值的参数选择很重要,必须能去除大部分干扰)。

3.删除小面积连通域。去除一些不可能是树干的小干扰。

4.树干骨架提取,便于直线检测。

5.霍夫直线检测。

由于霍夫直线检测需要调整的参数太多,可以将参数设为不同的滑动条,通过滑动滑动条来寻找合适参数。