当前位置: 首页 > news >正文

车道线检测|利用边缘检测的原理对车道线图片进行识别

前言

那么这里博主先安利一些干货满满的专栏了!

这两个都是博主在学习Linux操作系统过程中的记录,希望对大家的学习有帮助!

操作系统Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm=1001.2014.3001.5482Linux Syshttps://blog.csdn.net/yu_cblog/category_11786077.html?spm=1001.2014.3001.5482这两个是博主学习数据结构的同时,手撕模拟STL标准模版库各种容器的专栏。

STL源码剖析https://blog.csdn.net/yu_cblog/category_11983210.html?spm=1001.2014.3001.5482手撕数据结构https://blog.csdn.net/yu_cblog/category_11490888.html


一、摘要 

本次实验,通过学习边缘检测的原理,使用Matlab编程语言,完成对输出给定图像的边缘检测图像和完成车道线识别。

二、实验内容及目的

输出给定图像的边缘检测图像和完成车道线识别。

三、实验相关原理描述

边缘检测是一种图像处理技术,用于在图像中检测出物体或场景的边缘或轮廓。其原理是通过分析图像中的亮度或颜色变化来识别边缘位置。常用的边缘检测方法包括Sobel、Prewitt、Canny等。

下面是本次实验主要流程:

主要步骤原理 

高斯滤波:

高斯滤波是一种常用的图像处理技术,用于平滑图像、去除噪声和边缘检测等应用。它基于高斯函数(也称为正态分布函数)的概念,通过对图像中的像素进行加权平均来实现平滑效果。

高斯滤波的公式如下:
G(x, y) = \frac{1}{2\pi\sigma^2} \cdot e^{-\frac{x^2 + y^2}{2\sigma^2}}

其中,G(x,y) 表示高斯滤波器在坐标(x,y) 处的权重值,σ 表示高斯函数的标准差,控制了滤波器的模糊程度。标准差越大,滤波器的模糊程度越高。

高斯滤波的原理是利用高斯函数的权重值对图像中的像素进行加权平均。滤波器的中心像素权重最大,越远离中心像素的像素权重越小。通过对邻近像素进行加权平均,可以使图像中的噪声平均化,并且能够保留图像的整体结构和边缘特征。

Sobel算子计算梯度:

水平方向的 Sobel 算子:
G_x = \begin{bmatrix} -1 & 0 & 1 \\ -2 & 0 & 2 \\ -1 & 0 & 1 \end{bmatrix}\displaystyle

垂直方向的Sobel算子:
G_y = \begin{bmatrix} -1 & -2 & -1 \\ 0 & 0 & 0 \\ 1 & 2 & 1 \end{bmatrix}

这些模板是 3x3 的矩阵,分别对应着水平和垂直方向上的微分操作。通过将这些模板与图像进行卷积操作,可以得到图像在水平和垂直方向上的梯度值。

非极大值抑制:

非极大值抑制可以用来寻找像素点局部最大值,将非极大值所对应的灰度值置0,极大值点置1,这样可以剔除一大部分非边缘的像素点,从而得到一副二值图像,边缘理想状态下都为单像素边缘。
\begin{array}{l} g_{u p}(i, j)=(1-t) \cdot g_{x y}(i, j+1)+t \cdot g_{x y}(i-1, j+1)\\ g_{\text {down }}(i, j)=(1-t) \cdot g_{x y}(i, j-1)+t \cdot g_{x y}(i+1, j-1) \end{array}

四、实验过程和结果

% 读取图片
img = imread('图像路径');
imshow(img);
% 将图像转换为灰度
gray_img = rgb2gray(img);
% 高斯滤波
sigma = 2; % 高斯滤波器的标准差
gaussian_filtered_img = imgaussfilt(gray_img, sigma);
% 使用Sobel算子进行梯度计算
sobel_filtered_img = double(edge(gaussian_filtered_img, 'sobel'));
% 显示原始图像和处理后的图像
imshow(img); title('原始图像');
imshow(sobel_filtered_img); title('梯度计算后的图像');
% 定义梯度方向
directions = [-pi/2, -pi/4, 0, pi/4, pi/2, 3*pi/4, pi, -3*pi/4];% 对每个像素,找到沿着梯度方向的两个相邻像素,计算它们的插值
nms_img = zeros(size(sobel_filtered_img));
for i=2:size(sobel_filtered_img,1)-1for j=2:size(sobel_filtered_img,2)-1% 找到最近的两个方向[~, index] = min(abs(directions - atan2d(-sobel_filtered_img(i,j), sobel_filtered_img(i,j+1))));if index == 1 || index == 5left = sobel_filtered_img(i-1,j-1);right = sobel_filtered_img(i+1,j+1);elseif index == 2 || index == 6left = sobel_filtered_img(i-1,j+1);right = sobel_filtered_img(i+1,j-1);elseif index == 3 || index == 7left = sobel_filtered_img(i,j-1);right = sobel_filtered_img(i,j+1);elseif index == 4 || index == 8left = sobel_filtered_img(i+1,j-1);right = sobel_filtered_img(i-1,j+1);end% 如果像素值是局部最大值,则保留if sobel_filtered_img(i,j) >= left && sobel_filtered_img(i,j) >= rightnms_img(i,j) = sobel_filtered_img(i,j);endend
end% 显示非极大值抑制后的图像
figure; imshow(nms_img); title('非极大值抑制后的图像');
% 阈值滞后处理
low_threshold = 0.05;
high_threshold = 0.2;
edge_map = zeros(size(nms_img));
edge_map(nms_img > high_threshold) = 1;
for i=2:size(nms_img,1)-1for j=2:size(nms_img,2)-1if (nms_img(i,j) > low_threshold) && (edge_map(i,j) == 0)if (edge_map(i-1,j-1) == 1) || (edge_map(i-1,j) == 1) || (edge_map(i-1,j+1) == 1) || (edge_map(i,j-1) == 1) || (edge_map(i,j+1) == 1) || (edge_map(i+1,j-1) == 1) || (edge_map(i+1,j) == 1) || (edge_map(i+1,j+1) == 1)edge_map(i,j) = 1;endendend
end
imshow(edge_map);% 孤立弱边缘抑制
isolated_threshold = 1;
for i=2:size(edge_map,1)-1for j=2:size(edge_map,2)-1if (edge_map(i,j) == 1) && (sum(sum(edge_map(i-1:i+1,j-1:j+1))) <= isolated_threshold)edge_map(i,j) = 0;endend
end
imshow(edge_map);
% 车道线检测
% [m,n] = size(edge_map)
% x = [1600,0,0,1600];
% y = [1000,0,0,1000];
% mask = poly2mask(x,y,m,n);
% new_img = mask.*edge_map;
% imshow(new_img);new_img = edge_map;
lines = HoughStraightRecognize(new_img);hold on;
imshow(img);
for k = 1:length(lines)
% k = 7;
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
endfunction lines = HoughStraightRecognize(BW)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%该函数为霍夫变换识别直线的函数
%input:图像(可以是二值图,也可以是灰度图)
%output:直线的struct结构,其结构组成为线段的两个端点
%以及在极坐标系下的坐标【rho,theta】
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[H,T,R] = hough(BW);% imshow(H,[],'XData',T,'YData',R,...%             'InitialMagnification','fit');% xlabel('\theta'), ylabel('\rho');% axis on, axis normal, hold on;P  = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));%x = T(P(:,2)); y = R(P(:,1));%plot(x,y,'s','color','white');lines = houghlines(BW,T,R,P,'FillGap',5,'MinLength',7);%FillGap 两个线段之间的距离,小于该值会将两个线段合并%MinLength 最小线段长度
end

实验过程所得到输出图像如下图所示:

相关文章:

车道线检测|利用边缘检测的原理对车道线图片进行识别

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 这两个都是博主在学习Linux操作系统过程中的记录&#xff0c;希望对大家的学习有帮助&#xff01; 操作系统Operating Syshttps://blog.csdn.net/yu_cblog/category_12165502.html?spm1001.2014.3001.5482Linux S…...

C++—static关键字详解

引言&#xff1a; C的static有两种用法&#xff1a;面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数&#xff0c;不涉及类&#xff1b;后者主要说明static在类中的作用。 一.面向过程中的static 1.静态全局变量 静态全局变量有以下特点…...

CS144学习笔记(1):Internet and IP

1.网络应用 网络应用可以在世界范围内交换数据&#xff0c;例如你可以通过浏览器读取出版社服务器提供的文章。网络应用的基本模型&#xff1a;两台主机各自在本地运行一个程序&#xff0c;程序通过网络来通信。 最常用的通信模型使用双向可靠字节流&#xff0c;通信的两台主机…...

2 Linux基础篇-Linux入门

2Linux基础篇-Linux入门 文章目录 2Linux基础篇-Linux入门2.1 Linux介绍2.2 Linux和Unix的关系 学习视频来自于B站 【小白入门 通俗易懂】2021韩顺平 一周学会Linux。 2.1 Linux介绍 常见的操作系统有 Windows、MacOS、Android、ios、Linux、Unix等。而其中&#xff0c;Linux是…...

分享200+个关于AI的网站

分享200个关于AI的网站 欢迎大家访问&#xff1a;https://tools.haiyong.site/ai 快速导航 AI 应用AI 写作AI 编程AI 设计AI 作图AI 训练模型AI 影音编辑AI 效率助手 AI 应用 文心一言: https://yiyan.baidu.com/ 百度出品的人工智能语言模型 ChatGPT: https://chat.openai.c…...

静态 链接

1、空间与地址的分配 现在的链接器空间分配的策略基本上都采用 “相似段合并” 的方式。通过将所有相同类型的 section 合并到一起&#xff0c;例如将所有输入目标文件的 .text 合并&#xff08;按顺序合并&#xff09;到输出文件的 .text 节中&#xff1b;然后&#xff0c;链接…...

【C#性能】C# 语言中的数组迭代

一、说明 可迭代性&#xff0c;是数组等操作的根本&#xff1b;在C程序开发过程中&#xff0c;可迭代操作是非常普遍、非常广泛的&#xff0c;然而&#xff0c;对这种操作知道多少&#xff0c;又不知道多少&#xff0c;都将影响开发灵活性、开发的进度。因此&#xff0c;本文干…...

全志F1C200S嵌入式驱动开发(解决spi加载过慢的问题)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 之前的几个章节当中,我们陆续解决了spi-nor驱动的问题、uboot支持spi-nor的问题。按道理来说,下面要做的应该就是用uboot的loady命令把kernel、dtb、rootfs这些文件下载到ddr,然…...

信息系统项目管理师(第四版)教材精读思维导图-第三章信息系统治理

请参阅我的另一篇文章&#xff0c;综合介绍软考高项&#xff1a; 信息系统项目管理师&#xff08;软考高项&#xff09;备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 目录 3.1 IT治理 3.2 IT审计 3.1 IT治理 3.2 IT审计...

区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型

区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型 目录 区间预测 | MATLAB实现基于QRF随机森林分位数回归多变量时间序列区间预测模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRF随机森林分位数回归多变量时间序列区间…...

五步快速搭建个性化外卖小程序商城

随着人们生活节奏的加快&#xff0c;外卖行业蓬勃发展。为了满足用户的需求&#xff0c;许多企业开始使用小程序商城来提供外卖服务。那么&#xff0c;如何制作一个功能完善、用户友好的外卖小程序商城呢&#xff1f;下面就来为大家详细介绍一下制作的步骤。 首先&#xff0c;我…...

jenkins中配置了发送邮件,构建后却没有发邮件Not sent to the following valid addresse

【问题描述】&#xff1a;jekins中配置了发送邮件&#xff0c;构建后却没有发邮件的问题&#xff0c;构建报错&#xff1a;Not sent to the following valid addresse 【报错显示】&#xff1a; 【问题定位】&#xff1a;Extended E-mail Notification中&#xff0c;没有配置…...

装箱问题(背包问题)

题目描述 有一个箱子容量为v(正整数&#xff0c;o≤v≤20000)&#xff0c;同时有n个物品(o≤n≤30)&#xff0c;每个物品有一个体积 (正整数)。要求从 n 个物品中&#xff0c;任取若干个装入箱内&#xff0c;使箱子的剩余空间为最小。 输入格式 第一行&#xff0c;一个整…...

【C++】总结4-this指针

文章目录 什么是this指针this指针存在的意义this指针的特性this指针存在哪里this指针可以为空吗 什么是this指针 C编译器给每个非静态成员函数增加了一个隐藏的指针参数&#xff0c;让该指针指向当前对象&#xff08;函数运行时调用该函数的对象&#xff09;&#xff0c;在函数…...

go压力测试

压力测试 1.1.1. Go怎么写测试用例 开发程序其中很重要的一点是测试&#xff0c;我们如何保证代码的质量&#xff0c;如何保证每个函数是可运行&#xff0c;运行结果是正确的&#xff0c;又如何保证写出来的代码性能是好的&#xff0c;我们知道单元测试的重点在于发现程序设计…...

【计算机网络】socket编程基础

文章目录 1. 源IP地址和目的IP地址2. 理解MAC地址和目的MAC地址3. 理解源端口号和目的端口号4. PORT与PID5. 认识TCP协议和UDP协议6. 网络字节序7. socket编程接口7.1 socket常见API7.2 sockaddr结构 1. 源IP地址和目的IP地址 因特网上的每台计算机都有一个唯一的IP地址&#…...

学C的第三十天【自定义类型:结构体、枚举、联合】

相关代码gitee自取&#xff1a;C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 学C的第二十九天【字符串函数和内存函数的介绍&#xff08;二&#xff09;】_高高的胖子的博客-CSDN博客 1 . 结构体 &#xff08;1&#xff09;. 结构体的基础知识&#xff1a; 结构…...

Ubuntu(20.04):通过noVNC实现网页访问vnc

VNC vnc是日常工作和生产环境中常用的远程桌面控制工具。 通常需要在被访问的系统中安装vncserver。 然后在发起访问端,安装客户端软件,比如VNC Viewer。 noVNC noVNC提供了一种方案,就是通过web浏览器直接访问vnc server。 其实现的基本原理是: 1.已经安装好的vncse…...

OpenAI的Function calling 和 LangChain的Search Agent

OpenAI的Function calling openai最近发布的gpt-3.5-turbo-0613 和 gpt-4-0613版本模型增加了function calling的功能&#xff0c;该功能通过定义功能函数&#xff0c;gpt通过分析问题和函数功能描述来决定是否调用函数&#xff0c;并且生成函数对应的入参。函数调用的功能可以…...

【mysql数据库】MySQL7在Centos7的环境安装

说明&#xff1a; 安装与卸载中&#xff0c;用户全部切换成为root&#xff0c;⼀旦安装&#xff0c;普通用户就能使用。初期练习&#xff0c;mysql不进行用户管理&#xff0c;全部使⽤root进⾏&#xff0c;尽快适应mysql语句&#xff0c;后⾯学了用户管理&#xff0c;在考虑新…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils&#xff1a; ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类&#xff0c;封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz&#xff0c;先构建任务的 JobD…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

基于单片机的宠物屋智能系统设计与实现(论文+源码)

本设计基于单片机的宠物屋智能系统核心是实现对宠物生活环境及状态的智能管理。系统以单片机为中枢&#xff0c;连接红外测温传感器&#xff0c;可实时精准捕捉宠物体温变化&#xff0c;以便及时发现健康异常&#xff1b;水位检测传感器时刻监测饮用水余量&#xff0c;防止宠物…...

GAN模式奔溃的探讨论文综述(一)

简介 简介:今天带来一篇关于GAN的,对于模式奔溃的一个探讨的一个问题,帮助大家更好的解决训练中遇到的一个难题。 论文题目:An in-depth review and analysis of mode collapse in GAN 期刊:Machine Learning 链接:...

使用homeassistant 插件将tasmota 接入到米家

我写一个一个 将本地tasmoat的的设备同通过ha集成到小爱同学的功能&#xff0c;利用了巴法接入小爱的功能&#xff0c;将本地mqtt转发给巴法以实现小爱控制的功能&#xff0c;前提条件。1需要tasmota 设备&#xff0c; 2.在本地搭建了mqtt服务可&#xff0c; 3.搭建了ha 4.在h…...