合 肥 学 院
课 程 设 计 报 告
题 目:__________哈夫变换检测圆______________
系 别:_________电子信息与电气工程系__________
专 业:_________电子信息工程_________
班 级:___________________
学 号:________________ 姓 名:________________
导 师:________ _______
成 绩:________________________
2010年 11 月 1 日
哈夫变换检测圆
1 【实验目的】
进一步了解Matlab软件/语言,掌握哈夫变换的基本原理,运用所掌握的图像处理知识和哈夫变换的思想检测直线和圆,培养处理实际图像的能力并为课堂教学提供配套的实践机会。
2 【实验原理】
哈夫变换是将图像空间中的线性转换为参数空间中的进行描述的方法。对于直线的变换而言,将所有可能落在直线边界上的进行统计计算,根据对数据统计的解释,确定该点属于该直线的程度;该变换同样适用于圆的检测。
圆的一般方程是: (x-a)^2+(y-b)^2=r^2 (1)
因为式(1)有3个参数a,b,r,所以需要在参数空间里建立1个3-D的累加数组A,其元素可写为(a,b,r)。可让a和b依次变化而根据式(1)算出r,并对A累加:
A(a,b,r)=A(a,b,r)+1
原来图像空间中的给定点借助梯度算子(索贝尔算子)来确定,可利用计算梯度时获得的梯度方向信息来减少求哈夫变换所需的计算量。设圆的半径r为已知,实验中取r=80,问题转化到2-D参数空间。这里图像空间的边界和参数空间里的轨迹都是圆,所以这里是圆周-圆周对偶性。
先把式(1)对x微分,并带入dx/dy=tan(θ-л/2)(这里θ是梯度方向与A轴正向的夹角),再把微分结果与式(1)联立并对a,b求解就可得到:
a=x-r(sinθ) b=y+(cosθ)
在这里圆的检测中,我们只需要2个1-D累加数组就够了。
3 【实验要求】
(1) 用哈夫变换检测直线;
(2) 用哈夫变换检测圆;
4 【设备与软件】
(1) IBM-PC-XT计算机系统
(2) Matlab软件/程序包括图像处理工具箱(Image Processing Toolbox)
(3) 实验所需要的图片
5 【实验步骤】
(1) 一个半径r=80,灰度值为60的圆,它处在灰度值为96的背景中;
(2) 计算原图的梯度图(用索贝尔算子);
(3) 对梯度图进行哈夫变换,得到累加器图中的最大值(即最大值)可确定圆心坐标;
(4) 根据圆的坐标和半径恢复原图。
具体实验步骤如下:
在f盘中新建一个文件夹lilili → 打开MatLab软件 → file → new → m_file 在打开的工作窗输入实验代码(见附录2):
保存文件:file → save as → circle.m → 单击进行编译 → 观察MatLab工作窗看有无错
误(若有错误,工作窗上会显示错误信息) → 双击错误信息,找到程序中错误的代码并改正 →再次编译,直至编译成功
编译成功得到的结果如附件1所示
6 【可能涉及的函数】
conv2 ( ) 实现二维卷积
sqrt ( ) 计算两点间的欧式距离
zeros ( ) 生成一个全0矩阵或向量
round ( ) 把值四舍五入为整数
find ( ) 找出数组中某个值的坐
7 【实验总结】
在以前的学习过程中接触过Matlab并运用它简单的进行实验,本学期的数字图像处理是专门针对图像所展开的课程,同时所开的数字图像处理的实验课程是为了检验我们在理论课程中所学习的知识,包括图像的灰度、二值图像、RGB图像、图像的卷积等等对图像进行的数学运算。
在实验过程中首先是进一步了解了Matlab软件的基本运用及利用其完成各项实验,并会根据一些提示信息进行程序的改进和总结实验的收获。实验中会遇到一些课本中没有学过的知识,但是通过老师的指导能够解决问题,也能够充分利用Matlab中的帮助功能协助自己完成实验。
通过本次的实验是对以往的实验进行的一次综合的总结,涉及的内容包括前面所学习的知识,由这一个实验来对所学的知识进行一个检验,因为并没有具体的实验代码,所以能够在一定程度上锻炼我们的自主学习能力,是很有意义的一门课程。
附件1
附件2
产生实验要求的图像代码
void CDIPView::OnCreateCircle()
{
if(!m_bLoaded)
{
AfxMessageBox(\"读入图像先\");
return ;
}
int i,j,
double r;
for(i=0;i r = (i-256.0)*(i-256)+(j-256.0)*(j-256); if (r<6400) *(m_pData+i*m_W+j) = 160; else *(m_pData+i*m_W+j) = 96; } //刷新图像 cvNamedWindow(\"ori\ cvShowImage(\"ori\ cvWaitKey(-1); cvDestroyWindow(\"ori\"); } 哈夫变换检测圆代码 clear I=imread('F:\\dongruting\\yuan.bmp'); [m,n,l] = size(I); if l>1 I = rgb2gray(I); end BW = edge(I,'sobel'); %---用 索贝尔算子 对图像进行边缘检测 step_r = 80; %---检测圆的半径 step_angle = 0.1; %---角度步长,单位为弧度 r_min = 20; %---最小圆的半径 r_max = 30; %---最大圆的半径 thresh = 0.7; %---索贝尔算子的参数 % ----------------------------------- % input % BW:二值图像; % step_r:检测的圆半径步长 % step_angle:角度步长,单位为弧度 % r_min:最小圆半径 % r_max:最大圆半径 % p:阈值,0,1之间的数 % ----------------------------------- % output % hough_space:参数空间,h(a,b,r)表示圆心在(a,b)半径为r的圆上的点数 % hough_circl:二值图像,检测到的圆 % para:检测到的圆的圆心、半径 [m,n] = size(BW); size_r = round((r_max-r_min)/step_r)+1; size_angle = round(2*pi/step_angle); hough_space = zeros(m,n,size_r); [rows,cols] = find(BW); ecount = size(rows); % Hough变换 % 将图像空间(x,y)对应到参数空间(a,b,r) % a = x-r*cos(angle) % b = y-r*sin(angle) for i=1:ecount for r=1:size_r for k=1:size_angle a = round(rows(i)-(r_min+(r-1)*step_r)*cos(k*step_angle)); b = round(cols(i)-(r_min+(r-1)*step_r)*sin(k*step_angle)); if(a>0&a<=m&b>0&b<=n) hough_space(a,b,r) = hough_space(a,b,r)+1; end end end end % 搜索超过阈值的聚集点 max_para = max(max(max(hough_space))); index = find(hough_space>=max_para*thresh ); length = size(index); hough_circle = false(m,n); for i=1:ecount 因篇幅问题不能全部显示,请点此查看更多更全内容