当前位置:网站首页 > 技术博客 > 正文

halcon霍夫变换直线检测原理



常见的车道线检测的方法大致可以分为三类:

  • 传统方法
    利用传统图像处理基数从摄像机拍摄的图像中提取车道线特征。
  • 传统图像处理与深度学习相结合的方法
    深度学习提取的特征信息不能直接使用,采用传统图像处理的方式对直线特征点进行聚类与拟合。
  • 端到端的深度学习的方法
    直接从输入图像中学习到车道线特征,无需复杂的预处理、手工特征提取和后处理,并结合车道线的各种几何先验知识,设计损失函数监督网络训练,提高车道线检测的鲁棒性和准确性。

该文章主要介绍如何实现一个简单的传统车道线检测项目,详细阐述了传统车道线检测的流程并对霍夫变换的思想及canny边缘检测流程进行了概述。

霍夫变换是一种特征检测,被广泛应用在图像分析、计算机视觉以及数位影像处理。经典的霍夫变换是侦测图片中的直线,之后,霍夫变换不仅能够识别直线,也能够识别任何形状,常见的有圆形、椭圆形。
问题:对于人类而言,识别一副图像中的直线或是圆,是一件非常容易的事情。但对于计算机而言,一副图像所呈现的只是灰度值从0~255的矩阵而已,它无法判断该矩阵中的哪些是直线哪些不是,而霍夫变化就是帮助计算机“看到”图像中直线或圆的一种算法。

1. 基本思想

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

2. 常见的霍夫变换

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

在平面直角坐标系中,一条直线是由其斜率m0和截距b0所确定的,换句话而言,一条直线上的点所使用的是同一对m0和b0。所以,如果存在一个坐标体系是由m0为横轴,b0为纵轴,形成以(m0,b0)为参数的参数空间,那么平面直角坐标系中的一条直线上的点在参数空间上可表示为一个点。

当平面直角坐标系中的任意一点随着m0和b0的改变,在参数空间的所呈现的就是一条直线。在平面直角坐标系中任取两点A,B,并在参数空间投影,两条直线交于一点C(p,q)。交点C所体现的信息就是,点A,B两点连接的直线斜率为p,截距为q。因此我们可以理解霍夫变换其实就是计算参数空间累加点的值大小,值越大说明该点的参数m0,b0所代表的直线置信度越高。

但当直线垂直于X轴时,斜率m0将会变得无穷大,在计算机数值运算时会造成无法进行的现象。因此提出基于极坐标空间的霍夫变换,来解决这一问题。

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

极坐标是由极点,极轴,极径组成的坐标系。那么,一条直线可以被原点到该直线的垂直距离和垂线与X轴的夹角所唯一确定。投影到参数空间都可以表示为一条正弦曲线。那么极坐标系参数空间就与笛卡尔坐标系参数空间类似,都可以看成累加空间计算局部最大值,进行直线的预测。

但在现实的应用场景中,许多直线并不是非常精细,或多或少存在偏差,导致参数空间各曲线不能交于精确的一点,因此我们需要将参数空间分块,分块的步长则为单位长度的极径和极角。其次计算单位区域内累加的交点数量,将大于阈值的区域值认定为直线存在,存储其参数。

但是分块的步长对检测的精准度也会有影响,分的太细,计算代价就会上升,分的太大,计算的准确率就会下降。现实场景的应用会使用到一种Mask掩膜的做法,提取我们感兴趣的区域,来大大减少计算量。

边缘检测算法本质上就是一种滤波算法,区别在于滤波器的选择,其与滤波的规则是一致的。为了理解边缘检测算子,我们引入梯度这个概念,梯度在数字图像处理领域可以理解为像素灰度值变化速度,但在数字图像处理中,实际的应用是不需要求导的,只需要进行简单的加减运算。

几种基本的边缘检测滤波器:sobel、prewitt、roberts算子。

问题:直接使用基本的边缘算子求得的边缘图存在很多问题,如噪声污染没有被排除、边缘线太过粗宽等。因此我们介绍一个先进的边缘检测算子——canny算子。

  • 目前流行的canny算法的具体步骤:

1. 高斯滤波

高斯滤波的原理:根据待滤波的像素点及其邻域点的灰度值按照高斯公式生成的参数规则进行加权平均。

2. 计算梯度图像与角度图像

3. 对梯度图像进行非极大值抑制

上一步得到的梯度图像存在边缘粗宽、弱边缘干扰等众多问题,现在可以使用非极大值抑制来寻找像素点局部最大值,将非极大值所对应的灰度值置0,极大值点置1,这样可以剔除一大部分非边缘的像素点,因此最后生成的图像应为一副二值图像,边缘理想状态下都为单像素边缘。

4. 使用双阈值进行边缘连接

经过以上三步得到的边缘质量已经很高了,但是还是存在许多伪边缘,因此canny算法采用的算法是双阈值法,具体思路是:选取两个阈值,将小于低阈值的点认为是假边缘置0,将大于高阈值的点认为是强边缘置1,介于中间的像素点需要进一步的检查。

Pycharm2018.2.4 x64 + opencv2.4.10

1. 彩色图像转换成灰度图

将彩色图像(Color Image)转换为灰度图(Gray Scale Image),即从三通道RGB图像转为单通道图像。

我们这一步需要用到opencv库中的cv.cvtColor函数,该函数功能实现了色彩空间转换。需要用到两个参数:src——输入图片,code——颜色转换代码,具体代码如下:

 

原图:

在这里插入图片描述
灰度化后的效果图:

在这里插入图片描述

  • 为什么需要将彩色图像灰度化?

灰度化之后颜色信息丢失,许多简单的识别算法对颜色的依赖性不强,并且颜色本身非常容易受到光照等因素的影响。识别物体最关键最本质的部分是计算梯度,颜色本身难以提供关键信息,仅仅需要灰度图像中的信息就足够了。并且灰度化后,简化了矩阵,提高了运算速度。

2. 高斯滤波

高斯滤波算法是一种去除高频噪声的常用方式,通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值都是由其本身和邻域内的其他像素值经过加权平均后得到的。高斯滤波的原理是根据待滤波的像素点及其邻域点的灰度值按照高斯公式生成的参数规则进行加权平均。

我们这一步需要用到opencv库中的cv.GaussianBlur函数,其中使用到的参数为:src——输入图像,kernel_size——高斯核的大小,sigma——高斯标准差(一般默认为0),具体代码如下:

 

高斯滤波后的效果图:

在这里插入图片描述

  • 比较四种滤波方式
    均值滤波、高斯滤波、中值滤波、双边滤波
  • 滤波的两大目的

通过滤波来提取图像特征,简化图像所带的信息作为后续其他图像处理。

为适应图像处理的需求,通过滤波消除图像数字化时混入的噪声。

3. Canny边缘检测

我们这一步需要用到opencv库中的cv.Canny函数,其中使用到的参数为:src——输入图像,low_threshold ——低阈值,high_threshold——高阈值,具体代码如下:

 

Canny边缘检测后的效果图:

在这里插入图片描述

4. 生成Mask掩膜,提取 ROI

Mask掩模的作用为降低计算代价,即只在我们感兴趣部分进行算法的计算,设计思路如下:

  • 生成一个与原图大小维度一致的mask矩阵,并初始化为全0,即全黑。
  • 对照原图在该mask上构建感兴趣区域
  • 利用opencv中cv.fillpoly()函数对所限定的多边形轮廓进行填充,填充为1,即全白
  • 利用opencv中cv.bitwise()函数与canny边缘检测后的图像按位与,保留原图相中对应感兴趣区域内的白色像素值,剔除黑色像素值

这里设计的感兴趣区域是采用粗略估计的方式,确定四个顶点坐标,图形为梯形。
在这里插入图片描述

具体实现代码如下:

 

感兴趣区域和canny边缘检测后的图进行按位与后,产生的效果图如下:

在这里插入图片描述

5. 基于霍夫变换的直线检测

用到的是Opencv封装好的函数cv.HoughLinesP函数,使用到的参数如下:

  • image:输入图像,通常为canny边缘检测处理后的图像
  • rho:线段以像素为单位的距离精度
  • theta:像素以弧度为单位的角度精度(np.pi/180较为合适)
  • threshold:霍夫平面累加的阈值
  • minLineLength:线段最小长度(像素级)
  • maxLineGap:最大允许断裂长度

具体代码如下:

 
  1. 绘制车道线

这一步是将上一步检测到的直线绘制出来,但是会发现霍夫变换后直接绘制的直线可以看到出现了多条线段相互相邻的情况,而我们所期望的是单车道线检测。为了直观体验与后续处理,需要对上一步检测到的直线进行进一步的预处理,处理的方法具体为:

  • 对每条直线求取斜率,分别归为左右列表中
  • 对得到的列表进行斜率平均值m0的计算和最高点A的计算
  • 根据平均斜率m_{0}、最高点计算线段、图像下方的交点B坐标
  • 连接最高点A与交点B

具体代码如下:

 

绘制车道线效果图如下:

在这里插入图片描述

7. 图像融合

这一步是将原始彩色图像与我们刚绘制的车道线图像进行比例的融合,这里需要介绍一个函数cv.addWeighted,参数src1——原始图像或矩阵;alpha——其原始图像对应的权重;src2——第二幅图像;beta——第二副图像对应的权重;gamma——整体添加到数值,默认为0即可。

这里我们将原图权重设为0.8,车道线图像设为1,则最后呈现的效果为车道线较为明显,可视化程度提高,具体代码如下:

 

最终效果图如下:
在这里插入图片描述


                            

  • 上一篇: linux cp指令
  • 下一篇: linux桌面系统哪个好
  • 版权声明


    相关文章:

  • linux cp指令2025-04-16 11:30:05
  • 处理器性能测试2025-04-16 11:30:05
  • yml配置文件详解2025-04-16 11:30:05
  • 神奇代码表情包2025-04-16 11:30:05
  • 半导体封装工艺2025-04-16 11:30:05
  • linux桌面系统哪个好2025-04-16 11:30:05
  • sql数据库游标的使用步骤2025-04-16 11:30:05
  • okgot it2025-04-16 11:30:05
  • oracle数据库expdp命令2025-04-16 11:30:05
  • hashset并集2025-04-16 11:30:05