霍夫直线检测进行复杂环境的树干提取
霍夫直线检测是常用的直线检测算法,原理比较简单。
我叙述一下我对霍夫直线检测算法的理解:将像素点在图像中的二维坐标,通过坐标变换转化为极坐标,然后通过比较每个点在极坐标下的角度值,如果角度值相同,则判定为同直线。
该算法有几个可调参数:
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.霍夫直线检测。
由于霍夫直线检测需要调整的参数太多,可以将参数设为不同的滑动条,通过滑动滑动条来寻找合适参数。