边缘检测与Hough变换实验报告 Matlab
Hough变换直线检测MatLab代码.doc

Hough变换直线检测MatLab代码function Img_hough = hough_s(Img, bw)%该函数实现hough变换提取直线的功能。
%输入图像x,运行Z后直接画出直线。
%选择进行Hough变换的图像行%Img为原图像;bw为边缘图像%%[H,W,D]=size(Img);Img_hough = Img;讦D==lchannel = Img_hough;Img_hough = cal(3,channel, channel, channel); end[M,N]=size(bw);%求出图像大小。
%%dtheta=l;drho=l;md=ceil((N+round(sqrt(M A2+N A2)))/drho);%确定网格的最大区域。
ma=ceil(l 8O/dtheta); numrhotheta=zeros(md,ma);%产生计数矩阵。
coordrhotheta=cell( 1,1);% para=cell(l,3);❷II数组相当于c语言中的指针,可动态的改变大小。
for i=l:mdfor j=l:macoordrhotheta{ i,j}=[J;endend%产生空网格。
ymin = 5;ymax = M - 4;for i=ymin:ymaxforj=l:Nif bw(i,j) == 1for k=l:marho=round((j *cos(dtheta*k*pi/180)+i*sin(dtheta*k*pi/180))/drho); %根据直线的法线式表示,计算出平面上不同点的hough变换值。
rho=rho+ceil(N/drho);%可能的最大负值。
numrhotheta(rho+1 ,k)=numrhotheta(rho+1 ,k)+1;%将hough变换值相应位置的计数值加1。
coordrhotheta {rho+ l,k}=[coordrhotheta {rho+ l,k);[ij]];%记录hough变换值相应位置对应的点的坐标。
Hough变换直线检测MatLab代码

Hough变换直线检测MatLab代码一.function Img_hough = hough_s(Img, bw)%该函数实现hough变换提取直线的功能。
%输入图像x,运行之后直接画出直线。
%选择进行Hough变换的图像行%Img为原图像;bw为边缘图像%%[H,W,D]=size(Img);Img_hough = Img;if D==1channel = Img_hough;Img_hough = cat(3,channel, channel, channel); end[M,N]=size(bw);%求出图像大小。
%%dtheta=1;drho=1;md=ceil((N+round(sqrt(M^2+N^2)))/drho);%确定网格的最大区域。
ma=ceil(180/dtheta);numrhotheta=zeros(md,ma);%产生计数矩阵。
coordrhotheta=cell(1,1);% para=cell(1,3);�ll数组相当于c语言中的指针,可动态的改变大小。
for i=1:mdfor j=1:macoordrhotheta{i,j}=[];endend%产生空网格。
ymin = 5;ymax = M - 4;for i=ymin:ymaxfor j=1:Nif bw(i,j) == 1for k=1:marho=round((j*cos(dtheta*k*pi/180)+i*sin(dtheta*k*pi/180))/drho);%根据直线的法线式表示,计算出平面上不同点的hough变换值。
rho=rho+ceil(N/drho);%可能的最大负值。
numrhotheta(rho+1,k)=numrhotheta(rho+1,k)+1;%将hough变换值相应位置的计数值加1。
coordrhotheta{rho+1,k}=[coordrhotheta{rho+1,k};[i,j]];%记录hough变换值相应位置对应的点的坐标。
图像增强和边缘检测实验报告

图像增强和边缘检测实验内容1)将Image1.jpg 转换为灰度图像A。
2)读懂文档(图像直方图均衡化.doc),利用里面的方法通过编程对图像A进行直方图均衡化处理,得到处理后的图像B。
显示图像A和B,以及各自对应的灰度直方图。
3)利用锐化方法(教材118-120页),编制程序,对图像A和B分别使用罗伯特梯度,索伯尔梯度,拉普拉斯方法,进行处理,比较哪种求边缘的方法好,以及进行图像的直方图均衡化后能否提高求边缘的精确度。
4)撰写报告书,说明实验的步骤和方法,实验的结果等。
5)提交报告书以及源程序实验步骤和方法1)调用rgb2gray()函数将Image1.jpg 转换为灰度图像A。
并将图像A保存到f和I1中。
2)统计图像A中的像素并进行均衡化处理并将结果保存到B,显示图像A和B;调用imhist()函数显示两图像的灰度直方图。
3)编制罗伯特锐化函数,设定两个模板t1=[1,0;0,-1] t2=[0,-1;1,0],调用conv2()函数获得图像和两个模板的卷积并取绝对值相加获得罗伯特锐化结果,缩小结果图像。
4)编制索伯尔锐化函数,设定两个模板t1=[1,2,1;0,0,0;-1,-2,-1] t2=[-1,0,1;-2,0,2;-1,0,1] ,其余步骤与罗伯特锐化相似。
5)编制拉普拉斯锐化函数,设定模板t(m,n)=[0,1,0;1,-4,1;0,1,0],将待处理图像与模板卷积,并用原图像的至减去模板运算结果的整数倍,将结果缩小化到原图像大小既得拉普拉斯锐化结果。
6)函数整合,将编制好的3)、4)、5)三个函数整合到2)的程序后面并加以调整,分别对图像A和B进行锐化,并将结果输出到2*4的图框中进行对比实验结果1)2)3)通过比较可以发现罗伯特算法要比索伯尔算法差一些,索伯尔算法可以使检测边界更加精确;拉普拉斯算法相对于索伯尔算法对比度更高一些边缘更加明显和精确。
通过对比AB 两图锐化后的结果可知无论使用那一种锐化算法,都是均衡化后的图像B的锐化结果更好一些,边缘更加明显,所以可以得出结论:直方图均衡化可以提高求边缘的精度。
边缘检测及hough变换.

sk ak ak1 ak2
tk(Laplacian-Gauss)算子
Marr和Hildreth将Gaussian滤波器和Laplacian边缘检测结合在一起,
形成了LoG(Laplacian of Gaussian)算法。即先用高斯函数对图像进行 平滑,然后再用拉普拉斯算子进行运算,形成Laplacian-Gauss算法, 它使用一个墨西哥草帽函数形式。
判断是否需要连接。
3)记录像素连接的情况,另开一个空间, 给不同的边以不同的标记。
4)最后,删除孤立线段,连接断开的线段。
Hough变换
问题的提出 Hough变换的基本思想 算法实现 Hough变换的扩展
Hough变换问题的提出
在找出边界点集之后,需要连接,形成完整的 边界图形描述
分割对象区域
分割对象区域
基本思想:计算局部微分算子
边界图像 截面图
一阶微分:用梯度算子来计算
特点:对于亮的边,边的变化起点是正的,结束 是负的。对于暗边,结论相反。常数部分为零。
用途:用于检测图像中边的存在
二阶微分:通过拉普拉斯来计算
特点:二阶微分在亮的一边是正的,在暗的一边是 负的。常数部分为零。
比较梯度向量的方向角
对于点(x’,y’),判断其是否与邻域内的点 (x,y)的方向角相似,当:
| (x,y) – (x’,y’)| < A
其中A是一个角度阈值 当梯度值和方向角都是相似的,则点(x’,y’),与边点界(x,y)是连接的。
点 (x,y)
点(x’,y’)
连接算法描述:
1)设定A、T的阈值大小,确定邻域的大小 2)对图像上每一个像素的邻域点进行分析,
,
matlab边缘检测

数字信号处理实验报告实验二图像的边缘检测姓名:张成辉学号:2011704009专业:仪器仪表工程实验三图像的边缘检测一、实验目的1.进一步理解边缘检测的基本原理2.掌握对图像边缘检测的基本方法3.学习利用Matlab图像工具箱对图像进行边缘检测二、实验原理图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。
有许多方法用于边缘检测,它们的绝大部分可以划分为两类:基于查找一类和基于零穿越的一类。
基于查找的方法通过寻找图像一阶导数中的最大和最小值来检测边界,通常是将边界定位在梯度最大的方向。
三、实验要求对边缘检测的要求:使用Matlab图像处理工具箱中的方法对图片的边缘进行提取;注意观察不同操作对垂直方向、水平方向、斜方向的提取效果有何区别;注意观察提取后的边界是否连续,若不连续可采用什么方法使其连续。
四、实验步骤1.打开MATLAB软件;2.利用MATLAB图像工具箱中已有函数进行图像的边缘检测;3.显示原图和处理过的图像。
4.记录和整理实验报告五.实验程序与结果因为我选取图像的时候觉得人物的轮廓边缘比较清晰,所以我选择简单的人物图像,原图如下:在图像的傅立叶变换的实验中,我看到了图像经过调用Matlab中的FFT函数经过处理之后,我们看到了图像的频谱,也就是图像梯度的分布图,我们还可以看出图像中央是直流低频成分,四角是高频成分。
此实验是在此基础上进行图像的边缘检测,并对常用的边缘检测算子:梯度运算sobel算子和canny进行对比实验。
5.1 canny算子Matlab程序:a = imread('c:/5.jpg');a=rgb2gray(a); % 选取的是jpg格式的图片,试用要进行灰度处理imshow(a);title('灰度图');ffta = fft2(a); % 获取2维离散傅里叶变化后的图像,保存到fftIsffta = fftshift(ffta); % 将傅里叶变化的中心移到图像中心,保存到sfftIRR = real(sffta); % 取实部II = imag(sffta); % 取虚部A = sqrt(RR.^2 + II.^2); % 计算频谱幅值A = (A - min(min(A)))/(max(max(A)) - min(min(A)))*225; % 灰度拉升,将变换后的图像拉升到0~255区间b=edge(a,'canny',[0.03,0.06]); %灰度图的边缘提取c=edge(a,'canny',[0.05,0.1]);d=edge(a,'canny',[0.05,0.1],2);figure;subplot(1,3,1),imshow(b), axis on;title('canny 阈值=0.02');subplot(1,3,2),imshow(c), axis on;title('canny 阈值=0.07');subplot(1,3,3),imshow(d),axis on;title('默认');figure;imshow(A);title('频谱图');Matlab运行结果图如下:5.2 Sobel 算子(索贝尔算子)Matlab 程序:a = imread('c:/5.jpg');a=rgb2gray(a); % 灰度处理b=edge(a,'sobel',0.02);c=edge(a,'sobel',0.07);[d,e]=edge(a,'sobel');subplot(1,3,1),imshow(b), axis on;title('prewitt 阈值=0.02');subplot(1,3,2),imshow(c), axis on;频谱图灰度图title('prewitt 阈值=0.07')subplot(1,3,3),imshow(d),axis on;title('默认');Matlab运行结果图如下:六.结论由上边的结果图可以看出,canny边缘检测定位精度较高,图像边缘很清晰,而Sobel算子对噪声具有平滑作用,受噪声影响较小,可提供较为精确的边缘方向信息,但同时也会检测出许多伪边缘,检测到的边缘宽度较粗,边缘位置定位精度不高。
边缘检测matlab实验报告

边缘检测matlab实验报告引言边缘检测在图像处理领域中是一项十分重要的任务。
它可以帮助我们从图像中提取出物体的边缘信息,对于图像分割、目标识别等任务都具有重要意义。
本实验旨在通过利用MATLAB中提供的边缘检测函数,实现对图像中边缘的提取,并对实验结果进行分析和探讨。
实验步骤1. 导入图像首先,我们需要从MATLAB工作环境中导入需要进行边缘检测的图像。
我们可以使用`imread`函数将图像读入到MATLAB的内存中。
matlabimage = imread('example.jpg');2. 灰度化灰度化是边缘检测的前提条件,它可以将一幅彩色图像转化为灰度图像,使得后续的操作更加简便。
我们可以使用`rgb2gray`函数将彩色图像转化为灰度图像。
matlabgray_image = rgb2gray(image);3. 边缘检测接下来,我们可以使用MATLAB中提供的边缘检测函数进行实际的边缘检测操作。
MATLAB中有许多边缘检测算法可供选择,例如Sobel算子、Canny算子等。
本实验我们选择使用Canny算子进行边缘检测。
matlabedge_image = edge(gray_image, 'Canny');4. 结果显示最后,我们可以使用`imshow`函数将原始图像和边缘检测结果显示出来,以便于观察和分析。
matlabsubplot(1, 2, 1);imshow(gray_image);title('原始图像');subplot(1, 2, 2);imshow(edge_image);title('边缘检测结果');5. 结果分析通过以上步骤,我们可以得到原始图像和边缘检测结果。
我们可以观察边缘检测结果,进一步分析图像中的边缘信息。
同时,我们还可以对不同的边缘检测算法进行对比实验,以评估它们的性能和适用性。
实验结果下图展示了使用Canny算子进行边缘检测的实验结果。
matlabcanny边缘检测代码接霍夫变换-概述说明以及解释

matlabcanny边缘检测代码接霍夫变换-概述说明以及解释1.引言1.1 概述边缘检测是图像处理中的一个重要任务,它广泛应用于计算机视觉、图像分析和模式识别等领域。
边缘检测的目标是找到图像中不同区域之间的边界,并将其表示为像素强度的变化。
Canny边缘检测算法是一种经典且常用的边缘检测方法。
它通过一系列的图像处理步骤来提取图像中的边缘信息。
Canny算法的特点是能够检测出细且准确的边缘,并且对于图像中的噪声具有较好的抵抗能力。
Matlab是一种功能强大的数学软件,广泛应用于科学计算、数据可视化和图像处理等领域。
Matlab提供了丰富的图像处理函数和工具箱,其中包括了Canny边缘检测的实现代码。
本文的主要目的是介绍Matlab中Canny边缘检测的代码实现,并结合Hough变换算法进行边缘检测的应用。
通过使用Matlab中的相关函数和工具,我们可以有效地实现Canny边缘检测,并结合Hough变换来进一步处理和分析图像中的边缘特征。
本文将首先回顾Canny边缘检测算法的原理和步骤,然后介绍Matlab中的Canny边缘检测代码的使用方法。
接着,我们将介绍Hough 变换算法的原理和应用,并展示如何将Canny边缘检测与Hough变换相结合来实现更精确的边缘检测。
最后,我们将对Canny边缘检测和Hough变换的优缺点进行讨论,总结这两种方法在边缘检测中的应用。
同时,我们也将展望未来的研究方向,探讨如何进一步改进和优化边缘检测算法,以满足不断发展的图像处理需求。
通过阅读本文,读者将能够理解Canny边缘检测算法和Hough变换算法的原理,掌握Matlab中相关代码的使用方法,并了解边缘检测在实际应用中的优势和局限性。
希望本文能为读者在图像处理领域的学习和研究提供一定的帮助和启示。
文章结构是指文章的整体框架和组织形式。
一个良好的文章结构可以使读者更好地理解和领会文章的内容,同时也有助于文章的逻辑性和条理性。
hough变换检测直线原理matlab

Hough变换是一种图像处理技术,它可以被用来检测图像中的直线。
Hough变换的原理是通过将图像空间中的像素点转换到参数空间中来对直线进行检测。
在参数空间中,每条直线都可以被表示为一组参数,如直线的斜率和截距。
在matlab中,可以使用hough变换来检测图像中的直线。
下面我们来介绍一下在matlab中如何使用hough变换来检测直线。
1. 预处理图像在使用hough变换之前,首先需要对图像进行预处理。
可以通过灰度化、边缘检测等处理方法来提取出图像中的直线信息,以便于后续的检测。
2. 进行hough变换在matlab中,可以使用函数hough来进行hough变换。
该函数的调用格式为:[H,T,R] = hough(BW)其中,BW是经过预处理的二值图像,H是hough变换的结果矩阵,T和R分别是参数空间中的角度和距离。
3. 检测直线在获得了hough变换的结果矩阵之后,可以使用函数houghpeaks来检测出图像中的直线。
该函数的调用格式为:P = houghpeaks(H,5)其中,H是hough变换的结果矩阵,5表示要检测的直线数量。
4. 获取直线参数一旦检测出了直线,就可以使用函数houghlines来获取直线的参数。
该函数的调用格式为:lines = houghlines(BW,T,R,P)其中,BW是经过预处理的二值图像,T和R分别是参数空间中的角度和距离,P是检测出的直线。
5. 绘制直线可以使用函数imshow来在原图上绘制出检测到的直线。
该函数的调用格式为:imshow(BW)hold onfor k = 1:length(lines)xy = [lines(k).point1; lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');endhold off通过以上步骤,就可以在matlab中使用hough变换来检测图像中的直线。
matlabcanny边缘检测代码接霍夫变换

matlabcanny边缘检测代码接霍夫变换全文共四篇示例,供读者参考第一篇示例:Matlab是一个强大的数学软件工具,其图像处理工具箱可以帮助我们进行各种图像处理操作,比如边缘检测和霍夫变换。
本文将分享如何使用Matlab进行Canny边缘检测,并结合霍夫变换进行线检测。
Canny边缘检测是一种经典的边缘检测算法,它的优点是能够检测到边缘的细节,并且对噪声具有一定的鲁棒性。
在Matlab中,我们可以通过一行简单的代码来实现Canny边缘检测:```edgeImage = edge(rgb2gray(image), 'canny');```以上代码中,我们首先将原始图像转换为灰度图像,然后调用Matlab的'edge'函数,并指定边缘检测算法为Canny,最后我们将得到的边缘图像存储在edgeImage中。
接下来,我们可以将边缘图像显示出来,以便进行进一步的处理和分析。
```imshow(edgeImage);通过上述代码,我们可以看到Canny边缘检测算法的效果,边缘比较清晰,同时也保留了边缘的细节信息。
接下来,我们将介绍如何使用霍夫变换来进行线检测。
霍夫变换是一种经典的图像处理算法,其主要应用是检测直线和圆等几何形状。
在Matlab中,我们可以通过一行代码来实现霍夫变换的线检测:```[H,theta,rho] = hough(edgeImage);peaks = houghpeaks(H, 10);lines = houghlines(edgeImage, theta, rho, peaks);imshow(image);hold on;for k = 1 : length(lines)xy = [lines(k).point1; lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');endhold off;以上代码中,我们首先调用Matlab的'hough'函数来计算霍夫变换的极坐标空间。
基于Matlab和优化Hough变换的高速公路车道线检测方法①

基于Matlab和优化Hough变换的高速公路车道线检测方法①作者:王诗施贺新升张荣辉胡永举来源:《科技资讯》2011年第08期摘要:基于Matlab的图像处理技术已经成为一种通用的工程设计方法,本文介绍了项目的研究进度,运用多种边缘检测算子对图像进行预处理,并比较其不同效果,通过优化的Hough变换,增强了车道线识别的精确性和适应性。
关键词:工程设计 Matlab软件车道线检测中图分类号:U491 文献标识码:A 文章编号:1672-3791(2011)03(b)-0029-01在交通运输工程领域的研究中,安全问题是重要研究内容之一。
车道偏离预警系统就是考虑到驾驶员在单调的驾驶(如高速公路)或疲劳驾驶中造成车辆的无意识偏离而存在的重大安全隐患,通过报警的方式提醒、辅助驾驶员在安全范围内行驶的系统。
而系统其核心是如何准确及时地识别车道标识线和提取道路边界信息。
很多专家学者对其进行了大量的研究,但由于在实际应用过程中道路信息的复杂多变,如强光照下、弱光照下、带阴影路面等。
用传统的通用处理方法无法满足在实际具体情况下识别的准确性,本课题研究基于具体的强光照条件下的算法,为车道偏离预警系统的完善提供参考。
1 本项目的研究进度根据课题立项和进度安排,本项目研究进度如下:(1)搜集有关车道偏离预警系统的相关资料,深入了解该系统的工作原理和发展现状;(2)学习Matlab软件图像处理的相关知识,研究各种算子的算法原理;(3)选择比较合理的算子对图像进行处理并比较各种算子对图像处理后的最终效果;(4)查找资料研究了解现有的对车道线识别图像处理的研究;(5)运用传统的方法对图像进行处理;发现其中的不足与局限性;(6)进行总结,最后形成论文。
2 Hough变换法识别车道标识线2.1 边缘检测Prewitt算子Prewitt算子如下:f=(f(x,y))-f(x-1,y)-f(x,y-1)Prewitt算子通过以下两个模版实现的:Sobel算子的模版为:由于道路周围有很多树木、建筑、车辆等障碍物且在强光照下,光线对道路信息存在严重破损,因此必须从诸多信息中提取道路标识线。
数字图像处理—Hough变换直线检测,matlab实现

数字图像处理—Hough变换直线检测,matlab实现实验八 Hough变换直线检测一、实验目的理解Hough变换的原理,了解其应用;掌握利用Hough变换进行直线检测的处理过程及编程方法。
二、实验内容利用Hough变换检测直线通常先进行边缘检测,得到只包含边缘的二值图像。
再通过Hough变换,在参数空间检测图像共线点的数量得到直线参数,从而实现直线检测。
1、读入图像(图像需有直线或直线性边缘)2、进行图像边缘,得到二值图像3、实现Hough变换,检测出图像中的直线方程4、输出结果三、实验要求1、编写代码,完成各项实验内容2、总结实验中遇到问题及解决方案,书写实验报告%Hough变换clc;clear;close all f=imread('line.bmp'); %若是彩色图片转灰度化if length(size(f))>2f=rgb2gray(f);end%figure(1)subplot(121);imshow(f); %利用edge函数进行边缘检测j=edge(f,'Sobel');subplot(122);imshow(j); [row,col]=size(j);pinfang=round((row*row+col*col)^0.5);A=zeros(2*pinfang,180);for m=1:rowfor n=1:colif j(m,n)>0for thera=1:180r=thera/180*pi; %角度转弧度rho=round(m*cos(r)+n*sin(r));%ρ=cosθ+sinθrho=rho+pinfang+1;%-l:l转换到1:2l+1A(rho,thera)=A(rho,thera)+1;endendendend[rho,thera]=find(A>40);%交点超过60条线的点,ma,na为参数空间的坐标点nma=length(rho);for i=1:nmahold onm=1:row;%rho=ma(i)-1;r=thera(i)/180*pi;n=(rho(i)-pinfang-m*cos(r))/(0.00001+sin(r));plot(n,m,'r'); end。
数字图像处理报告--图像分割,hough边缘检测直线

实验二、图像分割实验实验目标:掌握图像分割的主流算法。
实验内容:⑴实现边缘检测算法。
⑵实现用Hough变换检测直线的算法。
实验步骤:⑴读入图像。
(设图像中有直线)⑵检测图像边缘⑶实现Hough变换,检测出图像中的直线方程。
⑷输出结果。
实验结果及程序:1.检测图像边缘:①原理:图像边缘是图像最基本的特征,边缘在图像分析中起着重要作用。
所谓边缘是指图像局部特性的不连续性。
灰度或结构等信息的突变处为成为边缘。
边缘是一个区域的结束,也是另一个区域的开始,利用此特征可以分割图像。
边缘检测的实质是采用某种算法来提取出图像中对象与背景间的交界线。
图像灰度的变化情况可以用图像灰度分布的梯度来反映,因此我们可以用局部图像微分技术来获得边缘检测算子。
经典的边缘检测方法是对原始图像中像素的某小邻域来构造检测算子。
拉普拉斯边缘检测算子是基于二阶导数的边缘检测算子,对噪声敏感。
拉普拉斯算子的改进方式是先对图像进行平滑处理,然后再应用二阶倒数的边缘检测算子,其代表是拉普拉斯高斯算子。
②图像边缘检测的程序:I=imread('d.bmp'); %读入原始图像I=rgb2gray(I); %将真彩色图像转化为灰度图像[m,n]=size(I); %确定图片的的长和宽r=m+2; %把图片的长和宽各加2c=n+2;b=zeros(r,c); %定义二维数组b,长、宽比I各多2,成为镜框的尺寸g=zeros(m,n); %定义滤波后的数组d=zeros(3); %定义三阶方阵d,为临时矩阵t=[-1 -1 -1;-1 8 -1;-1 -1 -1]; %定义拉普拉斯算子Result=zeros(3); %定义三阶方阵Result,为运算结果矩阵%原图像矩阵处理,做一个"像框"b(2:m+1,2:n+1)=I; %把原图的矩阵放到新的矩阵b中心,它的第一行、最后一行、第一列、最后一列都是0,即原图矩阵周围有一圈0的边缘,好像给图像加一个像框b(1,:)=b(2,:); %把第二行的值赋给第一行b(r,:)=b(r-1,:); %把倒数第二行的值赋给最后一行b(:,1)=b(:,2); %把第二列的值赋给第一列b(:,c)=b(:,c-1); %把倒数第二列的值赋给最后一列%用拉普拉斯算子进行滤波for i=1:mfor j=1:nd=b(i:i+2,j:j+2); %从b矩阵中依次取出三阶方阵,赋值给临时矩阵dResult=d.*t; %临时矩阵与拉普拉斯算子点乘,赋值给结果矩阵dg(i,j)=sum(sum(Result)); %结果矩阵中"十"字线上元素相加,赋值给输出矩阵中相应的位置,即临时矩阵中心元素所对应的位endendthresh=2.6*mean2(abs(g)); %设定阈值将图像二值化使边缘清晰J=repmat(logical(uint8(0)),m,n); %创建数组J(find(g>thresh))=1; %阈值判断二值化figure,subplot(2,2,1),imshow(I);title('原始图像');%显示原图像subplot(2,2,2),imshow(J); title('拉普拉斯边缘检测后的图像'); %显示拉普拉斯边缘检测后的图像subplot(2,2,3),imshow(g); title('将拉普拉斯边缘检测二值化后的图像')③图像经边缘检测后的MATLAB程序实现效果图如下:2.Hough变换检测直线:①原理:Hough变换用来在图象中查找直线,把直线上点的坐标变换到过点的直线的系数域,通过利用共线和直线相交的关系,使直线的提取问题转化为计数问题。
用matlab实现hough变换的直线检测.

用matlab实现hough变换的直线检测 RGB = imread('fenkuai.bmp';%jaynes-thesis I=rgb2gray(RGB; % 图片用的是灰度图像, [x,y]=size(I; BW=edge(I;figure;imshow(I;title('原图' figure;imshow(BW;title('边缘检测图像'rho_max=floor(sqrt(x^2+y^2+1; %由原图数组坐标算出ρ最大值,并取整数部分加1 %此值作为ρ,θ坐标系ρ最大值 accarray=zeros(rho_max,180; %定义ρ,θ坐标系的数组,初值为0。
%θ的最大值,180度 Theta=[0:pi/180:pi]; %定义θ数组,确定θ取值范围 for n=1:x, for m=1:y if BW(n,m==1 for k=1:180 %将θ值代入hough变换方程,求ρ值 rho=(m*cos(Theta(k+(n*sin(Theta(k; %将ρ值与ρ最大值的和的一半作为ρ的坐标值(数组坐标),这样做是为了防止ρ值出现负数rho_int=round(rho/2+rho_max/2; %在ρθ坐标(数组)中标识点,即计数累加accarray(rho_int,k=accarray(rho_int,k+1; end end end end %figure;colormap gray;%imagesc(accarray;title('hough变换后的图' %xlabel('\theta', ylabel('\rho'; %=====下面程序的显示效果没上面好=====% %accarray=uint8(accarray; %转换后会丢数据%figure;imshow(accarray;title('hough变换后的图' %xlabel('\theta', ylabel('\rho'; %axis on, axis normal, hold on; %=======利用hough变换提取直线======% %寻找100个像素以上的直线在hough变换后形成的点 K=1; %存储数组计数器 forrho_n=1:rho_max %在hough变换后的数组中搜索 for theta_m=1:180 ifaccarray(rho_n,theta_m>=10 %设定直线的最小值。
hough变换提取直线(Matlab实现)

Hough变换提取直线一、实验目标实现用Hough变换检测直线的算法二、实验内容1、读入图像选取有较多直线及部分曲线以作对比的图像作为实验素材,这里我们必须使用彩色图像(有些看似灰度图像的实际属性也是彩色图像),原因下面有详解。
2、检测图像边缘如果一个像素落在图像中某一个物体的边界上,那么它的邻域将成为一个灰度级变化的带。
对这种变化最有用的两个特征是灰度的变化率和方向,他们分别用梯度向量的幅度和方向来表示。
边缘检测算子检查每个像素的邻域并对灰度变化率进行量化,通常也包括方向的确定。
有若干种算子可以使用,大多数是基于方向导数掩模求卷积的方法。
如Roberts算子,Sobel算子,Prewitt算子,Log算子等。
这里采用Log算子提取图像边缘,再用均值滤波去除边缘图像噪声。
3、实现Houg变换,检测出图像中的直线Hough变换是一种利用图像的全局特征将特定形状的边缘连接起来,形成连续平滑边缘的一种方法。
它通过将源图像上的点影射到用于累加的参数空间,实现对已知解析式曲线的识别。
这里先对边缘图像进行二值化处理,然后再用hough变换提取直线,最后用红色标记之。
因为处理过程中需使用灰度图像,但最后无法给灰度图像赋颜色(会出错或效果不好),只能给彩色图像赋颜色,故最初输入时请使用彩色图像。
4、Matlab代码如下:f=imread('3.png');%读入彩色图像,注意不能使用灰度图像o=f; %保留彩色原图f=rgb2gray(f);%将彩色图像转换为灰度图像,f=im2double(f);figure();subplot(2,2,1);imshow(o);title('原图');[m,n]=size(f);%得到图像矩阵行数m,列数nfor i=3:m-2for j=3:n-2%处理领域较大,所以从图像(3,3)开始,在(m-2,n-2)结束l(i,j)=-f(i-2,j)-f(i-1,j-1)-2*f(i-1,j)-f(i-1,j+1)-f(i,j-2)-2*f(i,j-1)+16*f(i,j)-2*f(i,j+1)-f(i,j+2)-f(i+1,j-1)-2*f(i+1,j)-f(i+1,j+1)-f(i+2,j);%LoG算子endendsubplot(2,2,2);imshow(l);title('LoG算子提取图像边缘');[m,n]=size(l);for i=2:m-1for j=2:n-1y(i,j)=l(i-1,j-1)+l(i-1,j)+l(i-1,j+1)+l(i,j-1)+l(i,j)+l(i,j+1)+l( i+1,j-1)+l(i+1,j)+l(i+1,j+1);y(i,j)=y(i,j)/9; %LoG算子提取边缘后,对结果进行均值滤波以去除噪声,为下一步hough变换提取直线作准备endendsubplot(2,2,3);imshow(y);title('均值滤波器处理后')q=im2uint8(y);[m,n]=size(q);for i=1:mfor j=1:nif q(i,j)>80; %设置二值化的阈值为80q(i,j)=255; %对图像进行二值化处理,使图像边缘更加突出清晰elseq(i,j)=0;endendendsubplot(2,2,4);imshow(q);title('二值化处理后');%Hough变换检测直线,使用(a,p)参数空间,a∈[0,180],p∈[0,2d]a=180; %角度的值为0到180度d=round(sqrt(m^2+n^2)); %图像对角线长度为p的最大值s=zeros(a,2*d); %存储每个(a,p)个数z=cell(a,2*d); %用元胞存储每个被检测的点的坐标for i=1:mfor j=1:n%遍历图像每个点if(q(i,j)==255)%只检测图像边缘的白点,其余点不检测for k=1:ap = round(i*cos(pi*k/180)+j*sin(pi*k/180));%对每个点从1到180度遍历一遍,取得经过该点的所有直线的p值(取整) if(p > 0)%若p大于0,则将点存储在(d,2d)空间s(k,d+p)=s(k,d+p)+1;%(a,p)相应的累加器单元加一 z{k,d+p}=[z{k,d+p},[i,j]'];%存储点坐标elseap=abs(p)+1;%若p小于0,则将点存储在(0,d)空间 s(k,ap)=s(k,ap)+1;%(a,p)相应的累加器单元加一z{k,ap}=[z{k,ap},[i,j]'];%存储点坐标endendendendendfor i=1:afor j=1:d*2 %检查每个累加器单元中存储数量if(s(i,j) >70) %将提取直线的阈值设为70lp=z{i,j};%提取对应点坐标for k=1:s(i,j)%对满足阈值条件的累加器单元中(a,p)对应的所有点进行操作o(lp(1,k),lp(2,k),1)=255; %每个点R分量=255,G分量=0,B分量=0o(lp(1,k),lp(2,k),2)=0;o(lp(1,k),lp(2,k),3)=0; %结果为在原图上对满足阈值要求的直线上的点赋红色endendendendfigure,imshow(o);title('hough变换提取直线');5、实验结果附:两个参数的调节1.二值化图像的细节多少可以通过对二值化的阈值调节来控制,阈值越大,细节越少。
matlab 数字图像处理 实验二

实验二基于MATLAB的数字图像处理二改进型数字图像中直线特征的快速检测方法姓名-胡青李班级-信息与计算科学11-1班学号-10114590一、实验目的与要求学会如何将图像中的直线特征快速提取出来的方法,并运用图像的Hough变换及小波变换的基础知识实现改进型数字图像中直线特征的快速检测方法。
二、实验内容及步骤1.Hough变换是对二值图像进行直线检测的有效方法,其实质是对图像进行坐标变换,将图像空间的点映射到参数空间,使变换后的结果便于检测和识别。
图像空间的一条直线l 可以有下式所示的参数方程表示:p=xcosa+ysina (0<=a<=pie)其中,排位坐标原点O到直线l的距离,a为坐标原点到直线l的垂线与x轴正方向的夹角。
根据该式,可以将图像空间中的任意一点(x,y)转换到以p、a为坐标的参数空间。
先将参数空间量化成m*n个累加单元,并将每个累加单元的初始值设为0。
对于图像空间的每一个非零点在角度参数的每个区间内根据公式计算方向的长度,并将对应参数空间的累加单元加1。
最后统计参数空间中所有累加单元的值,大于阈值的累加单元所对应的长度和角度的值便是图像空间内直线的参数。
2、小波变换是一种时频分析方法,具有多变分析功能,被誉为“数字放大镜”。
改进的直线检测算法步骤示意图小波提升实现步骤:改进的Hough变换具体实现步骤:三、实验结果1.Rgb2gray和im2bw的使用。
2、改进型数字图像中直线特征的快速检测四、实验小结1、运用Hough变换来检测直线具有较强的鲁棒性,可以有效的排除噪声的干扰和解决图像经过二值化后线条出现的间断现象,但其运算量过大,占用内存多。
2、鲁棒性是指控制系统在一定(结构,大小)的参数摄动下,维持其它某些性能的特性。
3、通过实验实验结果可以知道,直线检测确实可以检测出图片中的直线,因此可以被广泛的应用于基于机器视觉的目标检测中。
4、小波提升和改进型Hough相结合,可以有效的抑制高频噪声,提高数字图像中想直线的检测速率;改进了基于Hough变换检测直线的原理,按照从局部到整体的检测顺序,将二值化后图像空间中非零点映射到参数空间中具有较大存在概率的累加单元,而不是所有可能的累加单元。
基于边缘检测与Hough变换的车道线检测

基于边缘检测与Hough变换的车道线检测摘要随着道路交通的快速发展和汽车保有量的日益剧增,交通安全引起了社会的普遍关注。
统计表明,许多的交通事故是由司机疏忽或疲劳驾驶引起的。
而汽车辅助驾驶系统正是被设计用来在车辆将要驶离车道或者发生碰撞时警告司机,从而帮助司机安全驾驶,避免交通事故的发生。
车道线的检测识别正是实现这一功能的关键技术。
本文对车道线检测识别进行了深入的研究。
首先,介绍了基于边缘检测和Hough变换的车道线检测这一课题的研究背景和意义,综述了该课题的国内外研究现状,并进行了简要分析。
第二,介绍了本课题编程所需要的工具—MATLAB,并简要的介绍了MATLAB的两大特点。
第三,介绍图像预处理。
该模块包括图像灰度化,图像滤波,边缘检测等相关技术,且对每一种技术所包含的常用方法都做了实验进行对比,并选择出了合适的方法(图像滤波选用中值滤波,边缘检测选用自定义差分算子)。
第四,简绍了Hough变换的原理,使用Hough提取并标记车道线。
最后,对本文进行了总结,并提出不足之处,总的来说,本文算法能够有效提取车道线,具有较好的鲁棒性。
关键词车道线检测 MATLAB 图像灰度化边缘检测 Hough变换Lane Line Detection based on edge detection And Hough transformAbstract With the rapid development of road traffic and the increasingly explosion in auto inventory, traffic safety has aroused widespread concern. Statistics show that most of traffic accidents caused by drivers drowsiness, inattentiveness. Driver assistance systems is the design used to be warning the driver when the vehicle leaving the lane or a collision, so it can help to avoid traffic accidents. The real-time lane detection and navigation system is also an essential module of the driver assistance and warning system. This paper is focus on lane detection and departure based on machine vision. Firstly, the thesis introduces the background and significance about the lane detection based on Edge detection and Hough Transform, and then the research status of the thesis topic is reviewed. Finally, it makes a brief analysis.Secondly, this paper describes the tools required for programming- -MATLAB, and makes a brief introduction to the two features of MATLABThirdly, the thesis describe the technology related to image pre-processing module such as image gray, image filtering, edge Detection. And the common methods for each technology included have done experiments to compare and select a suitable method (Selecting median filtering to filter image; Selecting custom difference operator filtering to make edge detection).Fourthly, making a brief introduction of principle of Hough transform and using Hough to extract the lane marker.Finally, conclusions are given with recommendation for future work. Overall, the proposed algorithm can effectively extract the lane, with better robustness.Keywords:Lane detection Edge detection image grey Hough transform MATLAB目录第一章绪论 (1)1.1 研究意义及背景 (1)1.2 国内外技术发展状况 (2)1.2.1国外车道偏离报警系统 (2)1.2.2 国内车道偏离预警系统 (3)1.3 本文主要研究内容 (4)第二章 MATLAB简介 (5)2.1 MATLAB的语言特点 (5)2.2 MATLAB的技术特点: (6)第三章道路图像预处理 (9)3.1 道路图像灰度化 (9)3.2 道路图像滤波 (11)3.3 图像边缘检测 (12)3.3.1 Robert算子 (13)3.3.2 Prewitt算子 (14)3.3.3 Sobel算子 (14)3.3.4 Canny算子 (16)3.3.5自定义差分算子 (17)3.4 本章小结 (18)第四章车道线检测的算法设计 (19)4.1 道路图像检测的常用方法 (19)4.2 基于Hough变换的车道线检测 (21)4.2.1 Hough变换原理 (21)4.2.2 Hough变换提取车道线 (23)4.3 本章小结 (25)结论 (26)1. 论文的主要研究工作 (26)2. 论文需要改进的地方及对后续工作的展望 (26)参考文献: (28)致谢 (30)附录 (31)第一章绪论1.1 研究意义及背景高速公路的通行里程是一个国家发展水平的重要标志之一。
hough变换检测曲线的原理matlab

Hough变换是一种常用于检测曲线、直线等几何形状的图像处理算法。
其原理是利用数学变换将图像空间中的像素点映射到参数空间中,从而使得在参数空间中的形状更加容易被检测出来。
在matlab中,可以通过使用内置的hough函数来实现Hough变换,下面将介绍Hough变换检测曲线的原理以及在matlab中的实现步骤。
一、Hough变换检测曲线的原理1. 直线检测原理Hough变换最常用于检测直线,在直线检测中,我们需要将图像空间中的像素点映射到参数空间中,其中直线的参数表示为(r,θ),其中r表示直线与图像原点的距离,θ表示直线与x轴的夹角。
对于图像空间中的每一个边缘点,我们可以通过一定的计算得到其对应的参数空间中的曲线,然后通过计数器来统计每条直线曲线上的交点数,最终可以得到图像中的直线。
2. 曲线检测原理除了直线检测,Hough变换也可以用于检测曲线。
在曲线检测中,我们需要使用更复杂的参数表示来描述曲线,常见的参数表示方法包括极径-极角表示、直角坐标-曲率表示等。
同样地,通过将图像空间中的像素点映射到参数空间中,并进行统计计数,最终可以得到图像中的曲线。
二、在matlab中实现Hough变换检测曲线的步骤1. 读取图像我们需要使用matlab内置的imread函数来读取待处理的图像,将其转换为灰度图像,并进行边缘检测,以便后续的Hough变换处理。
2. Hough变换通过使用matlab内置的hough函数,可以对边缘图像进行Hough变换处理,得到参数空间中的曲线信息。
在使用hough函数时,需要设置合适的参数,包括极坐标参数的取值范围、极坐标参数空间的分辨率等。
3. 边缘检测从Hough变换的结果中,我们可以得到曲线在参数空间中的曲线,通过进一步的处理和阈值设定,可以将曲线的交点进行统计并筛选出来。
4. 反变换通过对参数空间中的曲线进行反变换,可以将得到的曲线参数转换回图像空间中的曲线,从而在原始图像中标出检测到的曲线。
边缘检测与Hough变换实验报告Matlab

边缘检测与Hough变换实验目的:写一段代码实现一幅图像,其中分为以下两个步骤1.使用Matlab中的canny算子进行边缘检测,可以让使用者交互式的输入不同的Sigma的值实现边缘检测。
2.运用Hough变换来找到最突出的边缘,在图像中找到并画出最长的直线。
实验原理:canny算子边缘检测的基本原理是:采用二维高斯函数的任一方向上的一阶方向导数为噪声滤波器,通过与图像f(x,y)卷积进行滤波,然后对滤波后的图像寻找图像梯度的局部极大值,以确定图像边缘。
Canny边缘检测算子是一种最优边缘检测算子。
其实现步骤如下:1)用高斯滤波器平滑图像2)计算滤波后图像梯度的幅值和方向3)对梯度幅值应用非极大值抑制,其过程为找出图像梯度中的局部极大值点,把其他非局部极大值置零,以得到细化的边缘;4)再用双阈值算法检测和连接边缘;使用canny算子的edge函数调用格式为BW=edge(I,'canny');BW=edge(I,'canny',thresh,sigma);BW=edge(I,'canny',thresh);[BW,threshold]=edge(I,'canny',…);2.Hough变换时最常用的直线提取方法,它的基本思想是:将直线上每一个数据点变换为参数平面中的一条直线或曲线,利用共线的数据点对应的参数曲线相交于参数空间中一点的关系,使得直线提取问题转化为计数问题。
Hough变换提取直线的主要优点是受直线中的间隙和噪声影响较小。
Hough检测直线的Matlab实现:在Matlab图像处理工具箱中提供了3个与Hough变换有关的函数,分别为hough函数,houghpeaks函数和houghlines函数。
hough函数的调用格式为[H,theta,rho]=hough(BW);其中BW为二值图像,H为Hough变换矩阵,theta为变换轴间隔θ,rho为元素个数。
Houghpeaks函数是用来提取Hough变换后参数平面上的峰值点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
边缘检测与Hough变换
实验目的:写一段代码实现一幅图像,其中分为以下两个步骤
1.使用Matlab中的canny算子进行边缘检测,可以让使用者交互式的输入不
同的Sigma的值实现边缘检测。
2.运用Hough变换来找到最突出的边缘,在图像中找到并画出最长的直线。
实验原理:
canny算子边缘检测的基本原理是:采用二维高斯函数的任一方向上的一阶方向
导数为噪声滤波器,通过与图像f(x,y)卷积进行滤波,然后对滤波后的图像
寻找图像梯度的局部极大值,以确定图像边缘。
Canny边缘检测算子是一种最优边缘检测算子。
其实现步骤如下:
1)用高斯滤波器平滑图像
2)计算滤波后图像梯度的幅值和方向
3)对梯度幅值应用非极大值抑制,其过程为找出图像梯度中的局部极大值点,把其他非局部极大值置零,以得到细化的边缘;
4)再用双阈值算法检测和连接边缘;
使用canny算子的edge函数调用格式为
BW=edge(I,'canny');
BW=edge(I,'canny',thresh,sigma);
BW=edge(I,'canny',thresh);
[BW,threshold]=edge(I,'canny',…);
2.Hough变换时最常用的直线提取方法,它的基本思想是:将直线上每一个
数据点变换为参数平面中的一条直线或曲线,利用共线的数据点对应的参数
曲线相交于参数空间中一点的关系,使得直线提取问题转化为计数问题。
Hough变换提取直线的主要优点是受直线中的间隙和噪声影响较小。
Hough检测直线的Matlab实现:在Matlab图像处理工具箱中提供了3个与
Hough变换有关的函数,分别为hough函数,houghpeaks函数和houghlines
函数。
hough函数的调用格式为[H,theta,rho]=hough(BW);其中BW为二值图像,
H为Hough变换矩阵,theta为变换轴间隔θ,rho为元素个数。
Houghpeaks函数是用来提取Hough变换后参数平面上的峰值点。
其调用格
式为peaks=houghpeaks(H,numpeaks),其中,H为Hough函数的输出,参数平
面的技术结果矩阵,参数numpeaks为指定要提取的峰值数目,默认值为1;
输出参数peaks为Q*2维峰值位置矩阵,其中Q为提取的峰值数目,peaks
的第q行分别存储第q个峰值的行和列坐标。
Hough函数用于在图像中提取参数平面上的峰值点对应的直线。
其调用格
式为lines=houghlines(BW,theta,rho,peaks)
Lines=houghlines(…,param1,val1,param2,val2)
其中,BW与Hough函数的BW相同,为二值图象。
theta和rho为hough函
数返回的输出,指示θ轴和ρ轴各个单元对应的值。
Peaks为houghpeaks函
数返回的输出,指示峰值的行和列坐标,houghlines函数将根据这些峰值提
取直线。
Param和val是参数对,用于指定是否合并或保留直线段的相关参
数,其取值有两种。
当param=’MinLength’时,bal指定合并后的直线被保留
的门限长度,长度小于val的直线被舍去。
当param=’FillGap’时,val指定直
线段被合并的门限间隔。
如果两条斜率和截距均相同的直线段间隔小于val
给点的值,则它们被合并为一条直线。
实验程序与实验结果如下:
%canny算子边缘检测
clear all;
I1=imread('F:\robot\Images\sniper.jpg');
I=rgb2gray(I1);% 彩色图像灰度化
imshow(I1);
title('原始图像');
BW1= edge(I,'Canny',0.4,0.5) ; %edge调用Canny为检测算子判别阈值为0.5 figure,imshow(BW1);
title( '阈值为0.4,sigma值为0.5的Canny算子边缘检测图像');
BW2= edge(I,'Canny',0.4,0.8) ; %edge调用Canny为检测算子判别阈值为0.8 figure,imshow(BW2);
title( '阈值为0.4,sigma值为0.8的Canny算子边缘检测图像');
BW20= edge(I,'Canny',0.4,1) ; %edge调用Canny为检测算子判别阈值为1 figure,imshow(BW20);
title( '阈值为0.4,sigma值为1的Canny算子边缘检测图像');
BW21= edge(I,'Canny',0.4,1.5) ; %edge调用Canny为检测算子判别阈值为1.5 figure,imshow(BW21);
title( '阈值为0.4,sigma值为1.5的Canny算子边缘检测图像');
BW22= edge(I,'Canny',0.4,2) ; %edge调用Canny为检测算子判别阈值为2 figure,imshow(BW22);
title( '阈值为0.4,sigma值为2的Canny算子边缘检测图像');
%Hough变换检测直线程序
rotI=I;
BW=edge(rotI,'canny',0.4,1.5); %用canny算子提取图像边缘
[H,T,R]=hough(BW); %对图像进行Hough变换
figure;
imshow(H,[ ],'XData',T,'YData',R,...
'InitialMagnification','fit');
title('峰值提取效果');
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',58,'MinLength',5);
figure,imshow(BW),
title('直线标记结果');
hold on
max_len=0;
for k=1:length(lines)
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');
%计算直线边缘长度
len=norm(lines(k).point1-lines(k).point2);
if(len>max_len)
max_len=len;
xy_long=xy;
end
end
plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','r');
程序结果:
Hough检测直线结果:
人机交互的实现:
使用Matlab的GUI,可以让使用者输入不同的Sigma值得到不同的边缘检测效果。
创建gui的人机交互界面,如下图
然后将代码导入相应的按钮所对应的函数中,
运行后如下图:
点击显示“原始图像”按钮,输入Sigma值为1.5,点击“显示边缘检测后的图像”按钮,和“显示标记最长直线图像”的按钮,显示结果如下:。