hough变换检测椭圆的matlab源码[matlab]

合集下载

Hough变换直线检测MatLab代码.doc

Hough变换直线检测MatLab代码.doc

Hough变换直线检测MatLab代码function Img_hough = hough_s(Img, bw)%该函数实现hough变换提取直线的功能。

%输入图像x,运行Z后直接画出直线。

%选择进行Hough变换的图像行%Img为原图像;bw为边缘图像%%[H,W,D]=size(Img);Img_hough = Img;讦D==lchannel = Img_hough;Img_hough = cal(3,channel, channel, channel); end[M,N]=size(bw);%求出图像大小。

%%dtheta=l;drho=l;md=ceil((N+round(sqrt(M A2+N A2)))/drho);%确定网格的最大区域。

ma=ceil(l 8O/dtheta); numrhotheta=zeros(md,ma);%产生计数矩阵。

coordrhotheta=cell( 1,1);% para=cell(l,3);❷II数组相当于c语言中的指针,可动态的改变大小。

for i=l:mdfor j=l:macoordrhotheta{ i,j}=[J;endend%产生空网格。

ymin = 5;ymax = M - 4;for i=ymin:ymaxforj=l:Nif bw(i,j) == 1for k=l:marho=round((j *cos(dtheta*k*pi/180)+i*sin(dtheta*k*pi/180))/drho); %根据直线的法线式表示,计算出平面上不同点的hough变换值。

rho=rho+ceil(N/drho);%可能的最大负值。

numrhotheta(rho+1 ,k)=numrhotheta(rho+1 ,k)+1;%将hough变换值相应位置的计数值加1。

coordrhotheta {rho+ l,k}=[coordrhotheta {rho+ l,k);[ij]];%记录hough变换值相应位置对应的点的坐标。

基于Hough变换的椭圆检测改进算法

基于Hough变换的椭圆检测改进算法

基于Hough变换的椭圆检测改进算法陆路;梁光明;丁建文【摘要】An improved algorithm based on Hough transform is proposed for detection of multi ellipses in image with com-plicated background to cope with the problems of inaccurate position of the ellipse center and overmuch pseudo ellipse. The ac-curacy of the ellipse detection is improved through the developed calculation of parameter space and Hough transform. The true ellipse is distinguished from the pseudo candidate ellipses by using the parameter equation. The experimental results show that the detection method can detect multiple ellipses in the complex environment quickly and accurately,and has strong anti-inter-ference ability.%在背景复杂的图像中,针对多椭圆检测时椭圆中心定位不准、虚假椭圆过多的缺点,提出一种基于Hough变换的改进算法.该算法对参数空间和Hough变换计算的改进提高了椭圆检测的准确度,并利用参数方程判断候选椭圆的真假.实验结果表明,该检测方法具有较强地抗干扰能力,能够在复杂的环境中准确快速地检测出多个椭圆.【期刊名称】《现代电子技术》【年(卷),期】2015(038)016【总页数】3页(P92-94)【关键词】Hough变换;椭圆检测;参数方程;检测方法【作者】陆路;梁光明;丁建文【作者单位】湘潭大学信息工程学院,湖南湘潭 411105;国防科学技术大学电子科学与工程学院,湖南长沙 410075;爱威科技股份有限公司研发中心,湖南长沙410013【正文语种】中文【中图分类】TN911-34;TP391.41椭圆一般性方程为:设椭圆中心为(x0,y0),则椭圆方程变为:式(1)有5个自由参数,文献[8]中CMHT算法采用2步检测法:第1步利用弦中点的几何特性投票统计得到关于椭圆中心的2个参数x0,y0;第2步结合椭圆方程式(2)计算出另外3个参数。

基于Hough变换的椭圆检测算法

基于Hough变换的椭圆检测算法
第 2卷 第 3 8 期 20 0 8年 9月
、 、 、 、 ‘
芜 电 子 擞 术
OP TOEL ECTRON I CHNOLOGY C TE
Vo . 8 No 1 2 .3 S pt 0 e .2 08
研究 与试 制
、 、 }
基于 Ho g u h变换的椭圆检测算法
所得 到 的参数 分 配单元 进行 累积 , 而 降低 了 内存 从 需求 , 同时使 得 R HT 具有 参数 空 间无 限 大 、 数 精 参 度任 意高等优 点 。当用 R HT 处理简 单 图像 时 , 它表
现 出相 当优 异 的性 能 , 但是 随机 采 样会 带 来大 量 无 效 的计算 , 需要维 护一个规 模较大 的统计 链表 , 且 当
并能 良好地 对 图像 中多个椭 圆进行检 测 。
关键词 : u h变换 ;椭 圆检 测 ; 率 ;算法 Ho g 斜
中图分类 号 :T 3 1 4 P 9. 1 文献标 识码 : A 文章编 号 :10 — 8X( 0 8 0 — 1 10 0 54 8 2 0 ) 30 6 —4
An Al rt m fEl p e De e ton Ba e u h Tr s or go ih o l s t c i s d on Ho g an f m i
人员 提 出 了随机 H u h变换 ( T)5 , og RH _ 它采 用 多
到一 的 映射 , 避免 了传统 Ho g u h变换 一 到多 映射 的
庞 大计算 量 :采用 动态 链 表结 构 , 只对 多到 一 映 射

图 1 任 意 椭 圆 示 意 图
Fi . S e c fa b t a y el tc l g 1 k t h o r i r li ia r p

hough变换检测直线原理matlab

hough变换检测直线原理matlab

Hough变换是一种图像处理技术,它可以被用来检测图像中的直线。

Hough变换的原理是通过将图像空间中的像素点转换到参数空间中来对直线进行检测。

在参数空间中,每条直线都可以被表示为一组参数,如直线的斜率和截距。

在matlab中,可以使用hough变换来检测图像中的直线。

下面我们来介绍一下在matlab中如何使用hough变换来检测直线。

1. 预处理图像在使用hough变换之前,首先需要对图像进行预处理。

可以通过灰度化、边缘检测等处理方法来提取出图像中的直线信息,以便于后续的检测。

2. 进行hough变换在matlab中,可以使用函数hough来进行hough变换。

该函数的调用格式为:[H,T,R] = hough(BW)其中,BW是经过预处理的二值图像,H是hough变换的结果矩阵,T和R分别是参数空间中的角度和距离。

3. 检测直线在获得了hough变换的结果矩阵之后,可以使用函数houghpeaks来检测出图像中的直线。

该函数的调用格式为:P = houghpeaks(H,5)其中,H是hough变换的结果矩阵,5表示要检测的直线数量。

4. 获取直线参数一旦检测出了直线,就可以使用函数houghlines来获取直线的参数。

该函数的调用格式为:lines = houghlines(BW,T,R,P)其中,BW是经过预处理的二值图像,T和R分别是参数空间中的角度和距离,P是检测出的直线。

5. 绘制直线可以使用函数imshow来在原图上绘制出检测到的直线。

该函数的调用格式为:imshow(BW)hold onfor k = 1:length(lines)xy = [lines(k).point1; lines(k).point2];plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');endhold off通过以上步骤,就可以在matlab中使用hough变换来检测图像中的直线。

matlab霍夫变换椭圆检测

matlab霍夫变换椭圆检测

matlab霍夫变换椭圆检测Matlab霍夫变换椭圆检测椭圆是一种常见的几何形状,广泛应用于图像处理和计算机视觉领域。

在Matlab中,我们可以利用霍夫变换来检测图像中的椭圆。

本文将介绍如何使用Matlab进行椭圆检测,并探讨一些相关的应用和技巧。

让我们简要回顾一下霍夫变换的原理。

霍夫变换是一种用于检测几何形状的图像处理技术。

它通过在参数空间中进行累加来寻找图像中的特定形状。

对于直线检测,我们可以使用霍夫变换来找到直线的参数(斜率和截距)。

类似地,对于椭圆检测,我们可以使用霍夫变换来找到椭圆的参数(中心坐标、长轴和短轴)。

在Matlab中,椭圆检测可以通过调用`imfindcircles`函数来实现。

该函数基于霍夫变换的思想,可以自动检测图像中的椭圆。

使用该函数时,我们需要指定一些参数,如灰度阈值、半径范围等。

根据具体的应用场景,我们可以调整这些参数以获得最佳的检测结果。

除了`imfindcircles`函数,Matlab还提供了其他一些函数和工具箱,用于椭圆检测和相关的图像处理任务。

例如,可以使用`fit_ellipse`函数来拟合椭圆并获取其参数。

此外,Matlab的图像处理工具箱还提供了一些用于椭圆检测的函数,如`ellipse_detection`和`ellipse_fit`等。

椭圆检测在许多领域都有广泛的应用。

例如,在医学图像处理中,椭圆检测可以用于检测和分析肿瘤的形状和大小。

在工业领域,椭圆检测可以用于检测和测量物体的形状和轮廓。

此外,椭圆检测还可以应用于计算机视觉中的目标跟踪、运动分析等任务。

在进行椭圆检测时,我们还需要注意一些技巧和注意事项。

首先,图像预处理是非常重要的。

通常,我们需要对图像进行平滑处理、边缘检测等操作,以提高椭圆检测的准确性和鲁棒性。

其次,参数的选择对于椭圆检测结果的影响非常大。

我们需要根据具体的图像和应用场景来选择合适的参数,以获得最佳的检测效果。

此外,对于复杂的图像和场景,可能需要使用更高级的算法和技术来进行椭圆检测。

数字图像处理—Hough变换直线检测,matlab实现

数字图像处理—Hough变换直线检测,matlab实现

数字图像处理—Hough变换直线检测,matlab实现实验八 Hough变换直线检测一、实验目的理解Hough变换的原理,了解其应用;掌握利用Hough变换进行直线检测的处理过程及编程方法。

二、实验内容利用Hough变换检测直线通常先进行边缘检测,得到只包含边缘的二值图像。

再通过Hough变换,在参数空间检测图像共线点的数量得到直线参数,从而实现直线检测。

1、读入图像(图像需有直线或直线性边缘)2、进行图像边缘,得到二值图像3、实现Hough变换,检测出图像中的直线方程4、输出结果三、实验要求1、编写代码,完成各项实验内容2、总结实验中遇到问题及解决方案,书写实验报告%Hough变换clc;clear;close all f=imread('line.bmp'); %若是彩色图片转灰度化if length(size(f))>2f=rgb2gray(f);end%figure(1)subplot(121);imshow(f); %利用edge函数进行边缘检测j=edge(f,'Sobel');subplot(122);imshow(j); [row,col]=size(j);pinfang=round((row*row+col*col)^0.5);A=zeros(2*pinfang,180);for m=1:rowfor n=1:colif j(m,n)>0for thera=1:180r=thera/180*pi; %角度转弧度rho=round(m*cos(r)+n*sin(r));%ρ=cosθ+sinθrho=rho+pinfang+1;%-l:l转换到1:2l+1A(rho,thera)=A(rho,thera)+1;endendendend[rho,thera]=find(A>40);%交点超过60条线的点,ma,na为参数空间的坐标点nma=length(rho);for i=1:nmahold onm=1:row;%rho=ma(i)-1;r=thera(i)/180*pi;n=(rho(i)-pinfang-m*cos(r))/(0.00001+sin(r));plot(n,m,'r'); end。

边缘检测与Hough变换实验报告Matlab

边缘检测与Hough变换实验报告Matlab

边缘检测与Hough变换实验目的:写一段代码实现一幅图像,其中分为以下两个步骤1.使用Matlab中的canny算子进行边缘检测,可以让使用者交互式的输入不同的Sigma的值实现边缘检测。

2.运用Hough变换来找到最突出的边缘,在图像中找到并画出最长的直线。

实验原理:canny算子边缘检测的基本原理是:采用二维高斯函数的任一方向上的一阶方向导数为噪声滤波器,通过与图像f(x,y)卷积进行滤波,然后对滤波后的图像寻找图像梯度的局部极大值,以确定图像边缘。

Canny边缘检测算子是一种最优边缘检测算子。

其实现步骤如下:1)用高斯滤波器平滑图像2)计算滤波后图像梯度的幅值和方向3)对梯度幅值应用非极大值抑制,其过程为找出图像梯度中的局部极大值点,把其他非局部极大值置零,以得到细化的边缘;4)再用双阈值算法检测和连接边缘;使用canny算子的edge函数调用格式为BW=edge(I,'canny');BW=edge(I,'canny',thresh,sigma);BW=edge(I,'canny',thresh);[BW,threshold]=edge(I,'canny',…);2.Hough变换时最常用的直线提取方法,它的基本思想是:将直线上每一个数据点变换为参数平面中的一条直线或曲线,利用共线的数据点对应的参数曲线相交于参数空间中一点的关系,使得直线提取问题转化为计数问题。

Hough变换提取直线的主要优点是受直线中的间隙和噪声影响较小。

Hough检测直线的Matlab实现:在Matlab图像处理工具箱中提供了3个与Hough变换有关的函数,分别为hough函数,houghpeaks函数和houghlines函数。

hough函数的调用格式为[H,theta,rho]=hough(BW);其中BW为二值图像,H为Hough变换矩阵,theta为变换轴间隔θ,rho为元素个数。

Houghpeaks函数是用来提取Hough变换后参数平面上的峰值点。

hough变换提取椭圆

hough变换提取椭圆

hough 变换提取椭圆任意椭圆方程表达式q b a y p b a x ++=+-=θαθαθαθαcos sin sin cos sin sin cos cos步骤:1、读入图片(图片大小为256256⨯),将图片二值化并提取边缘(用edge );2、设置一个5维的参数空间并使初值为0;3、对边缘点集中的每一点进行hough 变换,如果p 、q 在图像范围内,则1)b,a,q,e(p,hough_spac )b,a,q,e(p,hough_spac+=θθ; 4、在参数空间中寻找超过阈值的θ,,,,b a q p ,就是椭圆的参数;5、再对椭圆参数进行求精;(直接讲下面的程序复制到.m 文件里,再改a 、b 、theta 参数 运行) 程序:椭圆提取(图片大小256*256)f1=imread('你的图片.JPG'); %读入要提取椭圆的图片imshow(f1)f2=im2bw(f1,0.72); %二值化f3=im2uint8(f2);figureimshow(f3)BW=edge (f3,'canny',[0,0.7],0.9); %提取边缘figureimshow(BW)[n,m] = size(BW);a_max=80; %a为椭圆长轴,范围需要自己根据图片中的椭圆形状确定a_min=70;b_max=50; %b为椭圆短轴b_min=40;step_a=2; %步长step_b=2;theta_min=-pi/18; %theta倾斜角theta_max=pi/9;step_theta=pi/60;step_angle=1;yz =0.82; %阈值(自己定)size_a = round((a_max-a_min)/step_a)+1;size_b = round((b_max-b_min)/step_b)+1;size_theta=round((theta_max-theta_min)/step_theta)+1;size_angle = round(2*pi/step_angle);hough_space = zeros(m,n,size_a,size_b,size_theta); %设定5维的参数空间并使初值为0[cols,rows] = find(BW); %find—找出非零元素的索引ecount = size(rows);% Hough%图像空间(x,y)对应到参数空间(a,b,p、q、theta)% p = x-a*cos(angle)*cos(theta)+b*sin(angle)*sin(theta)% q = y-a*cos(angle)*sin(theta)-b*sin(angle)*cos(theta)%rows(i)行坐标for i=1:ecount for a=1:size_afor b=1:size_bfor theta=1:size_thetafor k=1:size_angle%hough变换p =round(rows(i)-(a_min+(a-1)*step_a)*cos(k*step_angle)*cos(theta_min+(t heta-1)*step_theta)+(b_min+(b-1)*step_b)*sin(k*step_angle)*sin(theta_ min+(theta-1)*step_theta));q =round(cols(i)-(a_min+(a-1)*step_a)*cos(k*step_angle)*sin(theta_min+(t heta-1)*step_theta)-(b_min+(b-1)*step_b)*sin(k*step_angle)*cos(theta_ min+(theta-1)*step_theta));if(p>0&p<=m&q>0&q<=n)hough_space(p,q,a,b,theta) =hough_space(p,q,a,b,theta)+1;endendendendendend% 搜索超过阈值的聚焦点max_para = max(max(max(max(max(hough_space)))));index = find(hough_space>max_para*yz); %find—找出hough_space中大于阈值的缩引并存入 indexlength = size(index);hough_circle1=zeros(m,n); %确定为椭圆上的点的坐标hough_circle2=zeros(m,n);%找出峰值对应的参数空间坐标for k=1:lengthpar5 =floor((index(k)-1)/(m*n*size_a*size_b))+1;%theta增量par4 =floor((index(k)-(par5-1)*(m*n*size_a*size_b))/(m*n*size_a))+1;%b增量par3 =floor((index(k)-(par5-1)*(m*n*size_a*size_b)-(par4-1)*(m*n*size_a))/( m*n))+1; %a 增量par2 =floor((index(k)-(par5-1)*(m*n*size_a*size_b)-(par4-1)*(m*n*size_a)-(p ar3-1)*(m*n))/m)+1; %p增量par1 =index(k)-(par5-1)*(m*n*size_a*size_b)-(par4-1)*(m*n*size_a)-(par3-1)* (m*n)-(par2-1)*m; %q增量par5=theta_min+(par5-1)*step_theta;par4 = b_min+(par4-1)*step_b;par3 = a_min+(par3-1)*step_a;theta(k)=par5;b(k)=par4;a(k)=par3;q(k)=par2;p(k)=par1;end%求出两圆参数平均值[row1 col1]=size(p);count=1;theta=sort(theta);p=sort(p);q=sort(q);a=sort(a);b=sort(b);THETA(count)=theta(1);P(count)=p(1);A(count)=a(1);B(count)=b(1);Q(count)=q(1);for t=1:1:col1if abs(P(count)-p(t))<=10THETA(count)=(theta(t)+THETA(count))/2;A(count)=(a(t)+A(count))/2;B(count)=(b(t)+B(count))/2;P(count)=(p(t)+P(count))/2;Q(count)=(q(t)+Q(count))/2;elsecount=count+1;THETA(count)=theta(t);A(count)=a(t);B(count)=b(t);P(count)=p(t);Q(count)=q(t);endendTHETAABPQ%绘制椭圆TYZ=zeros(1,2);TYY=zeros(1,2);ct_z=1;ct_y=1;for i=1:ecountifround(((rows(i)-P(1))*cos(THETA(1))+(cols(i)-Q(1))*sin(THETA(1)))^2/( A(1)^2)+(-(rows(i)-P(1))*sin(THETA(1))+(cols(i)-Q(1))*cos(THETA(1)))^ 2/(B(1)^2))<1.5 ...&round(((rows(i)-P(1))*cos(THETA(1))+(cols(i)-Q(1))*sin(THETA(1)))^2/ (A(1)^2)+(-(rows(i)-P(1))*sin(THETA(1))+(cols(i)-Q(1))*cos(THETA(1))) ^2/(B(1)^2))>0.5TYY(ct_y,1)=rows(i);TYY(ct_y,2)=cols(i);hough_circle1(cols(i),rows(i))=1;ct_y=ct_y+1;endifround(((rows(i)-P(2))*cos(THETA(2))+(cols(i)-Q(2))*sin(THETA(2)))^2/( A(2)^2)+(-(rows(i)-P(2))*sin(THETA(2))+(cols(i)-Q(2))*cos(THETA(2)))^ 2/(B(2)^2))<1.5 ...&round(((rows(i)-P(2))*cos(THETA(2))+(cols(i)-Q(2))*sin(THETA(2)))^2/ (A(2)^2)+(-(rows(i)-P(2))*sin(THETA(2))+(cols(i)-Q(2))*cos(THETA(2))) ^2/(B(2)^2))>0.5TYZ(ct_z,1)=rows(i);TYZ(ct_z,2)=cols(i);hough_circle2(cols(i),rows(i))=1;ct_z=ct_z+1;endendfigureimshow(hough_circle1),title('¼ì²â½á¹û')figureimshow(hough_circle2),title('¼ì²â½á¹û')%分别计算两个椭圆的参数[row_TYZ,col_TYZ]=size(TYZ);for i1=1:1:row_TYZWTZ(i1,:)=[TYZ(i1,1)^2 TYZ(i1,1)*TYZ(i1,2) TYZ(i1,2)^2 TYZ(i1,1) TYZ(i1,2) 1; ];end[v_z1,d_z1]=svd(WTZ'*WTZ);v_z1=vpa(v_z1,8)d_z1=double(d_z1);[row_TYY,col_TYY]=size(TYY);for j1=1:1:row_TYYWTY(j1,:)=[TYY(j1,1)^2 TYY(j1,1)*TYY(j1,2) TYY(j1,2)^2 TYY(j1,1) TYY(j1,2) 1; ];end[v_y1,d_y1]=svd(WTY'*WTY);v_y1=vpa(v_y1,8)d_y1=double(d_y1);在原图上绘制拟合椭圆,以查看拟合精度f1=imread('你的图片.JPG');f2=im2bw(f1,0.72);f3=im2uint8(f2);BW=edge (f3,'canny',[0,0.7],0.9);%绘制左边椭圆for i2=1:1:256for j2=1:1:256if0<double(.25527789e-4*i2^2-.62429860e-5*i2*j2+.52621684e-4*j2^2-.8688 7797e-2*i2-.78888347e-2*j2+.99993113)...&double(.25527789e-4*i2^2-.62429860e-5*i2*j2+.52621684e-4*j2^2-.86887 797e-2*i2-.78888347e-2*j2+.99993113)<0.01f1(j2,i2)=0;f2(j2,i2)=0;BW(j2,i2)=1;endendend%绘制右边椭圆for i3=1:1:256for j3=1:1:256if0<double(.46540784e-4*i3^2+.19567656e-4*i3*j3+.10878161e-3*j3^2-.9180 6184e-2*i3-.20209638e-1*j3+.99975361)...&double(.46540784e-4*i3^2+.19567656e-4*i3*j3+.10878161e-3*j3^2-.91806 184e-2*i3-.20209638e-1*j3+.99975361)<0.01f1(j3,i3)=0;f2(j3,i3)=0;BW(j3,i3)=1;endend endfigure imshow(f1) figure imshow(f2) figure imshow(BW)最后效果。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档