hough变换检测圆的matlab程序 1

合集下载

matlab imfindcircles 发现圆区域后提取

matlab imfindcircles 发现圆区域后提取

matlab imfindcircles 发现圆区域后提取如何使用Matlab中的imfindcircles函数进行圆区域的检测与提取。

第一步:什么是imfindcircles函数?imfindcircles是Matlab图像处理工具箱中的一个函数,用于在给定的图像中检测和定位圆形区域。

它基于Hough变换并使用Adaptive Gradient 方法来寻找图像中的圆形轮廓。

第二步:imfindcircles函数的语法和输入参数是什么?imfindcircles函数的基本语法如下:[centers, radii, metric] = imfindcircles(A, r, varargin)它有三个输出参数和多个输入参数:- 输出参数centers是一个m×2矩阵,其中m是检测到的圆的数量,每一行对应一个圆的中心坐标。

- 输出参数radii是一个m×1矩阵,其中每个元素对应一个圆的半径。

- 输出参数metric是一个m×1矩阵,其中每个元素对应一个圆的度量值,用于表示圆检测的可信度。

- 输入参数A是待处理的图像,可以是灰度图像或彩色图像。

- 输入参数r是一个长度为2的向量,它定义了要检测的圆半径的范围。

例如,r = [rmin, rmax]表示要检测的圆的半径范围从rmin到rmax。

- 输入参数varargin是可选的参数,可以用于设置其他参数,如灵敏度、边缘阈值等。

第三步:如何调用imfindcircles函数进行圆区域检测?假设我们有一幅灰度图像img,我们希望在其中检测圆形区域。

最简单的调用方式是:[centers, radii, metric] = imfindcircles(img, [rmin, rmax])这将使用默认参数进行圆形区域检测,并返回检测到的圆的中心坐标、半径和度量值。

如果我们想要指定额外的参数,可以使用varargin参数。

例如,我们可以设置灵敏度为0.9,并设置边缘阈值为0.1:[centers, radii, metric] = imfindcircles(img, [rmin, rmax], 'Sensitivity', 0.9, 'EdgeThreshold', 0.1)第四步:如何提取圆区域?一旦我们检测到了圆形区域,我们可以使用图像处理工具箱提供的函数来提取这些区域。

imfindcircles函数

imfindcircles函数

imfindcircles函数imfindcircles函数是MATLAB中的一个函数,用于在图像中定位圆形物体。

该函数在计算机视觉和图像处理领域被广泛应用。

本文将详细介绍imfindcircles函数的原理、应用场景和使用方法。

一、imfindcircles函数的原理imfindcircles函数基于Hough变换实现圆形检测。

Hough变换是一种常用的图像处理技术,用于在图像中找到几何形状(例如直线、圆)的参数。

通过对图像中每个像素的梯度进行检测,函数能够识别圆形的边界,并计算出圆心和半径。

二、imfindcircles函数的应用场景imfindcircles函数可广泛应用于医学影像、工业检测、物体识别等领域。

在医学影像中,它可以用于检测疑似肿瘤的圆形区域;在工业检测中,它可以用于检测机器零件中的孔洞或孔径;在物体识别中,可以通过检测物体的圆形边界来识别特定的物体。

三、imfindcircles函数的使用方法使用imfindcircles函数可以大致分为以下几个步骤:1. 加载图像首先需要加载需要进行圆形检测的图像。

可以使用MATLAB中的imread函数读取图像文件,也可以使用imread函数直接加载图像数据。

读取图像后,可以使用imshow函数显示图像。

2. 图像预处理在进行圆形检测之前,通常需要对图像进行一些预处理操作,以提高圆形检测的准确性。

常见的预处理方法包括灰度化、滤波和图像增强等。

可以使用MATLAB中的rgb2gray函数将图像转换为灰度图像,使用imfilter函数实现滤波操作,使用imadjust函数进行图像增强。

3. 圆形检测在对图像进行预处理之后,可以使用imfindcircles函数进行圆形检测。

该函数的基本语法如下所示:[circles, radii] = imfindcircles(A, rRange)其中A表示待检测的图像,rRange表示要检测的圆半径的范围。

基于Hough变换的圆检测方法

基于Hough变换的圆检测方法

-1462-0引言Hough 变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,在虹膜检测、油罐车罐口定位等实际问题中有着非常重要的作用。

圆Hough 检测是目前应用最为广泛的方法之一,其可靠性高,对噪声、变形、部分区域残缺、边缘不连续等有较好的适应性,但其缺点是计算量大,占据内存多。

并且,实际图像还受光照、背景不均匀等条件的影响,从而影响了其计算精度和计算速度。

目前织物防水性能的检测还停留在人工的检测,这种传统的检测方法有费工费时、受主观因素影响较大等一系列不足之出。

而如何快速、高效、客观的检测织物的防水性能成为了一个急需解决的问题。

而根据织物防水性检测标准,检测圆是其中一个重要环节。

因此研究改进的Hough 圆检测的算法是有实际意义的。

1Hough 变换的原理Hough 变换的原理[1]就是利用图像全局特征将边缘像素连接起来组成区域封闭边界,它将图像空间转换到参数空间,在参数空间对点进行描述,达到检测图像边缘的目的。

该方法把所有可能落在边缘上的点进行统计计算,根据对数据的统计结果确定属于边缘的程度。

Hough 变换的实质就是对图像进行坐标变换,把平面坐标变换为参数坐标,使变换的结果更易识别和检测。

典型的例子就是直线的检测,通过变换图像平面上的点对应到参数平面上的线,而图像平面中的一条直线对应于参数平面中的一簇有公共交点的曲线。

从而检测直线就转换为检测有特殊特征的点,检测到的点,就是图像平面上线的参数。

因此直线就被检测出来了,圆的检测原理类似[2]。

2几种Hough 变换圆检测算法概述Hough 变换于1962年在美国作为专利被发表至今已有40多年了。

由于具有一些明显优点和可贵性质,它引起了国内外许多学者和工程技术人员的普遍关注。

专家们对Hough 变换的理论性质和应用方法进行了深入广泛的研究,并取得了许多有价值的成果。

这种Hough 变换的时间消耗和所需空间的急剧增大,使得在实际应用中几乎不可能实现。

一种基于Hough变换的圆和矩形的快速检测方法

一种基于Hough变换的圆和矩形的快速检测方法

一种基于Hough变换的圆和矩形的快速检测方法一、本文概述随着计算机视觉技术的快速发展,图像中的形状检测成为了许多实际应用领域的核心问题,如机器人导航、工业自动化、医学影像分析、安全监控等。

在这些应用场景中,快速准确地检测出图像中的圆形和矩形对于后续的图像理解和处理至关重要。

本文提出了一种基于Hough变换的圆和矩形的快速检测方法,旨在提高形状检测的效率和准确性,为相关领域的实践应用提供新的思路和技术支持。

Hough变换作为一种经典的图像处理技术,已经在直线检测等领域取得了广泛应用。

然而,将其应用于圆形和矩形的检测时,传统的Hough变换方法面临着计算量大、检测速度慢等问题。

为了解决这些问题,本文在深入研究Hough变换原理的基础上,提出了一种改进的快速检测方法。

该方法结合了图像预处理、形状特征提取和Hough变换等多个步骤,通过优化算法和减少不必要的计算,实现了圆形和矩形的高效检测。

本文首先介绍了Hough变换的基本原理及其在形状检测中的应用背景,然后详细阐述了本文提出的快速检测方法的理论框架和实现步骤。

接着,通过实验验证了该方法的有效性,并与其他经典算法进行了比较。

本文总结了研究成果,指出了方法的优点和局限性,并对未来的研究方向进行了展望。

通过本文的研究,我们期望能够为计算机视觉领域的形状检测问题提供一种更加高效、准确的解决方案,推动相关应用的发展和创新。

二、Hough变换原理及其应用Hough变换是一种在计算机视觉和图像处理中广泛应用的特征检测方法,尤其在形状识别,如直线、圆和矩形检测中,显示出其独特的优势。

Hough变换的基本原理是通过将图像空间中的形状映射到参数空间中的峰值,从而实现对这些形状的检测。

对于直线检测,Hough变换通过将图像中的每个点映射到参数空间的一条线上,从而得到多条线的交点,这些交点即对应图像空间中的直线。

类似地,对于圆和矩形的检测,Hough变换也可以将图像中的形状映射到相应的参数空间,如圆的参数空间包括圆心和半径,矩形的参数空间包括四个顶点的坐标等。

(标准)Hough变换检测圆

(标准)Hough变换检测圆

Hough变换检测圆(附:MATLAB程序)分类:图像处理Hough圆2011-12-11 21:37 12587人阅读评论(33) 收藏举报matlab算法图像处理internetfunction任务Hough变换的基本原理在于,利用点与线的对偶性,将图像空间的线条变为参数空间的聚集点,从而检测给定图像是否存在给定性质的曲线。

圆的方程为:(x-a)^2+(y-2)^2=r^2,通过Hough变换,将图像空间对应到参数空间。

附录中的MATLAB程序为网上比较常见的,实际运行中存在一些问题,这里进行些修改。

原理:霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法。

最基本的霍夫变换是从黑白图像中检测直线(线段)。

我们先看这样一个问题:设已知一黑白图像上画了一条直线,要求出这条直线所在的位置。

我们知道,直线的方程可以用y=k*x+b 来表示,其中k和b是参数,分别是斜率和截距。

过某一点(x0,y0)的所有直线的参数都会满足方程y0=kx0+b。

即点(x0,y0)确定了一族直线。

方程y0=kx0+b在参数k--b平面上是一条直线,(你也可以是方程b=-x0*k+y0对应的直线)。

这样,图像x--y平面上的一个前景像素点就对应到参数平面上的一条直线。

我们举个例子说明解决前面那个问题的原理。

设图像上的直线是y=x, 我们先取上面的三个点:A(0,0), B(1,1), C(22)。

可以求出,过A点的直线的参数要满足方程b=0, 过B点的直线的参数要满足方程1=k+b, 过C点的直线的参数要满足方程2=2k+b, 这三个方程就对应着参数平面上的三条直线,而这三条直线会相交于一点(k=1,b=0)。

同理,原图像上直线y=x上的其它点(如(3,3),(4,4)等) 对应参数平面上的直线也会通过点(k=1,b=0)。

这个性质就为我们解决问题提供了方法:首先,我们初始化一块缓冲区,对应于参数平面,将其所有数据置为0.对于图像上每一前景点,求出参数平面对应的直线,把这直线上的所有点的值都加1。

用Hough变换检测直线和圆

用Hough变换检测直线和圆

特殊图像变换1、HoughLines功能:利用Hough 变换在二值图像中找到直线格式:CvSeq* cvHoughLines2( CvArr* image, void* line_storage, int method, double rho, double theta, int threshold,double param1=0, double param2=0 );参数:image:输入8-比特、单通道(二值) 图像,其内容可能被函数所改变line_storage:检测到的线段存储仓. 可以是内存存储仓(此种情况下,一个线段序列在存储仓中被创建,并且由函数返回),或者是包含线段参数的特殊类型(见下面)的具有单行/单列的矩阵(CvMat*)。

矩阵头为函数所修改,使得它的cols/rows将包含一组检测到的线段。

如果line_storage是矩阵,而实际线段的数目超过矩阵尺寸,那么最大可能数目的线段被返回(线段没有按照长度、可信度或其它指标排序).method:Hough 变换变量,是下面变量的其中之一:∙CV_HOUGH_STANDARD- 传统或标准Hough 变换. 每一个线段由两个浮点数(ρ, θ) 表示,其中ρ 是点与原点(0,0) 之间的距离,θ 线段与x-轴之间的夹角。

因此,矩阵类型必须是CV_32FC2 type.∙CV_HOUGH_PROBABILISTIC - 概率Hough 变换(如果图像包含一些长的线性分割,则效率更高). 它返回线段分割而不是整个线段。

每个分割用起点和终点来表示,所以矩阵(或创建的序列)类型是CV_32SC4.∙CV_HOUGH_MULTI_SCALE- 传统Hough 变换的多尺度变种。

线段的编码方式与CV_HOUGH_STANDARD 的一致。

rho:与象素相关单位的距离精度theta:弧度测量的角度精度threshold:阈值参数。

如果相应的累计值大于threshold,则函数返回的这个线段.param1:第一个方法相关的参数:∙对传统Hough 变换,不使用(0).∙对概率Hough 变换,它是最小线段长度.∙对多尺度Hough 变换,它是距离精度rho的分母(大致的距离精度是rho而精确的应该是rho / param1 ).param2:第二个方法相关参数:∙对传统Hough 变换,不使用(0).∙对概率Hough 变换,这个参数表示在同一条直线上进行碎线段连接的最大间隔值(gap), 即当同一条直线上的两条碎线段之间的间隔小于param2时,将其合二为一。

基于对偶点的hough变换算法提取圆环圆心

基于对偶点的hough变换算法提取圆环圆心

基于对偶点的hough变换算法提取圆环圆心
Hough变换算法是一种有效的检测和定位圆形物体的有效方法,它可以通过检测影像中的对偶点,来求出圆的圆心,进而找出圆环等圆心定位对象。

Hough变换算法提取圆环圆心的基本步骤如下:
1. 图像预处理:使用降噪、锐化、二值化等手段对图像进行预处理,使其适应Hough变换算法。

2. 对偶点检测:使用相关算子进行图像处理操作,检测影像中的对偶点。

3. 求取圆心:根据检测到的对偶点,运用Hough变换算子求取对应圆环的圆心。

4. 确定圆环:根据求得的圆心位置,使用分类器检测出圆形物体,确定圆环。

5. 数据存储:将圆心位置和圆环位置等相关信息存入相应的数据库,以备后续处理使用。

Hough变换检测圆坐标源代码

Hough变换检测圆坐标源代码
int iPointNum; int ixBegin, iyBegin; int iMinRadius; int iMaxRadius; int iRadius; int iNumOfCircle;
iMinRadius = 16;
/* 要检测的圆环的内半径*/
/* 要检测的圆环的外半径 ,即圆环的检测宽度为 3,像素在这个圆环内,都视作圆上的*/ iMaxRadius = 18;
/* 计数数组,图象上的每一个像素点对应一个计数值,用来确定该点是否是某个圆的 圆心。*/ int* pCount; /* X 坐标数组,其中的元素是圆环上点的 X 坐标。*/ int* ixCor; /* Y 坐标数组,其中的元素是圆环上点的 Y 坐标。*/ int* iyCor; int* ixCalCor; int* iyCalCor;
< 10) /* 圆的方程:(X-X0)*(X-X0) + (Y-Y0)*(Y-Y0) = R*R*/
{
iyCor[iNumOfCircle] = i;
ixCor[iNumOfCircle] = j; /* 把圆环上点的 x、y 坐标分别放到数组
iyCor 和 ixCor 中*/
iNumOfBiblioteka ircle++;/* 圆环上像素点的个数,也是圆环上
的当前点在数组 iyCor 和 ixCor 中的序号*/
}
}
}
}
/* 功能:检测整个图像范围内同样大小的圆环。不检测圆心在靠近图像边界附近的圆。 */
/* 具体说明:在整个图像范围内平移圆环,同时检测圆环上像素值为 255 的象素点, */
/* 每检测到一个这样的点,则将该圆的圆心点对应的计数器值加 1。*/ /* (j, i)是圆心坐标*/

霍夫变换检测圆和直线

霍夫变换检测圆和直线

霍夫变换检测任意形状一、实验目的1.掌握MATLAB软件的使用,以及其设计流程;2.掌握霍夫变换的实现方法;3.用MATLAB语言设计基于霍夫变换的任意图形的识别。

二、实验仪器或设备装MATLAB软件的微机一台三、总体设计原理及流程图1、程序设计的原理霍夫变换的基本思想就是把图像平面上的点对应到参数平面上的曲线,最后通过统计特性来解决问题。

具有良好的抗噪声性能和对部分遮盖的不敏感等特性。

2、程序流程图四、主要程序代码1、霍夫变换检测圆程序clear all; close all; clc;% [cr,st]=circle_product;%st(1)->x,st(2)->y,st(3)->rcr=imread('sample.bmp');%circle1.bmpfigure;imshow(cr);[row,range]=size(cr);p=row*range;a=0;Y=zeros(1,p);Q=zeros(1,p);for k1=1:1:rowfor k2=1:1:rangeif cr(k1,k2)==0a=a+1;XXX=k2-1;YYY=row+1-k1;Y(a)=YYY;Q(a)=XXX;endendendfor k3=1:1:pif Y(k3)==0&Q(k3)==0break;endend% z=ones(1,5);% a=1:1:300;b=1:1:300;% z1=sqrt((a-Q(1)).^2+(b-Y(1)).^2);% z2=sqrt((a-Q(2)).^2+(b-Y(2)).^2);% z3=sqrt((a-Q(3)).^2+(b-Y(3)).^2);% z4=sqrt((a-Q(4)).^2+(b-Y(4)).^2);% z5=sqrt((a-Q(5)).^2+(b-Y(5)).^2);% % z1=sqrt((a-Q(1))*(a-Q(1))+(b-Y(1))*(b-Y(1)));% % Z1=(a-Q(1)).^2+(b-Y(1)).^2;r0=(abs(z1-z2)<=0.1&abs(z1<=z3)<=0.1&abs(z1<=z4)<=0.1&abs(z1<=z5)<=0.1&abs(z2<=z3)< =0.1&abs(z2<=z4)<=0.1&abs(z2<=z5)<=0.1);% r=r0.*z1;% aa=r0.*a;% bb=r0.*b;% rrr=round(r(r0~=0))% aaa=aa(r0~=0)% bbb=bb(r0~=0)k7=floor(k3/6);k5=2;a=1:1:300;b=1:1:300;rrr=zeros(1,p);aaa=zeros(1,p);bb=zeros(1,p);k6=0;as=0;k11=1;for k5=1:1:k7k6=0;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%z1=sqrt((a-Q(k5)).^2+(b-Y(k5)).^2);z2=sqrt((a-Q(k5+1)).^2+(b-Y(k5+1)).^2);z3=sqrt((a-Q(k5+2)).^2+(b-Y(k5+2)).^2);z4=sqrt((a-Q(k5+3)).^2+(b-Y(k5+3)).^2);z5=sqrt((a-Q(k5+4)).^2+(b-Y(k5+4)).^2);z6=sqrt((a-Q(k5+5)).^2+(b-Y(k5+5)).^2);r0=(abs(z1-z2)<=.1&abs(z1<=z3)<=.1&abs(z1<=z4)<=.1&abs(z1<=z5)<=.1&abs(z1<=z6)<=.1& abs(z2<=z3)<=1&abs(z2<=z4)<=.1&abs(z2<=z5)<=.1&abs(z2<=z6)<=.1);rr=r0.*z1;aa=r0.*a;bb=r0.*b;[m,n]=size(rr);if rr==zeros(1,n);as=as+1; continue;end[pz1,pz]=size(rr(r0~=0));rrr=round(rr(r0~=0))aaa=aa(r0~=0)bbb=bb(r0~=0)pz2=pz+k11-1;k9=1;for k8=k11:pz2RR(k8)=rrr(k9);XX(k8)=aaa(k9);YY(k8)=bbb(k9);k9=k9+1;endk11=k8+1;% if rr==zeros(1,n);% as=as+1; continue;% endend% if aa==zeros(1,300)% as=1% endrangex=1:1:range;rowy=1:1:row;[RX,RY]=meshgrid(rangex,rowy);RT=RX;figure;mesh(RX,RY,RT);hold on;plot3(XX,YY,RR,'ko');%%%%%%%%%%%%%%%5[rhao,nn]=the_max1(XX,YY,RR);i1=ones(row,range);center=rhao;% t2=1.5;t3=1.5;for k1=1:1:rowfor k2=1:1:rangeXXX=k2-1;YYY=row+1-k1;ifabs(((XXX-center(1))*(XXX-center(1))+(YYY-center(2))*(YYY-center(2)))-center(3)*cen ter(3))<=101i1(k1,k2)=0;endendendimwrite(i1,'找出的圆.bmp','bmp');i2=imread('找出的圆.bmp');figure;imshow(i2);%st2、霍夫变换检测直线clear all; close all; clc;i=imread('sample.bmp');[row,range]=size(i);p=row*range;a=0;Y=zeros(1,p);Q=zeros(1,p);for k1=1:1:rowfor k2=1:1:rangeif i(k1,k2)==0a=a+1;XXX=k2-1;YYY=row+1-k1;Y(a)=YYY;Q(a)=YYY-XXX;endendend% for t=1:1:a% o=[Y(t) Q(t)]% endX1=[0 1];Y1=[Y(1) Q(1)];plot(X1,Y1,'r');hold on;YY=zeros(1,a-1);QQ=zeros(1,a-1);for t=2:1:aX2=[0 1];Y2=[Y(t) Q(t)];plot(X2,Y2);[YY(t-1),QQ(t-1)]=pll(X1,Y1,X2,Y2);% yyy=YY(t-1)% qqq=QQ(t-1)%看交点plot(YY(t-1),QQ(t-1),'ko');end% [res]=gather_point(YY,QQ,QQ);nn=0;res% [m,n3]=size(YY);% for no1=1:1:n3% n=0;% for no2=(no1+1):1:n3% if(abs(res(no2,1)-res(no1,1))<=0.0001&abs(res(no2,2)-res(no1,2))<=0.0001&abs(res(no2, 2)-res(no1,2))<=0.0001)% n=n+1;hao=res(no1,:);% end% end% if nn>=n3/5% rhao=hao;break;% elseif nn<n% rhao=hao;nn=n;% end% end[rhao]=the_max1(YY,QQ,QQ);% yyy=YY% qqq=QQ% t2=0;t3=0;% for t1=2:1:t% t2=YY(t1)+t2;% t3=t3+QQ(t1);% end% t2=t2/(t1-1)% t3=t3/(t1-1)%t2=m,t3=b% i1=ones(row,range);% t2=2;t3=0;i1=ones(row,range);rhaot2=rhao(1);t3=rhao(2);t2=round(t2);t3=round(t3);% t2=1.5;t3=1.5;for k1=1:1:rowfor k2=1:1:rangeXXX=k2-1;YYY=row+1-k1;if abs(YYY-(t2*XXX+t3))<=1%YYY==t2*XXX+t3 i1(k1,k2)=0;endendendimwrite(i1,'找出的直线.bmp','bmp');i2=imread('找出的直线.bmp');figure;subplot(2,1,1);imshow(i);subplot(2,1,2);imshow(i2);五、实验结果1、霍夫变换检测圆实验结果截图待检测的图:2、霍夫变换检测直线实验结果截图待检测的图。

matlab霍夫变换

matlab霍夫变换

matlab霍夫变换一、什么是霍夫变换?霍夫变换(Hough Transform)是一种图像处理算法,用于检测图像中的直线、圆等形状。

其基本思想是将图像中的每个点转化为参数空间中的一个曲线或点,然后在参数空间中寻找交叉点,从而得到目标形状的参数。

二、Matlab中的霍夫变换函数在Matlab中,可以使用“hough”函数进行霍夫变换。

该函数的语法如下:[H,theta,rho] = hough(BW)其中,“BW”是二值化后的图像矩阵,“H”是霍夫变换后的结果矩阵,“theta”和“rho”分别表示直线参数空间中的角度和距离。

三、Matlab实现直线检测1. 读取并显示原始图像首先需要读取原始图像,并将其显示出来。

可以使用“imread”和“imshow”函数实现。

2. 二值化处理由于霍夫变换只能处理二值化后的图像,因此需要对原始图像进行二值化处理。

可以使用“im2bw”函数实现。

3. 霍夫变换使用“hough”函数对二值化后的图像进行霍夫变换,并得到直线参数空间矩阵“H”。

4. 寻找直线在直线参数空间矩阵“H”中,寻找交叉点即可得到直线的参数。

可以使用“houghpeaks”函数实现。

5. 绘制直线利用得到的直线参数,可以使用“houghlines”函数绘制出检测到的直线。

四、Matlab实现圆检测1. 读取并显示原始图像同样需要先读取原始图像,并将其显示出来。

2. 灰度化处理由于霍夫变换只能处理灰度图像,因此需要对原始图像进行灰度化处理。

可以使用“rgb2gray”函数实现。

3. 边缘检测利用“edge”函数对灰度化后的图像进行边缘检测,得到边缘图像。

4. 霍夫变换使用“houghcircles”函数对边缘图像进行霍夫变换,并得到圆形参数空间矩阵“centers”。

5. 绘制圆形利用得到的圆形参数,可以使用“viscircles”函数绘制出检测到的圆形。

五、总结Matlab中提供了丰富的霍夫变换函数,可以方便地实现直线、圆等形状的检测。

用点Hough变换实现圆检测的方法

用点Hough变换实现圆检测的方法

图像中圆的检测及其参数确定是计算机视觉和模式识 别中一项重要任务。常用的圆检测技术有形状分析法、环路 积分微分法[1]、圆Hough变换(CHT)[2]等。CHT是目前应用 最为广泛的圆检测方法,该方法的最大特点是可靠性高,在 噪声、变形、甚至部分区域丢失的状态下仍然能取得理想的 结果。但该方法的缺点是计算复杂,资源需求大。 Davies[3] 利用过圆周一点且与该点切线垂直的线通过圆心的特点,将 CHT转变成直线Hough变换(SLHT )。但由于噪声的影响 及圆周的数字化误差,难以保证梯度方向的准确性,在信噪 比低的情况下该方法难以实用。Ioannou等[4]根据弦的中垂线 通过圆心的性质,用SLHT确定圆的参量。目前的方法将传 统CHT三维搜索空间降低到二维,但在二维空间搜索时计算 复杂度仍然较高。为此,我们对CHT进行了改进,利用圆周 上任意两条不平行弦的中垂线相交与圆心的性质,同时选取 3 点,将搜索空间从三维减低到一维——我们称之为点 Hough变换(PHT),进一步降低了计算复杂性。另外,在 统计时只包括已计算出的交点,而不是整个变量取值范围, 提高了效率。以下将详细阐述PHT方法。
设图像中有N个待分析点,如果选择所有的组合,则有
N ( N − 1)( N − 2) 个点组。应用中,先去除噪声和无效点, 后选 6
∆ = x − xc + y − yc + r − rc 。图4中分别列出了比较结果。
为了便于观察,图4中I-SLHT和PHT的时间值已乘以 1000。 从图中可见,随着噪声点的增加, CHT处理的点增多, 处理速 度近似反比下降,但I-SLHT和PHT的速度与噪声点数无关, PHT速度最快。在检测精度上,当噪声和信号点数比小于 22 时,PHT 和其他两种方法具有同样的精度,且检测结果稳 定。但噪声继续增强时,PHT和I-SLHT一样结果急剧变坏, 无法实用。 一般情况下,实际图像中的噪声强度远小于上述使PHT 变坏的情形。图 5 中用PHT做眼睛瞳孔检测的结果说明了 PHT的实用性。图像的大小为256×256。

【matlab编程代做】圆形物体识别程序硬币等圆形物体

【matlab编程代做】圆形物体识别程序硬币等圆形物体

% get templates for circles at all radii - these specify accumulator % elements to increment relative to a given feature tempR = []; tempC = []; tempRad = []; for i = 1:nradii
peaks = circle_houghpeaks(h, radii, 'nhoodxy', 15, 'nhoodr', 21, 'npeaks', 10);
%% Look at the results % We draw the circles found on the image, using both the positions and the % radii stored in the |peaks| array. The |circlepoints| function is % convenient for this - it is also used by |circle_hough| so comes with it.
error('Unrecognised option'); end
% get indices of non-zero features of b [featR, featC] = find(b);
% set up accumulator array - with a margin to avoid need for bounds checking
% Copyright David Young 2008, 2010
% argument checking opts = {'same' 'normalise'}; error(nargchk(2, 2+length(opts), nargin, 'struct'));

hough变换检测圆的matlab程序

hough变换检测圆的matlab程序

hough变换检测圆的matlab程序function [y0detect,x0detect,Accumulator] =houghcircle(Imbinary,r,thresh)%HOUGHCIRCLE - detects circles with specific radius in a binary image.%%Comments:% Function uses Standard Hough Transform to detect circles in a binary image.% According to the Hough Transform for circles, each pixel in image space% corresponds to a circle in Hough space and vise versa.% upper left corner of image is the origin of coordinate system.%%Usage: [y0detect,x0detect,Accumulator] =houghcircle(Imbinary,r,thresh)%%Arguments:% Imbinary - a binary image. image pixels that have value equal to 1 are% interested pixels for HOUGHLINE function.% r - radius of circles.% thresh - a threshold value that determines the minimum number of% pixels that belong to a circle in image space. threshold must be % bigger than or equal to 4(default).%%Returns:% y0detect - row coordinates of detected circles.% x0detect - column coordinates of detected circles.% Accumulator - the accumulator array in Hough space.%%Written by :% Amin Sarafraz% Photogrammetry & Computer Vision Devision% Geomatics Department,Faculty of Engineering% University of Tehran,Iran%*********************.ac.ir%%May 5,2004 - Original version%November 24,2004 - Modified version,faster and better performance if nargin == 2thresh = 4;elseif thresh < 4error('treshold value must be bigger or equal to 4');returnend%VotingAccumulator = zeros(size(Imbinary)); [yIndex xIndex] = find(Imbinary); for cnt = 1:length(xIndex)low=x-r;high=x+r;if (low<1) low=1; endif (high>size(Imbinary,2)) high=size(Imbinary,2); end for x0 = low:highy01 = y-sqrt(r^2-(x-x0)^2);y02 = y+sqrt(r^2-(x-x0)^2);y01 = round(y01); y02 = round(y02);if y01 < size(Imbinary,1) & y01 >= 1Accumulator(y01,x0) = Accumulator(y01,x0)+1;endif y02 < size(Imbinary,1) & y02 >= 1Accumulator(y02,x0) = Accumulator(y02,x0)+1;endend%% low=xIndex(cnt)-r;% high=xIndex(cnt)+r;% if (low<1) low=1; end% if (high>size(Imbinary,2)) high=size(Imbinary,2);end% for x0 = low:high% y01 =yIndex(cnt)-sqrt(r^2-(xIndex(cnt)-x0)^2);% y02 =yIndex(cnt)+sqrt(r^2-(xIndex(cnt)-x0)^2);% y01 = round(y01); y02 = round(y02);% if y01 < size(Imbinary,1) & y01 >= 1% Accumulator(y01,x0) = Accumulator(y01,x0)+1;% end% if y02 < size(Imbinary,1) & y02 >= 1% Accumulator(y02,x0) = Accumulator(y02,x0)+1;% end% endend% Finding local maxima in Accumulatory0detect = []; x0detect = [];AccumulatorbinaryMax = imregionalmax(Accumulator);[Potential_y0 Potential_x0] = find(AccumulatorbinaryMax == 1); Accumulatortemp = Accumulator - thresh;for cnt = 1:length(Potential_y0)ifAccumulatortemp(Potential_y0(cnt),Potential_x0(cnt)) >= 0y0detect = [y0detect;Potential_y0(cnt)];x0detect = [x0detect;Potential_x0(cnt)];endend。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
% bigger than or equal to 4(default).
%
%Returns:
% y0detect - row coordinates of detected circles.
% x0detect - column coordinates of detected circles.
Accumulatortemp = Accumulator - thresh;
for cnt = 1:length(Potential_y0)
if Accumulatortemp(Potential_y0(cnt),Potential_x0(cnt)) &gt;= 0
y0detect = [y0detect;Potential_y0(cnt)];
%November 24,2004 - Modified version,faster and better performance
if nargin == 2
thresh = 4;
elseif thresh &lt; 4
error(&#39;treshold value must be bigger or equal to 4&#39;);
end
end
%
% low=xIndex(cnt)-r;
% high=xIndex(cnt)+r;
% if (low&lt;1) low=1; end
% if (high&gt;size(Imbinary,2)) high=size(Imbinary,2); end
% Accumulator(y02,x0) = Accumulator(y02,x0)+1;
% end
% end
end
% Finding local maxima in Accumulator
];
%
%Comments:
% Function uses Standard Hough Transform to detect circles in a binary image.
% According to the Hough Transform for circles, each pixel in image space
%
%Arguments:
% Imbinary - a binary image. image pixels that have value equal to 1 are
% interested pixels for HOUGHLINE function.
% for x0 = low:high
% y01 = yIndex(cnt)-sqrt(r^2-(xIndex(cnt)-x0)^2);
% y02 = yIndex(cnt)+sqrt(r^2-(xIndex(cnt)-x0)^2);
% y01 = round(y01); y02 = round(y02);
x0detect = [x0detect;Potential_x0(cnt)];
end
end
if (high&gt;size(Imbinary,2)) high=size(Imbinary,2); end
for x0 = low:high
y01 = y-sqrt(r^2-(x-x0)^2);
y02 = y+sqrt(r^2-(x-x0)^2);
y01 = round(y01); y02 = round(y02);
if y01 &lt; size(Imbinary,1) &amp; y01 &gt;= 1
Accumulator(y01,x0) = Accumulator(y01,x0)+1;
end
if y02 &lt; size(Imbinary,1) &amp; y02 &gt;= 1
Accumulator(y02,x0) = Accumulator(y02,x0)+1;
% Accumulator - the accumulator array in Hough space.
%
%Written by :
% Amin Sarafraz
% Photogrammetry &amp; Computer Vision Devision
% corresponds to a circle in Hough space and vise versa.
% upper left corner of image is the origin of coordinate system.
%
%Usage: [y0detect,x0detect,Accumulator] = houghcircle(Imbinary,r,thresh)
return
end
%Voting
Accumulator = zeros(size(Imbinary));
[yIndex xIndex] = find(Imbinary);
for cnt = 1:length(xIndex)
low=x-r;
high=x+r;
if (low&lt;1) low=1; end
AccumulatorbinaryMax = imregionalma
x(Accumulator);
[Potential_y0 Potential_x0] = find(AccumulatorbinaryMax == 1);
function [y0detect,x0detect,Accumulator] = houghcircle(Imbinary,r,thresh)
%HOUGHCIRCLE - detects circles with specific radius in a binary image.
% Geomatics Department,Faculty of Engineering
% University of Tehran,Iran
% sarafraz@geomatics.ut.ac.ir
%
%May 5,2004 - Original version
% if y01 &lt; size(Imbinary,1) &amp; y01 &gt;= 1
% Accumulator(y01,x0) = Accumulator(y01,x0)+1;
% end
% if y02 &lt; size(Imbinary,1) &amp; y02 &gt;= 1
% r - radius of circles.
% thresh - a threshold value that determines the minimum number of
% pixels that belong to a circle in image space. threshold must be
相关文档
最新文档