Hough变换及MATLAB示例

article/2025/9/29 6:12:43

前言

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

Hough变换

Hough变换的基本思想


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


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

在这里插入图片描述

车道线检测

基本思想

在这里插入图片描述
我们对于相机检测图像然后二值化形成的这样一幅二值化图像上每一个白色点 ( x , y ), (x,y), xy),给定一系列离散的θ值(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个像素点时就舍弃

http://chatgpt.dhexx.cn/article/S9aImTvI.shtml

相关文章

hough变换算法

VoteNet网络中会用Deep Hough Voting,所以先来学习一下Hough Voting。 正文开始 hough变换算法 1、算法思想 霍夫变换于1962年由Paul Hough 首次提出,后于1972年由Richard Duda和Peter Hart推广使用,经典霍夫变换用来检测图像中的直线&…

Hough 变换

Hough 变换是图像处理中,检测直线最基本,也是应用最广泛的一种传统方法。虽然现在是深度学习大行其道的时代,但是很多传统的算法,依然有其参考的价值所在,至少从数学表达上来看,是更加的简洁,有…

Hough transform(霍夫变换)

主要内容: 1、Hough变换的算法思想 2、直线检测 3、圆、椭圆检测 4、程序实现 一、Hough变换简介 Hough变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换的基本原理在于利用点与线的对偶性,将原始图像空间的给定的曲线通过曲线表达形式变…

Hough变换

目录 一、Hough变换简介 二、Hough变换的数学理解 1.x-y变量空间至k-b参数空间的变换 2.x-y变量空间至-空间的变换 三、Hough变换应用于线检测(MATLAB实现) 1.检测步骤 2.使用MATLAB工具箱中的Hough变换函数进行边缘检测 一、Hough变换简介 霍夫变…

图像处理:Hough变换原理分析

目录 一、前言 二、直线函数的形式化表示 2.1 直线被方程表示 2.2 直线被图表表示 2.3 直线的表格表示 三、hough变换的提出 3.1 极坐标表示点和线 四、 hough变换的原理 4.1 极坐标的​编辑表格 4.2 用​编辑平面表示:过任意点P(x,y)做所有射线&#xff0…

Hough变换原理-直线检测

目录 一、简介 二、原理 三、Python代码实现 一、简介 Hough(霍夫)变换是图像处理中从图像中识别几何形状的基本方法之一。Hough变换是将图像坐标空间变换到参数空间,利用点与线的对偶性,将原始图像空间的给定的曲线&#xff08…

YUV444、YUV422、YUV420、YUV420P、YUV420SP、YV12、YU12、NV12、NV21

前言 各种YUV格式多如牛毛啊,刚开始学起来确实很费劲,网上搜索的文章讲的并不是很明白。 各种不同的YUV格式其实只是采样方式和存储方式不同,就这两点,不同的采样方式是为了实现节省内存,不同的存储方式暂时不了解有…

2023-02-24:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,采用YUV420P转YUV420SP的方式。

2023-02-24:请用go语言调用ffmpeg,解码mp4文件并保存为YUV420SP格式文件,采用YUV420P转YUV420SP的方式。 答案2023-02-24: 使用 github.com/moonfdd/ffmpeg-go 库。 解码后就是yuv420p,然后用SwsScale函数转换成yuv…

ffmpeg处理YUV422和YUV420P相互转换

YUV422空间大小计算 YUV422封包width*heightwidth/2*height*2YUYV Y分量width*heightYUYV U分量width/2*heightYUYV V分量width/2*height YUV420空间大小计算 YUV420封包width*heightwidth/2*height/2*2Y分量width*heightU分量width/2*height/2V分量width/2*height/2 extern &…

Android Camera2 YUV420_888 格式详解

Camera2 YUV420_888 官网文档介绍 Android PAI 对 YUV420_888的介绍 ,大致意思如下: 它是YCbCr的泛化格式,能够表示任何4:2:0的平面和半平面格式,每个分量用8 bits 表示。带有这种格式的图像使用3个独立的Buffer表示,每…

【音视频数据数据处理 2】【YUV篇】将YUV420P_I420数据旋转90°-180°-270°-镜像旋转

【音视频数据数据处理 2】【YUV篇】将YUV420P_I420数据旋转90 一、理论分析(以yuv420p_i420格式为例)二、顺时针旋转90 代码实现三、顺时针旋转180 代码实现四、旋转90-180-270-镜像旋转,完整代码实现五、运行结果 本文接着前文: …

YUV420->RGB888格式转换的CPP实现

git地址: GitHub - Evayangelion/EYUVConverter: A YUV converter implemented by cpp 上一次学习了YUV各种采样和存储方式的区别(YUV知识存档) 接下来一起学习一下RGB格式的知识和YUV到RGB的转换方式 RGB色彩模式的分类 RGB的分类相较YUV来说…

YUV444,YUV420P,YUV420SP,YUV422P,YUV422SP,NV12,NV21,NV16,NV61等格式区分与存储简介

一、基础知识: 概述 YUV是顏色編碼方式,常用於視頻及圖像處理中。 其中的YUV是三個分量。“Y”表示明亮度(Luminance或Luma),也就是灰度值。“U”和“V” 表示的是彩色信息,分別爲色度和濃度(C…

OpenGL渲染YUV420P

一 、YUV420P数据格式二 、GLFW渲染YUV420P2.1 定义顶点数据2.2 创建YUV三张纹理2.3上行YUV420数据2.4 渲染纹理2.5 着色器 三、代码地址以及存在的问题四 、解决存在的问题 一 、YUV420P数据格式 图片来源于谷歌 结合上图可以看出YUV420P的特点如下: ①无论在横向还…

详解 YUV 格式(I420/YUV420/NV12/NV12/YUV422)

转载自:划水型派大星 YUV (YCbCr)是一种像素格式,常见于视频编码与静态图像。与 RGB 格式(红-绿-蓝)相反,YUV 分别由一个称为 Y(相当于灰度)的“亮度”分量(…

ffmpeg学习笔记(2)-YUV420算法原理

ffmpeg学习笔记(2)——YUV420算法原理 一、YUV像素格式 YUV的组成格式如下图所示 Y:明亮度,即灰度值 U、V:颜色 YUV格式将亮度信息和色彩信息分离,没有色彩信息依然能够显示图像(没有色彩信息),很好的解…

音视频编解码: YUV存储格式中的YUV420P,YUV420SP,NV12, NV21理解(转)

概述 之前介绍了YUV码流的采样格式,下面分析下YUV码流的存储格式,YUV码流的存储格式与采样格式息息相关。总的来讲,YUV存储格式主要分为两种: planar 平面格式 指先连续存储所有像素点的 Y 分量,然后存储 U 分量&…

图像编码YUV420格式

目录 一、YUV简介 二、RGB 到 YUV 的转换 三、YUV采样 YUV 4:4:4 YUV 4:2:2 YUV 4:2:0 四、YUV 存储格式 基于 YUV 4:2:2 采样的格式 YUYV 格式 UYVY 格式 YUV 422P 格式 基于 YUV 4:2:0 采样的格式 YU12 和 YV12 格式 NV12 和 NV21 格式 一、YUV简介 YUV&#x…

YUV420数据格式详解

YUV简介 YUV格式有两大类:planar和packed。 对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。 对于packed的YUV格式,每个像素点的Y,U,V是连续交叉存储的。 YUV分为三个分…

python 生产者消费者模式

生产者消费者模式概述 在并发编程中使用生产者和消费者模式能够解决大不多的并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。 为什么使用生产者消费者模式 在线程世界里,生产者就是生产数据的线程,消费者就是…