数字图像处理课程设计Hough变换提取直线.docx
- 文档编号:23469637
- 上传时间:2023-05-17
- 格式:DOCX
- 页数:12
- 大小:192.21KB
数字图像处理课程设计Hough变换提取直线.docx
《数字图像处理课程设计Hough变换提取直线.docx》由会员分享,可在线阅读,更多相关《数字图像处理课程设计Hough变换提取直线.docx(12页珍藏版)》请在冰豆网上搜索。
数字图像处理课程设计Hough变换提取直线
摘要
为能够有效解决实时直线图形提取问题,提出了一种基于Hough变换(HT)的直线提取算法。
该算法首先分析了数字图像中直线边缘的三种结构特征,提出采用基元结构表示目标边缘点,并在约束条件下计算基元结构的基元倾角。
在此基础上,结合传统的HT的思想对基元结构进行极角约束HT,以获得最终的直线参数。
最后,再用MATLAB软件对该算法进行编程仿真。
实验结果表明,对合成图像和自然图像,该算法能够有效的识别图像中的直线段。
关键词:
直线提取;Hough变换;MATLAB;图像处理
1.课程设计目的
数字图像处理课程设计是电子信息工程专业实践教学的一个重要环节,通过本课程设计使学生运用所学知识进行图像处理的实际训练;是对所学知识的提高和综合应用。
通过综合设计,使得学生进一步理解数字图像处理的基本概念、基本原理和基本方法(如掌握图像增强算法、图像复原以及图像压缩方法等),扩展理论知识,培养学生的综合设计能力。
2.课程设计要求
1、查阅资料,介绍系统中所设计的主要功能和原理方法;
2、介绍各个功能的实现程序及结果;
3、附各个功能的实现程序,在程序中做适当的注释,附处理前后效果图;
4、测试和调试:
按课程设计要求,选用多幅图像对程序进行测试,并提供系统的主要功能实现的效果图。
并在调试中发现的问题做说明;
5、说明课程设计中学到的东西和取得的经验总结,心得体会。
3.MATLAB软件介绍
MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室),是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。
它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
MATLAB的基本数据单位是矩阵,它的指令表达式与数学、工程中常用的形式十分相似,故用MATLAB来解算问题要比用C,FORTRAN等语言完成相同的事情简捷得多,并且MATLAB也吸收了像Maple等软件的优点,使MATLAB成为一个强大的数学软件。
在新的版本中也加入了对C,FORTRAN,C++,JAVA的支持。
可以直接调用,用户也可以将自己编写的实用程序导入到MATLAB函数库中方便自己以后调用,此外许多的MATLAB爱好者都编写了一些经典的程序,用户直接进行下载就可以用。
MATLAB自产生之日起就具有方便的数据可视化功能,以将向量和矩阵用图形表现出来,并且可以对图形进行标注和打印。
高层次的作图包括二维和三维的可视化、图象处理、动画和表达式作图。
可用于科学计算和工程绘图。
新版本的MATLAB对整个图形处理功能作了很大的改进和完善,使它不仅在一般数据可视化软件都具有的功能(例如二维曲线和三维曲面的绘制和处理等)方面更加完善,而且对于一些其他软件所没有的功能(例如图形的光照处理、色度处理以及四维数据的表现等),MATLAB同样表现了出色的处理能力。
同时对一些特殊的可视化要求,例如图形对话等,MATLAB也有相应的功能函数,保证了用户不同层次的要求。
另外新版本的MATLAB还着重在图形用户界面(GUI)的制作上作了很大的改善,对这方面有特殊要求的用户也可以得到满足。
MATLAB对许多专门的领域都开发了功能强大的模块集和工具箱。
一般来说,它们都是由特定领域的专家开发的,用户可以直接使用工具箱学习、应用和评估不同的方法而不需要自己编写代码。
领域,诸如数据采集、数据库接口、概率统计、样条拟合、优化算法、偏微分方程求解、神经网络、小波分析、信号处理、图像处理、系统辨识、控制系统设计、LMI控制、鲁棒控制、模型预测、模糊逻辑、金融分析、地图工具、非线性控制设计、实时快速原型及半物理仿真、嵌入式系统开发、定点仿真、DSP与通讯、电力系统仿真等,都在工具箱(Toolbox)家族中有了自己的一席之地。
4.设计背景及基本原理
数字图像处理(Digital Image Processing)又称为计算机图像处理,它是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。
数字图像处理最早出现于20世纪50年代,当时的电子计算机已经发展到一定水平,人们开始利用计算机来处理图形和图像信息。
数字图像处理作为一门学科大约形成于20世纪60年代初期。
早期的图像处理的目的是改善图像的质量,它以人为对象,以改善人的视觉效果为目的。
图像处理中,输入的是质量低的图像,输出的是改善质量后的图像,常用的图像处理方法有图像增强、复原、编码、压缩等。
首次获得实际成功应用的是美国喷气推进实验室(JPL)。
他们对航天探测器徘徊者7号在1964年发回的几千张月球照片使用了图像处理技术,如几何校正、灰度变换、去除噪声等方法进行处理,并考虑了太阳位置和月球环境的影响,由计算机成功地绘制出月球表面地图,获得了巨大的成功。
随后又对探测飞船发回的近十万张照片进行更为复杂的图像处理,以致获得了月球的地形图、彩色图及全景镶嵌图,获得了非凡的成果,为人类登月创举奠定了坚实的基础,也推动了数字图像处理这门学科的诞生。
在以后的宇航空间技术,如对火星、土星等星球的探测研究中,数字图像处理技术都发挥了巨大的作用。
数字图像处理取得的另一个巨大成就是在医学上获得的成果。
1972年英国EMI公司工程师Housfield发明了用于头颅诊断的X射线计算机断层摄影装置,也就是我们通常所说的CT(Computer Tomograph)。
CT的基本方法是根据人的头部截面的投影,经计算机处理来重建截面图像,称为图像重建。
1975年EMI公司又成功研制出全身用的 CT装置,获得了人体各个部位鲜明清晰的断层图像。
1979年,这项无损伤诊断技术获得了诺贝尔奖,说明它对人类作出了划时代的贡献。
与此同时,图像处理技术在许多应用领域受到广泛重视并取得了重大的开拓性成就,属于这些领域的有航空航天、生物医学工程、工业检测、机器人视觉、公安司法、军事制导、文化艺术等,使图像处理成为一门引人注目、前景远大的新型学科。
4.1Hough变换检测直线的基本原理
Hough变换检测直线就是选取图像空间中一条直线L的某些特征,作为参数空间的一个点M,并且该直线L上所有点,通过某种算法,都能够对应着这些特征,从而在图像空间和参数空间之间建立起“线—点”的对偶性。
Hough变换就是根据这种对偶性,将图像空间中直线的检测问题,转化为参数空间中点的检测问题,而后者的处理比前者要简单得多,进行累加统计即可。
图1数字图像中直线的分布
图1给出了数字图像中三类直线的结构分布情况,图中一个小方格代表一个像素,黑方格代表边缘像素点,白方格代表背景像素点。
可以看出,近水平直线段由相距很近的行基元集合组成;近垂直直线段由相距很近的列基元集合组成;近45°直线依据其斜率分别由45°或135°扫描线上的斜基元集合组成。
综上可知,任何直线段都可以表示为总体走向趋势基本一致且缝隙很小、相距很近的相应基元的集合。
以此结构特点为基础建立本文的直线提取方法。
4.2Hough变换的几种基本算法
常用的Hough变换检测直线的方法,是运用下式在图像空间和参数空间之间,建立对偶变换。
ρ=xcosα+ysinα
图2直线检测的Hough变换原理
式中,ρ为极径;α为极角,α取0~180°;x为像素点相对图像原点的行坐标;y为像素点相对图像原点的列坐标。
为了检测出直角坐标系中,由非零点所构成的直线,需要根据检测分辨率的要求,将α离散化为Nα个参数区间,将ρ离散化为Nρ个参数区间,也就是说将极坐标系量化成许多小格,建立参数空间。
这种方法被称为标准Hough变换方法(standardhoughtransform,SHT)。
其优点是:
无论直线怎样变化,参数空间中α和ρ的取值范围是有限的。
所以,目前的直线检测大多数都是基于这种方法。
但是,这种方法在Nα值较大的情况下,存在以下两个缺陷:
(1)计算量大
Nα越大,α的步长越小,计算量就越大。
在要求检测精度很高的场合,Nα的值往往非常大,这样会使计算量大增。
(2)需要大的存储空间
如果α和ρ都占4个字节,参数空间所需要的存储空间的字节数S可由下式求出:
S=4NαNβ
(1)
图3Hough变换从图像空间到参数空间的转换
式中,Nα为α在[0,π)间取的离散值的个数;Nρ为ρ的采样个数。
对较大的图像,S将大于数千兆字节(GB),单靠物理内存,难以满足这样的要求。
为了减少这种Hough变换的计算量,减小所需要的存储空间,在此基础上出现了很多改进的Hough变换算法,例如分块检测法、两次检测法、全整数Hough变换等,为讨论方便,将其统称为正弦Hough变换方法。
但这些方法由于受α的步长限制,有时候检测结果不尽人意,难以实现对任意斜率直线的快速、精确检测,尤其是对超大型图像(例如像素在2048×2048以上)。
如果能够建立一个不受α步长限制的参数空间,就有可能实现对任意斜率直线的快速、精确检测。
4.3几种算法的比较与选择
图像空间中,直线L0:
y=k0x+b0上每一个点,在参数空间中都代表一条直线,这些直线都相交于一点M(k0,b0)。
与用极坐标建立参数空间的方法相比,这种方法不受α的步长限制,检测了所有的可能出现的直线,不会有任何遗漏,在像素允许的情况下,能精确地检测出图像中的任意直线。
这种优点决定了它非常适合用来对直线进行精确检测。
为便于讨论,将其称为kbHough变换方法。
虽然这种方法在原理上非常明确,但在具体实现过程中,如果简单地用浮点数进行斜率和截距的计算,还有以下3个问题需要解决:
(1)如果同时计算斜率和截距,参数空间结构数组可能异常庞大,而且计算量非常大。
一幅像素为m×n的图像,假设图像中可能出现的不重复的斜率有u种(u大于图像的像素总数)。
若这些数据都占4个字节,那么要求的计算机内存为
对较大的图像,要求的计算机内存超过上千兆字节(GB),这显然是不现实的。
如何解决这个问题?
很多时候,如果将一个2维问题分解为两个1维问题来解决,往往非常方便。
参数空间数组之所以异常庞大,是因为同时包含了待测的斜率和截距,而斜率和截距的组合,决定了其数组的元素个数必然非常多。
如果将斜率k和截距b分步进行检测,先检测斜率,找出出现次数最多的斜率k0,然后再检测截距,找出斜率为k0的,出现次数最多的直线的截b0,也就是说,将一个2维问题分解为两个1维问题。
由于斜率为k0的二点对的数量往往非常有限,这样就能有效地减小参数空间。
但是,即使将斜率k和截距b分步进行检测,如果用浮点数进行计算斜率,并采用普通的Hough变换的投票方式,即先计算完由非零点组成的所有的二点对的斜率,再对斜率进行统计,也可能需要很大的参数空间。
1幅800×600的图像,如果非零点非常多,需要的参数空间仍然可能超过数千兆字节(GB)。
所以,用浮点数计算斜率,要减小参数空间,只能一边计算斜率,一边统计斜率相同的情况(与前面的斜率进行比较)。
即边投票,边计票。
但是,这样计算量非常大。
(2)程序的复杂程度高
根据定量度量程序的复杂程度的McCabe方法,流图(也称为程序图)的环形复杂度可由下式求出:
V(G)=R+1(3)
式中,V(G)为环形复杂度;R为流图中的判定节点数目。
通常V(G)≤10为宜。
根据McCabe方法,求出该方法的流图的判定节点数R为10,由式(3)可知,其环形复杂度为11,显然复杂程度太高。
(3)如果直接采用浮点数计算斜率,无法处理斜率为无穷大的垂直直线斜率为无穷大,给计算带来不便,这正是极少有人采用这种方法的原因。
综上所述,除了需要分步检测斜率和截距外,还不能简单地采用浮点数计算斜率。
因此采用了斜率分式查表方法来解决这些问题。
6.MATLAB程序设计与仿真
6.1MATLAB程序
下面的程序先对边缘图像进行二值化处理,再用中值滤波的方法对对象进行滤波处理,然后再用hough变换提取直线最后用红色标记之。
因为处理过程中需使用灰度图像,但最后无法给灰度图像赋颜色(会出错或效果不好),只能给彩色图像赋颜色,故最初输入时请使用彩色图像。
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,列数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
end
subplot(2,2,2);imshow(l);title('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变换提取直线作准备
end
end
subplot(2,2,3);imshow(y);title('均值滤波器处理后')
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;
end
end
end
subplot(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);%用元胞存储每个被检测的点的坐标
fori=1:
m
forj=1:
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]'];%存储点坐标
else
ap=abs(p)+1;%若p小于0,则将点存储在(0,d)空间
s(k,ap)=s(k,ap)+1;%(a,p)相应的累加器单元加一
z{k,ap}=[z{k,ap},[i,j]'];%存储点坐标
end
end
end
end
end
fori=1:
a
forj=1:
d*2%检查每个累加器单元中存储数量
if(s(i,j)>70)%将提取直线的阈值设为70
lp=z{i,j};%提取对应点坐标
fork=1:
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;%结果为在原图上对满足阈值要求的直线上的点赋红色
end
end
end
end
figure,imshow(o);title('hough变换提取直线');
6.2运行结果与分析
运行matlab.m程序,得到的运行结果如图所示:
图4原图像及处理过程中的图像
图5图像直线提取结果
在图4中,原图是一副大小为800×600的彩色bmp图像,将其转换为灰度图像后,再用LOG算子提取图像边缘,从处理结果可以看出,边缘提取后的图像存在着大量的随机噪声,会影响后续的图像处理,因此对图像再进行滤波处理是很有必要的。
图5为直线检测结果,可以看出用该算法可以准确提取出大部分直线段,但同时也可以看出,该种算法存在一些不足之处,例如有些曲线边缘被误判断为多个小的直线段的组合,这些都是需要以后改进的。
但总体来说,此次图像处理结果已经能够达到预定目标。
7.总结体会
通过此次图像处理实验不仅加深了对图像处理相关知识的理解,尤其是Hough变换检测直线,而且对Matlab软件的使用也进一步熟练了。
我想这次实验对我以后进一步学习图像处理会有很大的帮助。
在实验过程中我经常调用Matlab已有的函数程序和自己编写的程序进行结果对比,其中直方图均衡化以及图像分割还是有一些差别的,这说明还是有很多的改进空间的,尤其是在Hough变换中,对比是很明显的,所以还需要进一步学习图像处理的一些实用型的处理方法。
参考文献
[1] 孙卫琴,数字图像编程.,北京:
电子工业出版社,2006.
[2] 姚敏,数字图像处理,北京:
机械工业出版社,2012.
[3] 张伟,MATLAB程序设计实战训练,北京:
人民邮电出版社,2004.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字图像 处理 课程设计 Hough 变换 提取 直线