ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CV学习笔记(十六):直线检测

2021-02-04 12:57:24  阅读:337  来源: 互联网

标签:直线 函数 检测 笔记 参数 图像 theta CV


作者:云时之间
来源:知乎
链接:https://zhuanlan.zhihu.com/p/127950044
编辑:王萌

在这一篇文章中我们将学习使用OpenCV中的 HoughLines 函数和 HoughLinesP 函数来检测图像中的直线.

在这个函数中,使用的是霍夫变换(Hough Transform) 这是计算机视觉中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。主要是用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等)。

最基本的霍夫变换是从黑白图像中检测直线(线段)。也就是今天我们要学习的内容.

一:如何实现霍夫变换?

在这里我摘抄Bradski的< 学习OpenCV>来进行霍夫变换的推导

众所周知, 一条直线在图像二维空间可由两个变量表示. 例如:
A:在笛卡尔坐标系: 可由参数: (m,b) 斜率和截距表示.
B:在极坐标系: 可由参数:
图片

极径和极角表示
CV学习笔记(十六):直线检测

对于霍夫变换, 我们将用 极坐标系 来表示直线. 因此, 直线的表达式可为:
CV学习笔记(十六):直线检测

化简得到
CV学习笔记(十六):直线检测

2:一般来说对于点(x,y)我们可以将通过这个点的一族直线统一定义为:
CV学习笔记(十六):直线检测

这就意味着每一对 (r,の),代表一条通过点(x,y) 的直线.

3:如果对于一个给定点(x,y)

我们在极坐标对极径极角平面绘出所有通过它的直线, 将得到一条正弦曲线. 例如, 对于给定点

(x=8,y=6),我们可以绘出下图

CV学习笔记(十六):直线检测

只绘出满足下列条件的点

CV学习笔记(十六):直线检测
CV学习笔记(十六):直线检测

4:我们可以对图像中所有的点进行操作.

如果两个不同点进行上述操作后得到的曲线在平面(r,の)相交, 这就意味着它们通过同一条直线. 例如, 接上面的例子我们继续对点: (9,4),(12,3),绘图, 得到下图:

CV学习笔记(十六):直线检测

CV学习笔记(十六):直线检测
组成的平面内的的直线.

那么以上的材料要说明什么呢? 这意味着一般来说, 一条直线能够通过在平面(r,の),寻找交于一点的曲线数量来检测. 越多曲线交于一点也就意味着这个交点表示的直线由更多的点组成. 一般来说我们可以通过设置直线上点的阈值 来定义多少条曲线交于一点我们才认为 检测 到了一条直线.

综上所述:这就是霍夫线变换要做的. 它追踪图像中每个点对应曲线间的交点. 如果交于一点的曲线的数量超过了 阈值, 那么可以认为这个交点所代表的参数对(r,の)在原图像中为一条直线.

举个例子:

CV学习笔记(十六):直线检测

如上图,假定在一个8*8的平面像素中有一条直线,并且从左上角(1,8)像素点开始分别计算θ为0°、45°、90°、135°、180°时的ρ.

图中可以看出ρ分别为1、(9√2)/2、8、(7√2)/2、-1,并给这5个值分别记一票,同理计算像素点(3,6)点θ为0°、45°、90°、135°、180°时的ρ,再给计算出来的5个ρ值分别记一票,此时就会发现ρ = (9√2)/2的这个值已经记了两票了.

以此类推,遍历完整个88的像素空间的时候ρ = (9√2)/2就记了5票, 别的ρ值的票数均小于5票,所以得到该直线在这个88的像素坐标中的极坐标方程为 (9√2)/2=xCos45°+ySin45°,到此该直线方程就求出来了。(PS:但实际中θ的取值不会跨度这么大,一般是PI/180)。

二:实验代码

CV学习笔记(十六):直线检测

这里主要用到两个函数:

①:HoughLines函数是标准霍夫线变换函数,该函数的功能是通过一组参数对 (r,の)
的集合来表示检测到的直线,

其函数原型为:
HoughLines(image, rho, theta, threshold[, lines[, srn[, stn[, min_theta[, max_theta]]]]])

image参数表示边缘检测的输出图像,该图像为单通道8位二进制图像。
rho参数表示参数极径 r 以像素值为单位的分辨率,这里一般使用1像素。
theta参数表示参数极角の以弧度为单位的分辨率,这里使用1度。
threshold参数表示检测一条直线所需最少的曲线交点。
lines参数表示储存着检测到的直线的参数对 (r,の)的容器 。
srn参数、stn参数默认都为0。如果srn = 0且stn = 0,则使用经典的Hough变换。
min_theta参数表示对于标准和多尺度Hough变换,检查线条的最小角度。
max_theta参数表示对于标准和多尺度Hough变换,检查线条的最大角度。

opencv的HoughLinesP函数是统计概率霍夫线变换函数,该函数能输出检测到的直线的端点

CV学习笔记(十六):直线检测

其函数原型为:

HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]])

image参数表示边缘检测的输出图像,该图像为单通道8位二进制图像。
rho参数表示参数极径 r 以像素值为单位的分辨率,这里一般使用 1 像素。
theta参数表示参数极角の以弧度为单位的分辨率,这里使用 1度。
threshold参数表示检测一条直线所需最少的曲线交点。
lines参数表示储存着检测到的直线的参数的容器,也就是线段两个端点的坐标。
minLineLength参数表示能组成一条直线的最少点的数量,点数量不足的直线将被抛弃。
maxLineGap参数表示能被认为在一条直线上的亮点的最大距离。

三:实验结果分析:

CV学习笔记(十六):直线检测

对于简单的图形还是处理的很充分的,但是对于稍微复杂的图像,依旧是无能为力.这也是传统算法的局限性所在,泛化能力较差.

四:参考资料

①:
http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html
②:
https://blog.csdn.net/leonardohaig/article/details/87907462

标签:直线,函数,检测,笔记,参数,图像,theta,CV
来源: https://blog.51cto.com/15047484/2618828

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有