实现用Hough变换检测直线的算法Word文档格式.docx

上传人:b****5 文档编号:16254025 上传时间:2022-11-22 格式:DOCX 页数:14 大小:633.42KB
下载 相关 举报
实现用Hough变换检测直线的算法Word文档格式.docx_第1页
第1页 / 共14页
实现用Hough变换检测直线的算法Word文档格式.docx_第2页
第2页 / 共14页
实现用Hough变换检测直线的算法Word文档格式.docx_第3页
第3页 / 共14页
实现用Hough变换检测直线的算法Word文档格式.docx_第4页
第4页 / 共14页
实现用Hough变换检测直线的算法Word文档格式.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

实现用Hough变换检测直线的算法Word文档格式.docx

《实现用Hough变换检测直线的算法Word文档格式.docx》由会员分享,可在线阅读,更多相关《实现用Hough变换检测直线的算法Word文档格式.docx(14页珍藏版)》请在冰豆网上搜索。

实现用Hough变换检测直线的算法Word文档格式.docx

~180°

由直线极坐标方程可知:

(3-1)

(3-2)

所以当且仅当x和y都达到最大且θ+Φ=±

90°

时(根据<

来调整θ的值)

(3-3)

即ρ取值范围

由θ、ρ的取值范围和它们的分辨率就可以确定累加器的大小,从而检测直线。

利用Hough变换检测图像中直线的一般步骤应该首先对图像进行二值化,然后进行边缘检测,接着对边缘检测的结果作Hough变换,最后得到直线检测结果。

为了简便,算法主要针对图像的Hough变换,所以输入图像采用二值边缘图,具体算法步骤如下:

(1)读入一幅256级灰度图(虽然是256级灰度,但实际上仅有0和255两个灰度等级)。

(2)根据图像尺寸决定Hough变换累加器的大小并分配内存。

(3)对图像作Hough变换,并将变换结果存入Hough变换累加器。

(4)设定阈值,并根据阈值大小将Hough变换累加器中累加值小于阈值的点清零,即认为这些点并不对应图像域中的一条直线。

(5)查找Hough变换累加器中累加值最大的点,记录该点并将其领域清零,继续查找并记录下一个累加值最大的点,直到累加器中所有的累加值都为零,记录的这些点即对应了检测到的图像中的直线。

(6)根据检测到的点在图像域中绘出直线。

4.设计内容

4.1、读入图像

选取有较多直线及部分曲线以作对比的图像作为实验素材,这里我们必须使用彩色图像(有些看似灰度图像的实际属性也是彩色图像),原因下面有详解。

4.2、检测图像边缘

如果一个像素落在图像中某一个物体的边界上,那么它的邻域将成为一个灰度级变化的带。

对这种变化最有用的两个特征是灰度的变化率和方向,他们分别用梯度向量的幅度和方向来表示。

边缘检测算子检查每个像素的邻域并对灰度变化率进行量化,通常也包括方向的确定。

有若干种算子可以使用,大多数是基于方向导数掩模求卷积的方法。

如Roberts算子,Sobel算子,Prewitt算子,Log算子等。

这里采用Log算子提取图像边缘,再用均值滤波去除边缘图像噪声。

4.3、实现Houg变换,检测出图像中的直线

Hough变换是一种利用图像的全局特征将特定形状的边缘连接起来,形成连续平滑边缘的一种方法。

它通过将源图像上的点影射到用于累加的参数空间,实现对已知解析式曲线的识别。

这里先对边缘图像进行二值化处理,然后再用hough变换提取直线,最后用红色标记之。

因为处理过程中需使用灰度图像,但最后无法给灰度图像赋颜色(会出错或效果不好),只能给彩色图像赋颜色,故最初输入时请使用彩色图像。

5.程序代码

clc;

clear;

%%录入图像并显示

f=imread('

C:

\Users\YeSonG\Documents\MATLAB\01.jpg'

);

%读入彩色图像,注意不能使用灰度图像

o=f;

%保留彩色原图

f=rgb2gray(f);

%将彩色图像转换为灰度图像

f=im2double(f);

figure();

subplot(2,2,1);

imshow(o);

title('

原图'

%%提取图像边缘

[m,n]=size(f);

%得到图像矩阵行数m,列数n

fori=3:

m-2

forj=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算子

end

subplot(2,2,2);

imshow(l);

LoG算子提取图像边缘'

%%滤波

[m,n]=size(l);

fori=2:

m-1

forj=2:

n-1

y(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变换提取直线作准备

subplot(2,2,3);

imshow(y);

均值滤波器处理后'

)%%二值化

q=im2uint8(y);

[m,n]=size(q);

fori=1:

m

forj=1:

n

ifq(i,j)>

80;

%设置二值化的阈值为80

q(i,j)=255;

%对图像进行二值化处理,使图像边缘更加突出清晰

else

q(i,j)=0;

subplot(2,2,4);

imshow(q);

二值化处理后'

%%检测直线

%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);

%用元胞存储每个被检测的点的坐标

n%遍历图像每个点

if(q(i,j)==255)%只检测图像边缘的白点,其余点不检测

fork=1:

a

p=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]'

];

%存储点坐标

ap=abs(p)+1;

%若p小于0,则将点存储在(0,d)空间

s(k,ap)=s(k,ap)+1;

z{k,ap}=[z{k,ap},[i,j]'

%%显示效果

d*2%检查每个累加器单元中存储数量

if(s(i,j)>

70)%将提取直线的阈值设为70

lp=z{i,j};

%提取对应点坐标

s(i,j)%对满足阈值条件的累加器单元中(a,p)对应的所有点进行操作

o(lp(1,k),lp(2,k),1)=255;

%每个点R分量=255,G分量=0,B分量=0

o(lp(1,k),lp(2,k),2)=0;

o(lp(1,k),lp(2,k),3)=0;

%结果为在原图上对满足阈值要求的直线上的点赋红色

figure,imshow(o);

hough变换提取直线'

rotf=imrotate(f,33,'

crop'

¼

Ï

ñ

Ì

«

´

ó

£

¬

²

Ã

ô

BW=edge(rotf,'

canny'

[H,T,R]=hough(BW);

imshow(H,[],'

XData'

T,'

YData'

R,'

InitialMagnification'

'

fit'

xlabel('

\theta'

),ylabel('

\rho'

axison,axisnormal,holdon;

P=houghpeaks(H,7,'

threshold'

ceil(0.3*max(H(:

))));

x=T(P(:

2));

y=R(P(:

1));

plot(x,y,'

s'

color'

white'

%Findlinesandplotthem

lines=houghlines(BW,T,R,P,'

FillGap'

5,'

MinLength'

7);

figure,imshow(rotf),holdon

max_len=0;

fork=1:

length(lines)

xy=[lines(k).point1;

lines(k).point2];

plot(xy(:

1),xy(:

2),'

LineWidth'

2,'

Color'

green'

%plotbeginningsandendsoflines

plot(xy(1,1),xy(1,2),'

x'

yellow'

plot(xy(2,1),xy(2,2),'

red'

%determinetheendpointsofthelongestlinesegment

len=norm(lines(k).point1-lines(k).point2);

if(len>

max_len)

max_len=len;

xy_long=xy;

%highlightthelongestlinesegment

plot(xy_long(:

1),xy_long(:

cyan'

6.仿真结果分析

6.1第一组:

读入图像,使用彩色图像,边缘检测并提取边缘图像,均值滤波后对结果进行二值化处理,生成如图6.1的仿真图。

图6.1仿真结果

由Hought变换生成检测结果如图6.2

图6.2检测直线图

图片点的标记是原图片中检测后直线的位置和大小。

变换结果在原图像灰度变化上的标志情况如下图6.3所示

图6.3灰度图像直接标记

由于第一组的原图像中直接部分太少,仿真出来的结果不是太明显,下面对一幅直线多并比较明显的图像进行Hough变化。

6.2第二组:

和第一组一样读入图像,使用彩色图像,边缘检测并提取边缘图像,均值滤波后对结果进行二值化处理,生成如图6.4的仿真图。

图6.4仿真结果

由Hought变换生成检测结果如图6.5

图6.5检测直线图

变换结果在原图像灰度变化上的标志情况如下图6.6所示

图6。

3灰度图像直接标记

6.3分析

由第一组和第二组对比可以看出,对于直接明显的图像,仿真结果比较清晰。

利用Hough变换检测图像中直线的首先对图像进行二值化,然后进行边缘检测,接着对边缘检测的结果作Hough变换,最后得到直线检测结果。

7.结论

通过这次MATLAB的学习,我对MATLAB有了一个基础的认识,MATLAB是一个高级的矩阵/阵列语言,它包含控制语句、函数、数据结构、输入和输出和面向对象编程的特点。

用户可以在命令窗口中将输入语句与执行命令同步,也可以先编写好一个较大的复杂程序(M文件)后再一起运行。

在这短短的一周内从开始的一头雾水,到自己看书学习,到同学讨论,再进行整个题目的理论分析和计算,参考课程上的代码,写出自己的代码。

常规Hough变换虽然具有显著的优势,但其不足也不容忽视,例如检测速度太慢,无法做到实时控制;

精度不够高,期望的信息检测不到反而做出错误判断,进而产生大量的冗余数据。

虽然Hough变换还存在一些技术上的问题,但随着数学领域的不断发展,Hough变换在一些领域上已经有了很好的使用。

例如:

在生物医学领域,Hough变换已被成功应用于基于人工智能的专家诊断系统;

X射线人体照片和CT图像的处理和判读;

光学显微镜和电子显微镜中的细胞核自动分析系统;

从超声波诊断中提取三维动脉特征;

在自动化、机器人视觉领域,Hough变换已被用于运动目标轨迹的检测与识别,高空侦察机、间谍卫星和军事雷达等目标自动识别系统的特征提取。

例如应用Hough变换对战斗机的外形特征进行提取和自动识别;

应用Hough变换辅以信号检测理论解决并行多运动目标的跟踪问题等等。

总之,由以上分析可见,Hough变换有着广泛的关注程度以及良好的应用前景。

在计算机视觉和自动目标识别系统中,Hough变换是一个用于边缘线条特征提取的强有力工具,是值得我不断学习和完善工具。

8.参考文献

(1)薛定宇,陈阳泉,基于MATLAB/Simulnk的系统仿真技术与应用,北京:

清华大学出版社,2011 

(2)赵广元,MATLAB与控制系统仿真实践,北京:

北京航空航天大学出版社,2009 

(3)黄永安,马路,刘慧敏.MATLAB 

7.0/Simulnk 

6.0建模仿真开发与高级工程应用,北京:

清华大学出版社,2005 

(4)张家祥,方凌江,毛全胜基于MATLAB 

6.X的系统分析与设计——虚拟现实,西安电子科技大学出版社,2002 

(5)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1