前言

在车道线检测中,最小二乘法,Hough变换是车道线模型拟合的传统方法之一,通过一系列离散的点拟合出车道直线,也就是得到基于像素平面坐标系的左车道和右车道直线方程。

Hough变换

Hough变换的基本思想


我们先来看看如何表达一条直线,如上图所示,直角坐标系的直线方程为y=ax+by=ax+by=ax+b,ρ为过原点O作直线的法线距离,θ为法线与水平轴的夹角,因此可以有x=ρcosθ,y=ρsinθx=ρcosθ,y=ρsinθx=ρcosθ,y=ρsinθ,因此:ρ=xcosθ+ysinθρ=xcosθ+ysinθρ=xcosθ+ysinθ。这也是直线方程的另一种表示方法,也就是说用ρθ两个参数就能表示一条直线,ρθ两个数,对应ρ-θ坐标系中的一个点。那么我们也就可以用ρ-θ坐标系中的一个点表示直角坐标系中的一条直线,现在问题在于我们该用什么来表示直角坐标系中的一个点呢?


如上图所示,我们假设直角坐标系有一个点P(x,y)P(x,y)P(x,y),已知经过一点可以作无数条直线,我们用这无数条直线的交点来表示这个点。直角坐标系中的一条直线对应于ρ-θ坐标系中的一个点,也就是说直角坐标系的无数条直线对应于ρ-θ坐标系的无数的点,这些点连起来是一条曲线,在Hough空间的曲线方程为ρ=xcosθ+ysinθ,x,yρ=xcosθ+ysinθ,x,yρ=xcosθ+ysinθ,x,y为原来直角坐标系的点P的坐标。
结果我们可以看到,平面直角坐标系的一条直线经过Hough变换映射到Hough空间的一个点。平面直角坐标系的一个点经过Hough变换映射到Hough空间的一条曲线。如果直角坐标系的若干个点在同一条直线上,那它们经过Hough变换形成的曲线会交于Hough空间的同一点,而这一点反向变换到直角坐标系中便是直角坐标系的点经过的同一条直线。
而我们实际进行Hough变换时需要进行离散化,由于图像像素是离散的,我们经过一个像素点也不用作无数条直线,而是隔一定角度间隔取一条直线,最后我们变换到Hough空间的也是一个个离散的点。

车道线检测

基本思想


我们对于相机检测图像然后二值化形成的这样一幅二值化图像上每一个白色点(x,y),(x,y),(x,y),给定一系列离散的θ值(0~360°),可以得到对应的ρ。统计(ρ,θ)(ρ,θ)(ρ,θ)数值相同的个数,统计计数值较大的点,其对应着待求的直线,而在实际检测统计中我们会求出多条直线,其中包括车道线,我们可以通过一些先验知识适当减小范围来提高检测稳定性。

MATLAB示例

首先我们用imread函数读取图像,语句如下

srcImage = imread('lane.jpg');      %读取图像

imread函数说明

函数原型

Mat imread(const String&filename,int flags=IMREAD_COLOR)

第一个参数 const String&类型的filename,指的是我们需要载入的路径名

第二个参数 int类型的flags,指的是加载的图像颜色类型,默认值为1,也就是彩色。

图像类型flags有以下几种
取值大于0:返回彩色图像
取值为0:返回灰色图像

然后我们需要将图片灰度化。

grayImage = rgb2gray(srcImage);  %图片灰度化

rgb2gray是matlab内部一种处理图像的函数,通过消除图像色调和饱和度信息同时保留亮度实现将将RGB图像或彩色图转换为灰度图像,即灰度化处理的功能

然后我们使用medfilt2函数进行中值滤波,滤波和大小为9×9

denoiseImage = medifilt2(grayImage,[9,9]);    %中值滤波

再使用sobel算子进行边缘增强

H = fspecial('sobel');
sobelImage = imfilter(denoisedImage,H);  %sobel算子边缘增强


再通过最大类间方差法(Otsu)选取阈值(图像阈值也可以理解为灰度图像黑色与白色的界定值),将图像二值化(像素值小于阈值则设置为0,也就是黑色;像素值大于阈值则设置为255,也就是白色)

thresh = graythresh(sobelImage);  %选取阈值binaryImage = imbinarize(sobelImage,thresh);  %二值化

然后进行Hough变换就可以得到车道线

[H,theta,rho] = Hough(binaryImage);   %Hough变换p = Houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));  %获取5个最大值点lines = Houghlines(binaryImage,theta,rho,p,'FileGap',20,'MinLength',40);%将这5个Hough空间的点转化为图像的直线段,直线段长度小于40个像素点时就舍弃

Hough变换及MATLAB示例相关推荐

  1. Hough变换原始形式-直线检测

    1.直角坐标系与极坐标系中的直线表示 1.1 直角坐标系与极坐标系 中的点的表示及它们之间相互关系 极坐标系(polar coordinates)是指在平面内由极点O.极轴L和极径r组成的坐标系,下图 ...

  2. 广义hough变换matlab,matlab – 广义Hough R表

    我试图在MATLAB中实现 this paper中提出的广义Hough变换.我也尝试使用 this document来理解算法.我不知道如何计算梯度角来找到Φ在R表中使用. 我试图运行这个matlab ...

  3. MATLAB实战系列(二十三)-基于hough变换的直线检测(附MATLAB源代码)

    前言 本文借鉴公众号 工科男的Matlab学习日志大佬的内容,加入个人的部分理解. Hough变换的定义 : Hough变换的基本原理是将影像空间中的曲线变换到参数空间中,通过检测参数空间中的极值点, ...

  4. hough变换连接边缘matlab,边缘检测与Hough变换实验报告 Matlab - 图文

    <边缘检测与Hough变换实验报告 Matlab - 图文>由会员分享,可在线阅读,更多相关<边缘检测与Hough变换实验报告 Matlab - 图文(5页珍藏版)>请在人人文 ...

  5. matlab人眼虹膜定位,基于Hough变换的人眼虹膜定位方法

    基于Hough变换的人眼虹膜定位方法 matlab 2021-2-12 下载地址 https://www.codedown123.com/64459.html 图像处理源代码,基于Hough变换的人眼 ...

  6. hough变换连接边缘matlab,matlab图像处理hough变换程序执行问题

    matlab图像处理hough变换程序执行问题0 pxkd82013.04.23浏览184次分享举报 程序如下: I= imread('D:\MATLAB7\fenkuai.bmp','bmp');% ...

  7. hough变换检测直线 matlab,Matlab实现Hough变换检测图像中的直线

    Hough变换的原理: 将图像从图像空间变换至参数空间,变换公式如下: 变换以后,图像空间与参数空间存在以下关系: 图像空间中的一点在参数空间是一条曲线,而图像空间共线的各点对应于参数空间交于一点的各 ...

  8. hough变换连接边缘matlab,hough边缘检测matlab

    利用matlab进行图像检测--直线提取_数学_自然科学_专业资料.Harbin Institute of Technology 图像工程导论 课程名称: ...(BW),'canny',thresh ...

  9. hough函数 matlab,在不使用hough函数的情况下在MATLAB中进行Hough变换

    我在 Rosetta Code的MATLAB中找到了Hough变换的实现,但是我无法理解它.另外我想修改它以显示原始图像和重建线(de-Houghing). 理解它和de-Houghing的任何帮助表 ...

最新文章

  1. CI报Disallowed Key Characters的解决
  2. 最全面的卷积神经网络介绍,都在这里了(附代码)
  3. Newtonsoft.Json 概述
  4. 【控制】《鲁棒控制-线性矩阵不等式处理方法》-俞立老师-第1章-引言
  5. java 访问 网络swf_JAVA访问网络资源
  6. Serverless Kubernetes:理想,现实与未来
  7. java反射 面试题_使用Java反射更改私有静态最终字段
  8. modelsim6.5b安装和仿真bug
  9. Java中的迭代器设计模式–示例教程
  10. 畅通工程(自己写的BFS,但后面想了下并查集更好更快)
  11. java是面向对象还是面向过程_面向对象和面向过程最本质的区别是什么?
  12. WebService学习总结(4)——第三方webService服务调用
  13. 马化腾:《王者荣耀》将举办AI电竞赛;美团发布自研无人机,15分钟配送到家;微软将为员工发放1500美元奖金|极客头条...
  14. Android中的ANR问题
  15. 用Java+xml配置方式实现Spring数据事务(编程式事务)
  16. 安卓IPCamera-ONVIF JAVA代码开源啦
  17. thinkphp 一个文件怎么调用另一个文件中的define()_ThinkPHP 简易开发思路 amp;amp; MVC和URL跳转...
  18. RS232 9针串口定义
  19. Ae导出 计算机内存,ae导出视频太大怎么办-缩小Ae导出视频大小的方法 - 河东软件园...
  20. 用Actix写的一个类似于Facemash的小项目总结

热门文章

  1. 孩子阅读习惯的培养以及好处
  2. 攻防世界-MISC:ext3
  3. 2021年MathorCup数学建模C题海底数据中心的散热优化设计解题全过程文档及程序
  4. Python网络爬虫(三)网易云音乐热评
  5. java城市链表_数据结构城市链表 1. 城市链表 [问题描述]将若干城市的信息 联合开发网 - pudn.com...
  6. CENTOS 64位安装32位jdk
  7. HTML【前端基础】
  8. Linux驱动学习——exynos4412介绍及启动流程
  9. 原生js怎么追加html,原生JS改变HTML内容
  10. 《算法导论3rd第十五章》动态规划