资源描述:
《用Hough变换检测二值图像中的圆.docx》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、用Hough变换检测二值图像中的圆Hough变换简介Hough变换是实现图像边缘检测的一种有效方法,其基本思想是将测量空间的一点变换到参量空间中的一条曲线或一个曲面,而具有同一参量特征的点交换后在参量空间中相交,通过判断交点处的积累程度来完成特征曲线的检测,基于参量性质的不同,Hough变换可以检测直线、圆、椭圆、双曲线、抛物线等。同时,将概率论、模糊集理论、分层迭代的思想和级联的方法应用于Hough变换的过程中,大大地提高了Hough变换的效率,改善了Hough变换的性能。实验主要使用的函数 MAT
2、LAB内部常数pi:圆周率 p(= 3.1415926...) MATLAB常用基本数学函数: abs(x):纯量的绝对值或向量的长度;round(x):四舍五入至最近整数;floor(x):地板函数,即舍去正小数至最近整数; MATLAB常用三角函数sin(x):正弦函数 cos(x):余弦函数; 向量的常用函数max(x): 向量x的元素的最大值。 MATLAB图像类型转换函数: rgb2gray:将一副真彩色图像转换成灰度图像; im2bw:通过设定高度阈值将真彩色,索引色,灰度图转换成二值图像
3、; MATLAB图形图像文件的读取和显示函数 imread(filename); MATLAB二进制图像及其显示imshow(f1)。 用double对二值图像双精度化 图形处理:sobel算子检测边缘hough变换检测圆 分别显示灰度图像:figure;subplot Sobel:算子边缘检测图像hough变换检测后的图像实验相关代码 I=imread('*.jpg');f=rgb2gray(I); f1=im2bw(f,200/255); BW1=double(f1); BW=edge(BW1,
4、'sobel',0.4); r_max=50; r_min=10;step_r=10;step_angle=pi/12;p=0.7; [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); for i=1:ecoun
5、t 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(
6、max(max(hough_space))); index = find(hough_space>=max_para*p); length = size(index); hough_circle = false(m,n); for i=1:ecount for k=1:length par3 = floor(index(k)/(m*n))+1; par2 = floor((index(k)-(par3-1)*(m*n))/m)+1; par1 = index(k)-(par3-1)*(m*n)-(pa
7、r2-1)*m; if((rows(i)-par1)^2+(cols(i)-par2)^2<(r_min+(par3-1)*step_r)^2+5&&... (rows(i)-par1)^2+(cols(i)-par2)^2>(r_min+(par3-1)*step_r)^2-5) hough_circle(rows(i),cols(i)) = true; end end end for k=1:length par3 = floor(index(k)/(m*n))+1; par2 = floor((
8、index(k)-(par3-1)*(m*n))/m)+1; par1 = index(k)-(par3-1)*(m*n)-(par2-1)*m; par3 = r_min+(par3-1)*step_r; fprintf(1,'Center %d %d radius %d',par1,par2,par3); para(:,k) = [par1,par2,par3]; end subplot(221),imshow(f); subplot(222),