边缘检测与Hough变换实验报告----Matlab

合集下载

边缘检测MATLAB

边缘检测MATLAB

一、图像分割概述图像分割一般采用的方法有边缘检测(edge detection)、边界跟踪(edge tracing)、区域生长(region growing)、区域分离和聚合等。

图像分割算法一般基于图像灰度值的不连续性或其相似性。

不连续性是基于图像灰度的不连续变化分割图像,如针对图像的边缘有边缘检测、边界跟踪等算法。

相似性是依据事先制定的准则将图像分割为相似的区域,如阈值分割、区域生长等。

二、边缘检测图像的边缘点是指图像中周围像素灰度有阶跃变化或屋顶变化的那些像素点,即灰度值导数较大或极大的地方。

边缘检测可以大幅度的减少数据量,并且剔除不相关信息,保留图像重要的结构属性。

边缘检测基本步骤:平滑滤波、锐化滤波、边缘判定、边缘连接。

说明:垂直于边缘的走向,像素值变化比较明显,可能呈现阶跃状,也可能呈现屋顶状。

因此,边缘可以分为两种:一种为阶跃性边缘,它两边的像素灰度值有着明显的不同;另一种为屋顶状边缘,它位于灰度值从增加到减少的变化转折点。

对于阶跃性边缘,二阶方向导数在边缘处呈现零交叉;对于屋顶状边缘,二阶方向导数在边缘处取极值。

三、边缘检测算法:•基于一阶导数:Roberts算子、Sobel算子、Prewitt算子•基于二阶导数:高斯-拉普拉斯边缘检测算子•Canny边缘检测算法四、matlab实现1)基于梯度算子(一阶导数)的边缘检测BW=edge(I,type,thresh,direction,’nothinning’)thresh是敏感度阈值参数,任何灰度值低于此阈值的边缘将不会被检测到。

默认值为空矩阵[],此时算法自动计算阈值。

direction指定了我们感兴趣的边缘方向,edge函数将只检测direction中指定方向的边缘,其合法值如下:可选参数’nothinning’,指定时可以通过跳过边缘细化算法来加快算法运行的速度。

默认是’thinning’,即进行边缘细化。

2)基于高斯-拉普拉斯算子(三阶导数)的边缘检测BW=edge(I,’log’,thresh,sigma)sigma指定生成高斯滤波器所使用的标准差。

Hough变换在物体边缘检测上的应用

Hough变换在物体边缘检测上的应用

引言在现代工业自动化生产中,涉及到各种各样的检查、测量和零件识别应用,如:大型工件平行度和垂直度测量、机械零件的自动识别分类和几何尺寸测量等,基于图像处理的检测方法具有非接触、效率高的特点,为取代繁复的人工劳动提供了可能[1]。

随着计算机软硬件及图像处理理论的发展,此类系统在工业在线质量检测的各个领域正得到广泛的应用。

边缘是图像上一个物体区别于其他物体最基本的特征,如何从图像中得到这些特征边界是非常重要的[2]。

图像中人造目标显著的边缘特征为识别它提供了帮助,需要相应的算法来有效地发现这些边界并加以描述。

人造目标具有规律的边缘较多,也多为直线、圆,具有描述比较简单的特征。

获取表征图像的关系可以减少物体模型匹配的搜索空间,而霍夫变换是一种可以将图像的特征点映射至参数空间,从而获取图像特征点关系的方法[3]。

在某些应用中对边缘的定位精度要求较高,并希望能较好地表征这些边界,Hough变换具有存储空间大、计算时间长的特点,此特点随检测精度的提高而显突出,影响在线检测实时性的要求,在需要给出边缘的精确描述的场合,如在测量机械零件的几何尺寸时,能不能在提高精度的同时,减少检测时间?本文为此作了一些研究。

Hough变换在物体边缘检测上的应用张永忠 朱英 桂林电子工业学院计算机系 5410041Hough变换原理和实现1.1 Hough变换机理Hough变换最初是由P.V.C.Hough根据数学对偶性原理提出的,其基本思想是这样的:对于x-y平面坐标系上的一条直线l:y=kx+b可以用两个参数(θ和ρ)来描述,如图1所示,ρ表示原点到直线的垂直距离,θ表示该垂线与X轴的夹角。

它的参数方程为:ρ=xcosθ+ysinθ,此方程是成立的,它实际上可认为是斜截式的变形,对于某一点P(x,y),此时在ρ-θ坐标系上是一正弦曲线,可以断定:直线l上不同的点在参数空间中被变换为一族相交于一点的正弦曲线。

由于正弦曲线的周期性,此交点在(0<=θ<180)范围内唯一,对于某一共线性好的点集,如能在(θ,ρ)参数空间找出这一点,就能确定表征直线的方程了。

边缘检测matlab实验报告

边缘检测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边缘检测代码接霍夫变换-概述说明以及解释

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变换检测直线原理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边缘检测代码接霍夫变换

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'函数来计算霍夫变换的极坐标空间。

数字图像处理—Hough变换直线检测,matlab实现

数字图像处理—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变换检测直线的算法。

实验步骤:⑴读入图像。

(设图像中有直线)⑵检测图像边缘⑶实现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变换的直线检测.

用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 %设定直线的最小值。

matlab hough变换

matlab hough变换

matlab hough变换
Hough变换是一种图像处理技术,用于检测形状的特定模式,如直线、圆或椭圆。

Hough变换是一种基于数学算法的变换,用于将图像转换为参数空间,并在参数空间中查找由原始图像中的点组成的模式。

然后,可以从参数空间中恢复原始的模式。

在matlab中,Hough变换可以通过hough函数实现。

它需要一个二值图像作为输入,该图像中白色像素表示待检测的模式,黑色像素表示背景。

Hough函数将返回一个二维矩阵H,其中每个单元格表示了直线通过该点的数量。

这个矩阵可以通过调用imshow函数进行可视化。

接下来,可以使用houghpeaks函数来查找H矩阵中的峰值。

峰值表示在给定参数下被多次检测到的模式。

houghpeaks函数需要指定最大峰数和最小峰距离等参数,以控制寻找峰值的过程。

最后,在找到峰值之后,可以使用houghlines函数来提取原始图像中检测到的直线。

houghlines函数需要指定H矩阵、峰值位置和可选的阈值参数,以确定提取直线的位置。

总的来说,Hough变换是一种非常有用的图像处理技术,可以用于检测和提取各种模式,特别是形状的模式。

MATLAB中的Hough变换函数使其易于使用和实施。

hough变换提取直线(Matlab实现)

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.二值化图像的细节多少可以通过对二值化的阈值调节来控制,阈值越大,细节越少。

基于边缘检测与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变换是一种常用于检测曲线、直线等几何形状的图像处理算法。

其原理是利用数学变换将图像空间中的像素点映射到参数空间中,从而使得在参数空间中的形状更加容易被检测出来。

在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. 反变换通过对参数空间中的曲线进行反变换,可以将得到的曲线参数转换回图像空间中的曲线,从而在原始图像中标出检测到的曲线。

matlab实验报告实验二

matlab实验报告实验二

matlab实验报告实验二Matlab实验报告实验二引言Matlab是一种功能强大的数学软件,广泛应用于科学研究和工程实践中。

在实验二中,我们将探索Matlab的图像处理功能,并通过实际案例来展示其应用。

图像处理基础图像处理是指对图像进行数字化处理的过程,其目的是改善图像质量、提取有用信息或实现特定的应用需求。

在Matlab中,我们可以利用各种函数和工具箱来实现图像处理的各种任务,如图像增强、滤波、分割和特征提取等。

实验步骤1. 图像读取与显示在Matlab中,我们可以使用imread函数读取图像文件,并使用imshow函数将图像显示在屏幕上。

例如,我们可以读取一张名为"lena.jpg"的图像,并显示出来:```matlabimg = imread('lena.jpg');imshow(img);```2. 图像灰度化图像灰度化是将彩色图像转换为灰度图像的过程。

在Matlab中,我们可以使用rgb2gray函数将彩色图像转换为灰度图像。

例如,我们可以将上一步读取的图像转换为灰度图像:```matlabgray_img = rgb2gray(img);imshow(gray_img);```3. 图像二值化图像二值化是将灰度图像转换为二值图像的过程,其中只包含黑色和白色两种颜色。

在Matlab中,我们可以使用imbinarize函数将灰度图像二值化。

例如,我们可以将上一步得到的灰度图像二值化:```matlabbinary_img = imbinarize(gray_img);imshow(binary_img);```4. 图像平滑图像平滑是指去除图像中的噪声或细节,使得图像更加平滑和清晰。

在Matlab 中,我们可以使用imfilter函数对图像进行平滑处理。

例如,我们可以对上一步得到的二值图像进行平滑处理:```matlabsmooth_img = imfilter(binary_img, fspecial('average'));imshow(smooth_img);```5. 图像边缘检测图像边缘检测是指提取图像中物体边缘的过程,常用于目标检测和图像分割。

matlab霍夫变换(hough)检测直线

matlab霍夫变换(hough)检测直线

matlab霍夫变换(hough)检测直线 霍夫变换是⼀种特征检测(feature extraction),被⼴泛应⽤在图像分析(image analysis)、电脑视觉 (computer vision)以及数位影像处理 (digital image processing)。

霍夫变换是⽤来辨别找出物件中的特征,例如:线条。

他的算法流程⼤致如下,给定⼀个物件、要辨别的形状的种类,算法会在参数空间(parameter space)中执⾏投票来决定物体的形状,⽽这是由累加空间(accumulator space)⾥的局部最⼤值(local maximum)来决定。

Hough变换的基本原理在于,利⽤点与线的对偶性,将图像空间的线条变为参数空间的聚集点,从⽽检测给定图像是否存在给定性质的曲线。

clc;clear ; closeset(0,'defaultfigurecolor',[1,1,1])load DATA2.matdata = D1;BW = data;figure(1)imshow(BW)title('原图像');figure(2)subplot 211;%%进⾏霍夫变换[H, theta , rho] = hough (BW);%%绘制霍夫空间imshow(imadjust(mat2gray(H)),[],'XData',theta,'YData',rho,...'InitialMagnification','fit');xlabel('\theta (degrees)'), ylabel('\rho');axis on, axis normal, hold on;colormap(hot);title('霍夫空间')%%峰值P = houghpeaks(H,5,'threshold',0.5*max(H(:)));x = theta(P(:,2));y = rho(P(:,1));plot(x,y,'s','color','black');%lines = houghlines(BW,theta,rho,P,'FillGap',10,'MinLength',10);lines = houghlines(BW,theta,rho,P,'FillGap',10,'MinLength',10);subplot 212imshow(BW) ,hold onmax_len = 0;count = 1;points = zeros(2,2);for k = 1:length(lines)points(count,1) = lines(k).point1(1);points(count,2) = lines(k).point1(2);count =count +1;points(count,1) = lines(k).point2(1);points(count,2) = lines(k).point2(2);count =count +1;xy = [lines(k).point1; lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');% Plot beginnings and ends of linesplot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');endtitle('直线检测'); 效果如下:。

边缘检测试验报告

边缘检测试验报告

边缘检测试验一、实验目的1.进一步理解边缘检测的基本原理。

2.掌握对图像边缘检测的基本方法。

3.学习利用Matlab图像工具箱对图像进行边缘检测。

二、实验原理图像边缘检测大幅度地减少了数据量,并且剔除了可以认为不相关的信息,保留了图像重要的结构属性。

有许多方法用于边缘检测,它们的绝大部分可以划分为两类:基于查找一类和基于零穿越的一类。

基于查找的方法通过寻找图像一阶导数中的最大和最小值来检测边界,通常是将边界定位在梯度最大的方向。

三、实验预习在实验前先编码,编码如下:close allclear allI=imread('wamp.jpg'); %读取图像I1=im2double(I); %将彩图序列变成双精度I2=rgb2gray(I1); %将彩色图变成灰色图[thr, sorh, keepapp]=ddencmp('den','wv',I2);I3=wdencmp('gbl',I2,'sym4',2,thr,sorh,keepapp); %小波除噪I4=medfilt2(I3,[9 9]); %中值滤波I5=imresize(I4,0.2,'bicubic'); %图像大小BW1=edge(I5,'sobel'); %sobel图像边缘提取BW2=edge(I5,'roberts'); %roberts图像边缘提取BW3=edge(I5,'prewitt'); %prewitt图像边缘提取BW4=edge(I5,'log'); %log图像边缘提取BW5=edge(I5,'canny'); %canny图像边缘提取h=fspecial('gaussian',5); %高斯滤波BW6=edge(I5,'zerocross',[ ],h); %zerocross图像边缘提取figure;subplot(2,3,1); %图划分为一行三幅图,第一幅图imshow(I2); %绘图subplot(2,3,2);imshow(BW1);title('Sobel算子');subplot(2,3,3);imshow(BW2);title('Roberts算子');subplot(2,3,4);imshow(BW3);title('Prewitt算子');subplot(2,3,5);imshow(BW4);title('log算子');subplot(2,3,6);imshow(BW5);title('canny算子');四、实验步骤1.打开MATLAB软件;2.利用MATLAB图像工具箱中已有函数进行图像的边缘检测;3.显示原图和处理过的图像。

利用Matlab进行图像分割与边缘检测的实践方法

利用Matlab进行图像分割与边缘检测的实践方法

利用Matlab进行图像分割与边缘检测的实践方法图像分割和边缘检测是计算机视觉领域中非常重要的任务,它们在图像处理和分析中有着广泛的应用。

Matlab作为一种强大的科学计算工具,提供了丰富的图像处理函数和工具箱,可以帮助我们进行图像分割和边缘检测的实践。

本文将介绍利用Matlab进行图像分割和边缘检测的一些实践方法。

一、图像分割方法1. 阈值分割阈值分割是最常用的图像分割方法之一,它通过选取适当的阈值将图像中的不同区域分割开来。

在Matlab中,可以使用graythresh函数来自动选择合适的阈值。

例如,对于灰度图像I,可以使用以下代码进行阈值分割:```level = graythresh(I);BW = im2bw(I, level);```这里level是选取的阈值,BW是二值化后的图像。

2. 区域生长区域生长算法是一种基于像素相似性的图像分割方法,它从种子点出发,通过合并与种子点相似的像素,逐渐扩展出一个区域。

Matlab中提供了regiongrowing 函数,可以用于实现区域生长算法。

例如,对于灰度图像I,可以使用以下代码进行区域生长分割:```seed = [x, y]; % 种子点位置BW = regiongrowing(I, seed);```这里seed是种子点的位置,BW是分割得到的区域。

3. 水平线分割水平线分割是一种特殊的图像分割方法,适用于包含水平线结构的图像。

在Matlab中,可以使用hough函数进行直线检测,然后根据检测结果进行分割。

例如,对于二值化的图像BW,可以使用以下代码进行水平线分割:```[H, T, R] = hough(BW);P = houghpeaks(H, 10);lines = houghlines(BW, T, R, P);BW_separate = false(size(BW));for k = 1 : length(lines)xy = [lines(k).point1; lines(k).point2];xy(:, 2) = max(min(xy(:, 2), size(BW, 1)), 1); % 限制线段在图像范围内indices = sub2ind(size(BW), xy(:, 2), xy(:, 1));BW_separate(indices) = true;end```这里H是Hough变换的结果,T和R是Hough变换的参数,P是峰值点的位置,lines是检测到的直线数据结构,BW_separate是分割得到的区域。

边缘检测算子的边缘提取及Hough变换

边缘检测算子的边缘提取及Hough变换

题目边缘检测算子的边缘提取及Hough变换学院:信息科学与技术学院专业:控制科学与工程学生:X X指导教师:XXX2014 年12月14日1、边缘检测算子简介图像边缘(或边沿)是指周围像素灰度有阶跃性变化或“屋顶”变化的那些像素的集合。

在图像处理中通过边缘算子能够较好的提取出数字图像的边缘,常用的边缘检测算子主要分为以下几类:一、基于一阶导数的边缘检测算子包括Roberts算子、Sobel算子、Prewitt算子、Kirsch算子等,在算法实现过程中,通过2x2(Roberts算子)或者3x3模板作为核与图像中的每个像素点做卷积和运算,然后选取合适的阈值以提取边缘。

二、基于二阶导数的边缘检测算子,该算子对噪声敏感。

一种是二阶微分的拉普拉斯边缘检测算子,另一种改进方式是先对图像进行平滑处理,然后再应用二阶导数的边缘检测算子,其代表是LOG算子。

前边介绍的边缘检测算子法是基于微分方法的,其依据是图像的边缘对应一阶导数的极大值点和二阶导数的过零点。

三、Canny边缘检测算子,它不是通过微分算子检测边缘,而是在满足一定约束条件下推导出的边缘检测最优化算子。

2、不同边缘算子检测边缘分析本文基于Matlab编程实现不同边缘检测算子对一幅包含两个目标的图像进行边缘提取,原始图像如图2.1所示。

Roberts边缘检测算子是一种利用局部差分方法寻找边缘的算子,其采用的是对角方向相邻两像素值之差;Sobel边缘算子所采用的算法是先进行加权平均,然后进行微分运算;Prewitt边缘检测算子就是一种利用局部差分平均方法寻找边缘的算子,其先求平均,再求差分,即利用所谓的平均差分来求梯度;拉普拉斯边缘检测算子正是对二维函数进行二阶导数运算的标量算子;Canny边缘检测算子通过中心边缘点为算子与图像的卷积在边缘梯度方向上的区域中的最大值在梯度方向上判断此点强度是否为其领域的最大值来确定该点是否为边缘点。

图2.1 原始图像2.1 Roberts算子提取边缘图像图2.2 Roberts算子边缘检测图像2.2 Sobel算子提取边缘图像图2.3 Sobel算子边缘检测图像2.3 Prewitt算子提取边缘图像图2.4 Prewitt算子边缘检测图像2.4 Laplace算子提取边缘图像图2.5 Laplace算子边缘检测图像2.5 Log算子提取边缘图像图2.6 Log算子边缘检测图像2.6 Canny算子提取边缘图像图2.7 Canny算子边缘检测图像3、Hough变换的边缘提取Hough变换利用图像空间和参数空间的点-线对偶性,将图像空间中具有一定关系的像素点在参数空间中进行聚集,通过在参数空间进行简单的累加和统计,找出参数空间中累加器的峰值点,进而确定出图像空间中特定几何特征的相关参数。

Hough变换在物体边缘检测上的应用

Hough变换在物体边缘检测上的应用
维普资讯
H u h变 { og
在物体边缘检测 上的应用
张永忠 朱英 桂林 电子工业学院计算机系 5 10 4 04
1 og 变 换原 理 和实现 uh H
研 竞 № g 变接应 J于船 体遵 桀的精确 定位 I 橹 n f l
为 了在提高精 度的 『 , . 节约时 时 卫 间,可以采用两次检铡 ,第 一 次垒局榆 删, 量化步 I睾 火. 乏 变 大致确定直线的位置 第 救在第 次 所确 定的 参数空 点f 0. p 的附近局部空间,细f 量化步 长,这样 ) £ 能有效地减少系统开销( 存储空 间. 节约 缩 短运算时 间) .提高直线的楂删精 度

和挺 取 :H 童挟 吴有 存储 l 闸 太、计 算 o u 宣 砷 闸 长的特点 ,砧特 . 燕道接 触精 度 的提 高 而
量 突出 , 盘中坤 此算 法 l盘 用违 抒 改进 , 采 柏 用 两如 硷刹 法 , 蓐一睫 奎局 格 删 , 荨 次 在 二 第 班 哪碍 的直 袭 婶捍碱 范强连 行 .蛔 他特 一
3实 验
在研究过程 巾我 们拍取 了一些机械零 件的 数码 图像进 行实验 ,选 取的机 械零 件为长方 矩形状 , 其边 为 直线 ,有一定 的 代表性 .见圈 ! 所示 。 往对采 集到 的图像进 行相 应的预处理 后 得到 其二值 幽像 ,然 后 获取盥 中零件 的 边缘 点巢 , 见图 3 所示 + 由= 设 备 、 『 : 环 境等 I 起的噪 声 ,点 集里 的点 垒托 : 条直线 或 多或 少有屿 偏离法椎 控抒 提 高齄 刊精
度, 节约轻州 时柳。
l I Iu h变换 机理 fo g Huh o g 变换最初是f p V. H u h l . C. o g 根 i 据数学对偶性原理提出的 ,其基本思想是 这样的:对干 x y牛面坐标 系上的 条 直 — 线 I k b可以用两个 参数f 和 口 来 :Y x— 0 ) 描述 , 如 1 昕示,p 示原点列 直线的垂 表 直距离 . 0表示 陵唾线与x轴的必角。 它的

边缘检测与Hough变换实验报告Matlab

边缘检测与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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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');
程序结果:。

相关文档
最新文档