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

合集下载
  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;

相关文档
最新文档