canny边缘检测_基于传统方法的车道线检测实现

f8bb678fba1530c56e40da82205ff22a.png

本文实现的是基于传统方法的车道线检测,所谓传统方法就是没有涉及到深度学习算法,基于直观的手段和数学知识来实现,后期会实现基于深度学习的车道线检测方法。

完整代码:https://github.com/XU-ZHOU/AutoDriving

实现步骤:

  1. Canny边缘检测
  2. 手动分割路面区域
  3. 霍夫变换得到车道线
  4. 获取车道线并叠加到原始图像中

算法演示视频如下:

9ca6b77557bba3997f43ac0285816abc.png
Demo演示https://www.zhihu.com/video/1190297724023803904

一、Canny边缘检测

Canny边缘检测就是检测出视频中出现的所有的线,如图1所示:

fbece21eb699e20e1dc0effafa85f3da.png
图1

基本原理:检测亮度的急剧变化(常见的就是大梯度,如从白色到黑色),在给定阈值下定义为边。

Canny检测的步骤

(1)对原始图像进行灰度化

Canny算法通常处理的图像为灰度图,因此如果摄像头获取的是彩色图像,那首先就得进行灰度化。对一幅彩色图进行灰度化,就是根据图像各个通道的采样值进行加权平均。以RGB格式的彩图为例,通常灰度化采用的方法主要有:

    1. Gray=(R+G+B)/3;
    2. Gray=0.299R+0.587G+0.114B;(这种参数考虑到了人眼的生理特点)

(2)高斯滤波

滤波的主要目的是降噪,一般的图像处理算法都需要先进行降噪。而高斯滤波主要使图像变得平滑(模糊),同时也有可能增大了边缘的宽度。本文实现的代码采用 5*5 的高斯滤波器(正太分布核)对图像做卷积(平滑图像)。

高斯函数是一个类似与正态分布的中间大两边小的函数。

对于一个位置(m,n)的像素点,其灰度值(这里只考虑二值图)为f(m,n)。

那么经过高斯滤波后的灰度值将变为:

简单说就是用一个高斯矩阵乘以每一个像素点及其邻域,取其带权重的平均值作为最后的灰度值。

(3)用一阶偏导的有限差分来计算梯度的幅值和方向

边缘是什么?边缘就是灰度值变化较大的的像素点的集合。一道黑边一道白边中间就是边缘,它的灰度值变化是最大的,在图像中,用梯度来表示灰度值的变化程度和方向。

它可以通过点乘一个Sobel、Roberts、Prewitt等算子沿x轴和y轴检测边缘是水平的、垂直的或者是对角线,得到不同方向的梯度值

,

综合梯度通过以下公式计算梯度值和梯度方向:

(5)非极大值抑制

图像梯度幅值矩阵中的元素值越大,说明图像中该点的梯度值越大,但不能说明该点就是边缘(这仅仅是属于图像增强的过程)。在Canny算法中,非极大值抑制是进行边缘检测的重要步骤,简单说就是寻找像素点局部最大值,将非极大值点所对应的灰度值置为0,这样可以剔除掉许多非边缘的点,因为如果一个像素点属于边缘,那么这个像素点在梯度方向上的梯度值是最大的,否则不是边缘,将灰度值设为0

(6)使用上下阀值来检测边缘

非极大值抑制后可以确认强像素在最终边缘映射中。但还要对弱像素进行进一步分析确定它是边缘还是噪声。

67d92731e80581c2d3602d075bb65b55.png
图2

通过设置两个阀值(threshold),如图2所示,分别为maxVal和minVal。

通过如下方式来确定是否为边缘:

  1. 大于maxVal的都被检测为边缘
  2. 小于minVal的都被检测为非边缘
  3. 对于大于minVal而小于maxVal的像素点,如果与确定为边缘的像素点邻接,则判定为边缘;否则为非边缘。

Canny边缘检测实现代码

def 

二、手动分割路面区域

d1ed36b46f1c0dc7d0f139212a949c84.png
图3

Canny边缘检测出了所有的边缘(图3左),很显然,我们需要的是表示道路的线(图3右),因此需要排除其他的线条。

我们采用手动指定一个三角形来分割出路面区域,去除其它干扰边缘。

c11d1959a7a62068cf0732132f1af305.png
图4

具体的说就是以原始的图片建立直角坐标系,指定三角形的三个顶点,保留三角形区域中的边缘线条,去除其他多余的线条,如图4所示,实现代码如下:

def 

实现代码

def 

三、霍夫变换得到车道线

想象一下,人类在一副图片中找出一条直线或者圆,相信对于大家应该都是一件相当容易的事,但是对于计算机来说,一副图像所呈现的只是灰度值从0-255的庞大矩阵而已,它可不容易知道复制的矩阵中哪些是直线哪些不是,霍夫变换便是帮助计算机'看到'图像中的直线或圆的一种算法

1.基本思想

将传统的图像从x 、y轴坐标系变换到参数空间(m, b)或者霍夫空间(Hough space)中,通过在参数空间(parameter space)或可称为累加空间(accumulator space)中计算局部最大值从而确定原始图像直线或圆所在位置。

2.常见的霍夫变换

  • 基于笛卡尔坐标空间的霍夫变换
  • 基于极坐标空间的霍夫变换

(1)基于笛卡尔坐标空间的霍夫变换

平面直角坐标中,一条直线的表示通常用

表示,其中
表示的是直线的
斜率
表示的是直线的
截距,一条直线上的点所使用的是同一个
,因此我们可以设想一下,如果有一个坐标轴体系是以
为横轴,
为竖轴,形成以
为参数的
参数空间,是不是在 平面坐标中同一条直线上的点在参数空间表示为一个点呢, 霍夫变换即是基于这种思想而诞生的,如图5所示。

ff89b73915317c57963b49ad51d028d6.png
图5

4065566ace25b30721f4cc060276b27b.png
图6

从数学上来解释两者的转换,如图6所示。

让我们换一种思维来更深层次理解一下霍夫变换,在xy笛卡尔坐标轴上的任意一点(x,y)随着x斜率

和截距
的改变,在参数空间各种
的组合将会呈现为一条
直线,如图 7所示,为点A(1,6)在 参数空间的投影

1417bd396aac892c199c52bd3ec001d8.png
图7

现在我们在xy笛卡尔坐标轴做另一点B(2, 8)的参数空间投影,如图 8所示

d896d64499cced56cbd4e25b98634f15.png
图8

可以发现,在参数空间中两直线交于粉色点位(2, 4),这里所体现的信息为:点A、B两点连接的直线斜率为

,截距为
,因此,现在我们可以理解霍夫变换其实就是
计算参数空间累加点的值大小,值越大越说明这个点的参数
所代表的直线
置信度越高。

但是,基于笛卡尔坐标空间的霍夫变换存在一种特殊情况:当线垂直时梯度无穷大,无法在霍夫空间中表示出来。为了解决这个问题,我们在笛卡尔坐标系中用极坐标法表示直线。对应到霍夫空间也做对应变化。

(2)基于极坐标空间的霍夫变换

极坐标是指在平面内由极点极轴极径组成的坐标系,其中假设有一点

,其中参数
表示极径,即极点O到P点的距离,参数
表示极角,即OX到OP的角度。

假设有一条直线,原点到该直线的垂直距离为

,垂线与x轴的夹角为
,那么这条直线是
唯一的,且直线方程为:

a56a60d0ab683a158fc02693019660db.png
图9

霍夫变换后转换成图10所示:

b804783a653e8c6c7661451b49c5600a.png
图10

和直角坐标系类似,霍夫空间中相交的曲线越多,交点表示的线在笛卡尔坐标系对应的点越多。我们在霍夫空间中定义交点的最小阈值来检测线,霍夫变换跟踪了帧中的每个点的霍夫空间交点,如果交点数量超过了阈值就确定一条对应参数 θ 和 d的线

之所以用阈值来确定参数,是因为在现实的应用场景中,许多直线并不是非常精细,或多或少存在偏差,导致参数空间各曲线不能交于精确的一点,因此我们需要将参数空间分块,分块的步长则为单位长度的

,其次计算单位区域内
累加的交点数量,将大于 阈值(threshold)的区域值认定为直线存在, 存储其参数

但是,分块的步长对检测的精准度也有影响,分的太细,计算代价就会上升,分的太大,计算的准确率就会下降,因此现在通用的常用做法是:

步长设为单像素单位,
步长设为
,并且现实场景中的应用也会使用一种
Mask掩模的做法,提取我们感兴趣的图像区域,以此来大大减少计算量。

霍夫变换代码

hough 

24e535d08d729706cb175caab4bd51f2.png
霍夫变换画出的车道线

四、获取车道线并叠加到原始图像中

这一步是将彩色图像与我们上一步绘制的车道线图像进行比例的融合

首先,综合所有线,求得左右两条车道线的平均斜率和截距

实现代码:

def 

然后,将原始彩色图像与我们刚画的车道线图像进行比例的融合。

这里需要用到的函数cv.addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None,参数src1表示第一张图像或矩阵,alpha是它对应的权重(Weight),src2表示的则是第二副图像或矩阵,beta是它对应的权重,第五个参数gamma表示整体添加到数值,默认为0即可。

我们是按照0.9:1进行融合。

实现代码

output 

五、总结

本Demo主要是自己在学习过程中接触的,基本了解了传统车道线检测的方法,算是最基础的实现方式了,当然存在许多不足之处,后续基于深度学习的方法再进行改进。

参考:https://zhuanlan.zhihu.com/p/60190848

https://github.com/andylei77/lane-detector

https://blog.csdn.net/likezhaobin/article/details/6892176

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值