基于Hough变换的直线检测(Matlab)
点击上方“3D视觉工坊”,选择“星标”
干货第一时间送达
作者丨无敌三脚猫
来源丨 古月居
1、引言
该程序实现了一些基本的图像处理算法,并将它们组合在一起,构建了一个基于霍夫变换的直线检测器。该程序能够在图像中找到直线段的起始点和结束点。
像大多数视觉算法一样,Hough变换使用了一些参数,它们的最优值是具有数据依赖性(即一组参数值在一幅图像上工作得很好,可能对另一幅图像来说不是最好的)。通过在测试图像上运行代码和调优参数,它获得了每个图像的最佳值,从而获得了良好的性能。
Hough Transform based line detector :基于Hough变换的直线检测器。
straight line segments in images:图像中的直线。
optimal values are data dependent:最优参数具有数据依赖性。
2、实施
2.1卷积
编写一个函数,将图像与给定的卷积滤波器进行变换。
function [img1]=myImageFilter(img0,h)
作为输入,该函数接受存储在矩阵h中的卷积滤波器和灰度图像(img0)。函数的输出应该是与img0相同大小的图像img1,它是由img0和h卷积得到。您可以假设滤波器h沿两个维度都是奇数大小。您将需要处理图像边缘的边界情况。
例如,当您在图像的左上角放置卷积掩膜时,大多数滤波器掩膜将位于图像之外。一种可能的解决方案是对图像进行处理,使位于图像边界之外的像素与位于图像内部的最近像素具有相同的强度值。
2.2用一个For循环进行卷积
请编写一个只使用一个for循环进行卷积的函数,并将其保存到ec/目录。(如果您在Q3.1中已经这样做了,好的,只需复制一个并保存到EC/。)
此外,简单地描述一下你在写作中是如何实现的。插图有助于理解是高度鼓励的。
function [img1]=myImageFilterX(img0,h)
为了只使用一个循环,我将2D数组转换成了1D数组,然后使用它们的映射关系。其他代码与2.1完全相同。看.m文件夹ec下。
2.3边缘检测
编写一个函数,以查找图像中的边缘强度和方向。在您的写作中包含给定图像之一的功能输出。
function [Im Io Ix Iy]=myEdgeFilter(img,sigma)
该函数将输入灰度图像(img)和σ(标量)。Sigma是高斯平滑核在边缘检测前使用的标准差,函数将输出边缘幅值图像Im,边缘方向图像Io,以及x方向和y方向上的滤波响应Ix和Iy。
2.4Hough变换
编写将Hough变换应用于边缘幅值图像的函数。
function [H, rhoScale, thetaScale] = myHoughTransform(Im, threshold, rhoRes, thetaRes)
Im是边缘幅值图像, threshold(标量)是用来忽略像素的边缘强度阈值,该类像素具有低边缘滤波器响应。rhoRes(标量)和ThetaRes(标量)分别是HoughTransform累加器沿ρ轴和θ 轴的分辨率。例如,如果theaRes=5°和,则沿θ轴的线带数为360/5=72。
H是Hough变换累加器,包含图像中所有可能的直线“选票”数。rhoscale和thetaScale是myHoughTransform生成Hough变换矩阵H的p和θ 值数组。例如,
2.5找直线
function [rhos, thetas] = myHoughLines(H, nLines)
H是Hough变换累加器;RhoRes和taRes是累加器分辨率参数,nLine是返回的行数。Output lineRho和lineTheta都是nline x 1向量,它们分别包含图像中所找到的线条的参数(p和θ)。
(1) Fillgap:如果有不连续的线条需要连接在一起,则将Fillgap设置为相对较高的价值。另一方面,如果有一些不应该在一起的线连接,然后将fillgap设置为一个小值,就像我们在图6中所做的那样。
(2) Minlength:如果图像只有较长的线条,而不是几条较短的线条,则Minlength应该是大的,反之亦然。
(3) 变化”最小长度”: Minlength = 10(左)和Minlength = 30(右),通过增加线的最小长度可以消除图片中的短噪声线。根据不同的图片,情况也不同。
3、讨论
我的代码可以用一个参数对所有的图像,但结果并不理想。
从上图可以看出:
(3)阈值:如果边缘图像中图像的线条不清晰,我们应该将阈值设置为 一个相对较低的值来增强它。同样,我们应该设置一个更高的阈值来降低噪音,如果边缘已经足够清晰。
(4) thetaRes和rhoRes:增加这些值可以在Hough投票中获得更好的分辨率图片,在我的代码中rhoRes=pi/180和thetaRes=2工作得最好。
(5) nLine:如果图像中有很多直线需要匹配,那么应该选择一个较大的nLine。如果有一些线,但大部分是曲线,nLines不应该设置太高。
(6) Fillgap:如果有不连续的线条需要连接在一起,则将Fillgap设置为a 相对较高的价值。另一方面,如果有一些不应该在一起的线连接,然后将fillgap设置为一个小值,就像我们在图6中所做的那样。
(7) Minlength:如果图像只有较长的线条,而不是几条较短的线条,则Minlength应该是大的,反之亦然。在改变分辨率之前,强制条款部分造成的问题最多。
因为如果分辨率较低,应在附近的霍夫峰仅视为一个峰。所以,有些线找不到。改变分辨率后,问题解决了。
但是,对于每个元素在霍夫矩阵中,仍然存在一个问题它的外围可能存在相同的值。我们只能将值设置为0时,有一个值大于它在邻域。所以它可能导致在最后的线拟合过程中有双线。
有一种解决方法,就是检查是否有相邻元素中相同的元素只保留其中一个,但它需要一个循环。我的最佳性能参数包括在上面的记录中,还有另一对不同图像的参数。如果对所有的图像只应用一对参数,那将是:
Sigma = 2; threshold = 0.03;
rhoRes = 2; thetaRes = pi/180;
nLines = 50; ‘FillGap’ = 6; ‘MinLength’ = 15;
The effect of single parameter has already been stated above.
4、代码结构图
clc;
clear;datadir = '../data'; %the directory containing the images
resultsdir = '../results'; %the directory for dumping results%parameters
sigma = 2;
threshold = 0.005; %0.03
rhoRes = 2;
thetaRes = pi/90;
nLines = 50;
%end of parametersimglist = dir(sprintf('%s/*.jpg', datadir));for i = 1:numel(imglist)%read in images%[path, imgname, dummy] = fileparts(imglist(i).name);img = imread(sprintf('%s/%s', datadir, imglist(i).name));if (ndims(img) == 3)img = rgb2gray(img);endimg = double(img) / 255;%actual Hough line code function calls% [Im Io Ix Iy] = myEdgeFilter(img, sigma); [H,rhoScale,thetaScale] = myHoughTransform(Im, threshold, rhoRes, thetaRes);[rhos, thetas] = myHoughLines(H, nLines);lines = houghlines(Im>threshold, 180*(thetaScale/pi),...rhoScale, [rhos,thetas],'FillGap',5,'MinLength',10);%everything below here just saves the outputs to files%fname = sprintf('%s/%s_01edge.png', resultsdir, imgname);imwrite(Im/max(Im(:)), fname);fname = sprintf('%s/%s_02threshold.png', resultsdir, imgname);imwrite(Im > threshold, fname);fname = sprintf('%s/%s_03hough.png', resultsdir, imgname);imwrite(H/max(H(:)), fname);fname = sprintf('%s/%s_04lines.png', resultsdir, imgname);img2 = img;for j=1:numel(lines)img2 = drawLine(img2, lines(j).point1, lines(j).point2); end imwrite(img2, fname);
end
5、测试结果
从左往右依次为原图、边缘检测图、二值化图、Hough变换图、最终结果
本文仅做学术分享,如有侵权,请联系删文。
3D视觉工坊精品课程官网:3dcver.com
1.面向自动驾驶领域的多传感器数据融合技术
2.面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
3.彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进
4.国内首个面向工业级实战的点云处理课程
5.激光-视觉-IMU-GPS融合SLAM算法梳理和代码讲解
6.彻底搞懂视觉-惯性SLAM:基于VINS-Fusion正式开课啦
7.彻底搞懂基于LOAM框架的3D激光SLAM: 源码剖析到算法优化
8.彻底剖析室内、室外激光SLAM关键算法原理、代码和实战(cartographer+LOAM +LIO-SAM)
9.从零搭建一套结构光3D重建系统[理论+源码+实践]
10.单目深度估计方法:算法梳理与代码实现
11.自动驾驶中的深度学习模型部署实战
12.相机模型与标定(单目+双目+鱼眼)
13.重磅!四旋翼飞行器:算法与实战
14.ROS2从入门到精通:理论与实战
15.国内首个3D缺陷检测教程:理论、源码与实战
16.基于Open3D的点云处理入门与实战教程
重磅!3DCVer-学术论文写作投稿 交流群已成立
扫码添加小助手微信,可申请加入3D视觉工坊-学术论文写作与投稿 微信交流群,旨在交流顶会、顶刊、SCI、EI等写作与投稿事宜。
同时也可申请加入我们的细分方向交流群,目前主要有3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、多传感器融合、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、求职交流、ORB-SLAM系列源码交流、深度估计等微信群。
一定要备注:研究方向+学校/公司+昵称,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。原创投稿也请联系。
▲长按加微信群或投稿
▲长按关注公众号
3D视觉从入门到精通知识星球:针对3D视觉领域的视频课程(三维重建系列、三维点云系列、结构光系列、手眼标定、相机标定、激光/视觉SLAM、自动驾驶等)、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:
学习3D视觉核心技术,扫描查看介绍,3天内无条件退款
圈里有高质量教程资料、答疑解惑、助你高效解决问题
觉得有用,麻烦给个赞和在看~
基于Hough变换的直线检测(Matlab)相关推荐
- MATLAB实战系列(二十三)-基于hough变换的直线检测(附MATLAB源代码)
前言 本文借鉴公众号 工科男的Matlab学习日志大佬的内容,加入个人的部分理解. Hough变换的定义 : Hough变换的基本原理是将影像空间中的曲线变换到参数空间中,通过检测参数空间中的极值点, ...
- 【图像检测-道路检测】基于hough变换实现道路检测直线检测附matlab代码
1 内容介绍 随着遥感技术和计算机技术的飞速发展,遥感图像的采集变得越来越容易,遥感图像中的物体特征识别及检测变得越来越重要,直线是图像中物体基本的特征之一,研究图像中直线的检测算法对计算机视觉和模式 ...
- 基于Hough变换的直线和圆的检测与提取
学数字图像处理有挺长时间了,正好最近这段时间有空,学习了一下Hough变换,作了几个比较简单的东西,分享出来,希望能和大家一起学习,也希望各位能提出宝贵的意见,共同进步,文采不好,欢迎拍砖,下面正式进 ...
- 【图像识别】基于 Hough变换钟表表盘识别Matlab代码
1 简介 本设计主要针对指针式仪表的数字化读数的研究,提高读取效率和读数的准确性.以MATLAB为载体对图像进行仿真处理,通过设备采集图片,对图像进行表盘定位,图像预处理,边缘检测,Hough变换等操 ...
- 基于matlab的Hough变换图像直线检测算法仿真
目录 1.算法仿真效果 2.MATLAB源码 3.算法概述 4.部分参考文献 1.算法仿真效果 matlab2022a仿真结果如下:
- 直线检测——Radon变换/霍夫变换/基于快速傅里叶变换的直线检测
1. 直线检测 1.1. Radon直线检测原理 基于Radon变换的直线检测的目的就是检测根据角度变化时出现的"局部峰值",即可以确定直线的方向,同时,峰值大小能够确定直线上点的 ...
- 图像分割实战之基于Hough变换提取图像中的直线
图像分割的依据是基于图像中各区域具有不同的特性(比如,灰度.颜色.纹理).图像分割的目的是将图像划分成若干具有相近或相同特性的子区域,以便继续在分割成的相关区域中提取目标,并进而根据目标的特征或结构信 ...
- matlab人眼虹膜定位,基于Hough变换的人眼虹膜定位方法
基于Hough变换的人眼虹膜定位方法 matlab 2021-2-12 下载地址 https://www.codedown123.com/64459.html 图像处理源代码,基于Hough变换的人眼 ...
- 基于hough变换的平行线识别
基于hough变换的平行线识别 hough变换基本原理讲述 线段识别是识别图像中平行线的基础.但一张图像中所包含的线段几乎是无限的所以无法在图像中直接判断,因此引入Hough变换[32].Hough变 ...
- Udacity无人驾驶工程师课程笔记:1 计算机视觉基础——基于Hough变换的车道线提取
Udacity无人驾驶工程师课程笔记:1 计算机视觉基础--基于Hough变换的车道线提取 图像处理 颜色选择 区域遮罩 组合颜色和区域选择 边缘检测 Canny边缘检测 Hough变换 Hough变 ...
最新文章
- IoT和AI如何让企业在疫情期间重启业务
- 共享单车取消月卡优惠 烧钱时代正式结束
- 一些计算机知识的总结(转)
- python 装饰器实现事件绑定_Python装饰器是怎么实现的?
- Linux中最方便的管理员获取方法
- 共济失调对我们的危害你知道吗
- Android 自定义属性时TypedArray的使用
- ASP.NET Core 启动方式(Hosting)
- C#联通新版验证码识别的实现[转]
- PostgrSQL流复制wal异常
- java判断字符串是否是空格_检查字符串在Java中是否为空格,空(“”)或null
- Linux安装php-7.0.16,完成php和apache的配置
- 分寸:切记别把话说得太死 — 《别输在不会表达上》
- python 核心编程 练习题
- coreseek java_基于Sphinx的中文全文检索引擎Coreseek的安装
- java没有pom文件_java – Maven依赖没有得到相应的POM文件下载
- css最好看最全的按钮样式,动画效果大全,纯css样式
- bch verilog代码_BCH源码学习笔记 | 第一步:搭建BCH的源码学习环境
- 如何下载Eclipse历史版本
- Windows下自动同步工具SyncToy的使用与定时执行部署