用Hough变换检测二值图像中的圆

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

用Hough变换检测二值图像中的圆Hough变换简介Hough变换是实现图像边缘检测的一种有效方法,其基本思想是将测量空间的一点变换到参量空间中的一条曲线或一个曲面,而具有同一参量特征的点交换后在参量空间中相交,通过判断交点处的积累程度来完成特征曲线的检测,基于参量性质的不同,Hough变换可以检测直线、圆、椭圆、双曲线、抛物线等。同时,将概率论、模糊集理论、分层迭代的思想和级联的方法应用于Hough变换的过程中,大大地提高了Hough变换的效率,改善了Hough变换的性能。实验主要使用的函数MATLAB内部常数pi:圆周率p(=3.1415926...)MATLAB常用基本数学函数:abs(x):纯量的绝对值或向量的长度;round(x):四舍五入至最近整数;floor(x):地板函数,即舍去正小数至最近整数;MATLAB常用三角函数sin(x):正弦函数cos(x):余弦函数;向量的常用函数max(x):向量x的元素的最大值。MATLAB图像类型转换函数:rgb2gray:将一副真彩色图像转换成灰度图像;im2bw:通过设定高度阈值将真彩色,索引色,灰度图转换成二值图像;MATLAB图形图像文件的读取和显示函数imread(filename);MATLAB二进制图像及其显示imshow(f1)。用double对二值图像双精度化图形处理:sobel算子检测边缘hough变换检测圆分别显示灰度图像:figure;subplotSobel:算子边缘检测图像hough变换检测后的图像实验相关代码I=imread('*.jpg');f=rgb2gray(I);f1=im2bw(f,200/255);BW1=double(f1);BW=edge(BW1,'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);fori=1:ecountforr=1:size_rfork=1:size_anglea=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(a0&&a=m&&b0&&b=n)hough_space(a,b,r)=hough_space(a,b,r)+1;endendendendmax_para=max(max(max(hough_space)));index=find(hough_space=max_para*p);length=size(index);hough_circle=false(m,n);fori=1:ecountfork=1:lengthpar3=floor(index(k)/(m*n))+1;par2=floor((index(k)-(par3-1)*(m*n))/m)+1;par1=index(k)-(par3-1)*(m*n)-(par2-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;endendendfork=1:lengthpar3=floor(index(k)/(m*n))+1;par2=floor((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%dradius%d\n',par1,par2,par3);para(:,k)=[par1,par2,par3];endsubplot(221),imshow(f);subplot(222),imshow(BW);subplot(223),imshow(hough_circle)图像读取图像处理的第一步就是对所采集的图像进行读入,本次研究采集的图像是24位真彩色的JPG格式的图像。真彩色图像可用双精度存储,亮度值范围是[0,1];比较符合习惯的存储方法是用无符号整型存储,亮度值范围[0,255]。在实验中我们开始因为遇到了sobel算子无法识别二值图像的问题,后来用了double解决问题。MATLAB中图形图像文件的读取利用函数imread()完成。图像灰度与二值化处理白色与黑色之间按对数关系分为若干等级,称为灰度。灰度分为256阶。用灰度表示的图像称作灰度图。MATLAB中rgb2gray()函数可以实现图像灰度化,它是以R、G、B为轴建立空间直角坐标系,则RGB图的每个象素的颜色可以用该三维空间的一个点来表示,而Gray图的每个象素的颜色可以用直线R=G=B上的一个点来表示。于是rgb转gray图的本质就是寻找一个三维空间到一维空间的映射,最容易想到的就是射影(即过rgb空间的一个点向直线R=G=B做垂线),事实上MATLAB也是这样做的,并且有Gray=0.29900*R+0.58700*G+0.11400*B。图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。全局二值化最常用的方法就是设定一个全局的阈值P,用P将图像的数据分成两部分:大于P的像素群和小于P的像素群。将大于P的像素群的像素值设定为白色(或者黑色),小于P的像素群的像素值设定为黑色(或者白色)。MATLAB中使用im2bw函数,f1=im2bw(f,阈值)即将f以阈值分割。边缘检测图像边缘是一个图像的重要特征,是计算机模式识别,视觉等的基础,边缘检测是图像处理过程中的一个重要环节。检测物体边缘时,首先粗略检测其轮廓点,然后把原来检测到的轮廓点连接到一起,同时检测、连接遗漏的边界点并去除虚假的边界点。边缘检测的算法很多,如方向算子,特度算子,canny算子和拉普拉斯算子等。常用的有Sobel算子,梯度算子的Roberts算子,Prewitt算子以及Canny边缘检测等。本文主要涉及的是Sobel算子的边缘检测,Sobel算子是一阶微分算子,包含两组3*3矩阵,分别为横向和纵向,将之与图像作平面卷积,得出横向,纵向的亮度差分近似值。我们也用过其他算子,sobel效果最好。具体语法如下:BW=edge(A,'sobel',p);p为[0,1]的阈值hough变换Hough变换本来用于直线检测中,充分体现了Hough变换具有明了的几何解析性、一定的抗干扰能力以及易于实现并行处理等优点。人们在对图像进行几何特征检测时,感兴趣的往往有直线,圆,椭圆等等。自然而然地想到应用Hough变换。这里不再赘述hough变换检测直线。Hough变换是基于通过提取分布于目标圆周上的参数及点的特征值的来检测圆或圆弧的。为了检测目标外形,对图像上的每点定义一个参数空间的映射。Hough变换通过在参数空间找寻特征(峰值或最大值点)得到位于图像空间中的特征(目标形状)来转换问题。对于已知半径的圆Hough变换可以检测任意已知表达形式的曲线,关键在于选择合适的参数空间。我们可以根据曲线的表达形式决定其参数空间。当检测某一已知半径的圆时,可以使用与原图像空间相同的空间作为其参数空间。则原图像空间中的一个圆对应参数空间中的一个点,参数空间的一个点对应图像空间中一个圆,原图像空间中在同一圆上的点,它们的参数相同即a,b相同,它们在参数空间对应的圆就会过同一点(a,b),因此,将原图像中的所有点变换到参数空间之后,依据参数空间中点的聚集度就可判断出原图像空间中有无近似于圆的图形。对于未知半径的圆,在一个xy平面图像中确定一个圆至少需要三个元素,即圆心的x轴和y轴坐标,圆的半径,因此Hough变换检测圆的目的就是检测出图像中各个圆的圆心坐标以及圆的半径。其基本思想是将原图像空间中边缘点映射至参数空间中,再将参数空间中得到的全部坐标点元素所对应的累加值进行统计,并根据此累加值来判断圆的大小和圆心的位置。例如,在xy平面上的方程为(x-a)2+(y-b)2=r2其中点(a,b)为圆心坐标,r为圆半径,点(x,y)为圆周上的一点,将其转换为参数坐标系(a,b,r),方程为(a-x)2+(b-y)2=r2,可看出次方程为圆锥面,对于原图像中任意确定的一个点在参数空间都有一个三维锥面与其对应。在Hough变换检测圆时,可以利用梯度信息在很大程度上加快圆检测的速度。对圆周而言,其梯度方向只有背离圆心或者指向圆心,当梯度指向圆心,圆心就在梯度的延长线上,而当梯度背离圆心,圆心则在梯度的反向延长线上。所以,边缘梯度信息的加入可以预估圆心的位置,这样可以使算法的运算量明显减少,并且可以有效抑制虚假局部最大值。圆心位置可以用极坐标方程形式表达:a=x-r•cos(θ(x,y)),a=y-r•sin(θ(x,y))或者a=x+r•cos(θ(x,y)),a=y+r•sin(θ(x,y)),边缘像素(x,y)处的梯度方向为θ(x,y)。前一组公式是梯度方向背离圆心,后一组为梯度方向指向圆心。以前一种情况为例,边缘图像中每个边缘像素点(x,y)都可以算出其相应的梯度方向θ(x,y)。通过前一个公式可算出圆心坐标(a0,b0),对于参数空间可能的半径r0,其相应的参数空间累加器单元加一,最后找到累加器的局部最大值,就得到一个圆。实验结果通过对图像进行灰度化,二值化,边缘检测,hough变换等过程将图片中柑橘轮廓检测了出来。以下为圆坐标数据及处理的图像Center157radius10Center168radius10Center179radius10Center967radius10Center968radius10Center7568radius10Center7169radius10Center7270radius10Center7370radius10Center7271radius10Center7272radius10Center7674radius10Center7577radius10Center7677radius10Center17312radius10Center17213radius10Center17413radius10Center17214radius10Center17314radius10Center17115radius10Center17315radius10Center16916radius10Center17316radius10Center125205radius10Center127205radius10Center127206radius10Center122210radius10Center122215radius10Center121216radius10Center122216radius10Center1647radius20Center131214radius20实验分析在试验到最后的时候还是存在一些问题,期终检测时,我发现检测的圆比原图片中的柑橘小,还有左边的图片中有一个柑橘被另一个遮住了一部分,但是我们没有能在最后的检测的圆的图上清楚地看出来。检测的圆比柑橘小应该是在检测边缘时取得阈值有问题所致,在用sobel算子检测边缘时,检测的边缘就比柑橘图中的小。我们会通过改变阈值来改。至于有一个柑橘没有被检

1 / 6
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功