资讯详情

基于Hough变换的直线检测(Matlab)

点击上方“3D视觉车间,选择星标

第一时间送达干货

700354bc933da8c07256e96bf7bdc1e6.jpeg

作者无敌三脚猫

来源丨古月居

1、引言

该程序实现了一些基本的图像处理算法,并将它们组合在一起,构建了一个基于霍夫变换的直线探测器。该程序可以在图像中找到直线段的起点和终点。

和大多数视觉算法一样,Hough变换使用了一些参数,它们的最佳值是数据依赖性(即一组参数值在一个图像上工作得很好,对另一个图像可能不是最好的)。通过在测试图像上运行代码和调整参数,它获得了每个图像的最佳值,从而获得了良好的性能。

  • Hough Transform based line detector :基于Hough直线检测器的变换。

  • straight line segments in images:图像中的直线。

  • optimal values are data dependent:数据依赖性是最优参数。

2、实施

编写一个函数,用给定的卷积滤波器更换图像。

function [img1]=myImageFilter(img0,h)

该函数作为输入,接受存储在矩阵h中的卷积滤波器和灰度图像(img0)。函数的输出应与img大小相同的图像img1,它是由img得到0和h卷积。您可以假设过滤器h沿两个维度都是奇数大小。您将需要处理图像边缘的边界。

例如,当您将卷积掩膜放置在图像的左上角时,大多数滤波器掩膜将位于图像之外。一个可能的解决方案是处理图像,使图像边界外的像素与图像内的最近像素具有相同的强度值。

请写一个,只用一个for循环进行卷积的函数,并将其保存到ec/目录。(如果你在那里Q3.1中已经这样做了,好的,只需复制一个并保存下来EC/。)

另外,简单描述一下你在写作中是如何实现的。高度鼓励插图帮助理解。

function [img1]=myImageFilterX(img0,h)

为了只使用一个循环,我将使用2D数组转换为1D数组,然后使用它们的映射关系。其他代码和2.完全一样.m文件夹ec下。

编写一个函数,以查找图像中的边缘强度和方向。功能输出包含给定图像之一。

function [Im Io Ix Iy]=myEdgeFilter(img,sigma)

该函数将输入灰度图像(img)和σ(标量)。Sigma在边缘检测前使用高斯平滑核的标准差,函数输出边缘幅值图像Im,边缘方向图像Io,以及x和y的滤波响应Ix和Iy。

编写将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转换矩阵Hp和θ 值数组。

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=工作得最好。

(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 parameters   imglist = 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);   end     img = double(img) / 255;    &nsp;  %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变换图、最终结果

本文仅做学术分享,如有侵权,请联系删文。

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的点云处理入门与实战教程

扫码添加小助手微信,可

也可申请加入我们的细分方向交流群,目前主要有等微信群。

一定要备注:,例如:”3D视觉 + 上海交大 + 静静“。请按照格式备注,可快速被通过且邀请进群。也请联系。

▲长按加微信群或投稿

▲长按关注公众号

:针对3D视觉领域的五个方面进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业为一体的铁杆粉丝聚集区,近4000星球成员为创造更好的AI世界共同进步,知识星球入口:

学习3D视觉核心技术,扫描查看介绍,3天内无条件退款

 圈里有高质量教程资料、答疑解惑、助你高效解决问题

标签: 6ec激光传感器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台