matlab画椭圆为什么会缺失一小段,请教程序为什么无法根据方程画出椭圆

请高手帮忙看看为什么椭圆方程已经拟合出来但画不出来!椭圆拟合的函数来自论坛yanpu帖子的程序。处理之后画出一些直线来,看不见椭圆的影子。

附上程序:

%%%%%%%需找边缘%%%%%%%

I=imread('C:\Documents and Settings\Alex\桌面\新建文件夹\Image006.jpg');

IM=I;

I=rgb2gray(I);

I=imadjust(I);

t=graythresh(I);

I=im2bw(I,t);

I=imfill(I,'holes');

se=strel('disk',6);

I=imdilate(I,se);

I=imfill(I,'holes');

%se=strel('disk',10);

%I=imerode(I,se);

figure;imshow(I);

[b,l]=bwboundaries(I,'noholes');

figure;imshow(IM);hold on

for k=1:length(b)

a= b{k};

plot(a(:,2),a(:,1),'g','LineWidth',1);

end

stats=regionprops(l,'Area','Centroid');

t=0.7;

j=1;k=1;

for i=1:length(b)

c=b{i};

d=diff(c).^2;

p=sum(sqrt(sum(d,2)));

ar=stats(i).Area;

m=4*pi*ar/p^2;

ms=sprintf('2.2f',m);

if m>t

cd=stats(i).Centroid;

x=zeros(length(b{i}),2);

x(:,:)=b{i};

M(j,:)=EllipseDirectFit(x);

j=j+1;

plot(cd(1),cd(2),'+r');

else y=zeros(length(b{i}),2);

y(:,:)=b{i};

N(k,:)=EllipseDirectFit(y);

k=k+1;

end

end

%%%%%%%%%%画椭圆%%%%%%%%%%%%%%%

imshow(IM);hold on;

for i=1:length(M)

a=(2*M(i,1).^2-2*M(i,1)*M(i,3)+M(i,2).^2)/(2*(M(i,1)-M(i,3)));%%消去Ellipse函数中求得的交叉项b,方法是进行坐标轴的旋转

c=(2*M(i,1)*M(i,3)-2*M(i,3).^2-M(i,2).^2)/(2*(M(i,1)-M(i,3)));

z=sqrt((M(i,1)-M(i,3)).^2+M(i,2).^2);

d=(M(i,4)*abs(M(i,1)-M(i,3))+M(i,5)*abs(M(i,2)))/(2*z);

e=(M(i,5)*abs(M(i,1)-M(i,3))-M(i,4)*abs(M(i,2)))/(2*z);

f=M(i,6);

x=-d/(2*a);y=(-e/(2*c));%%椭圆中心

ar=sqrt((d.^2/(4*a)+e.^2/(4*c)-f)/a);%%长轴

br=sqrt((d.^2/(4*a)+e.^2/(4*c)-f)/c);%%短轴

thita=atan(M(i,2)/M(i,1)-M(i,3))/2;%%椭圆旋转角度

t1=0:0.02:pi;

t2=pi:0.02:2*pi;

z1=exp(i*t1);

z2=exp(i*t2);

z1=(ar*real(z1)+i*br*imag(z1))*exp(i*thita);

z2=(ar*real(z2)+i*br*imag(z2))*exp(i*thita);

z1=z1+x+y*i;

z2=z2+x+y*i;

plot(z1,'r');

hold on;

plot(z2,'r');

end

Image006.jpg

(232.16 KB, 下载次数: 5)

2011-7-9 17:09 上传

b4d287d1aacbf0cf95a77c41289acfe6.gif

c5006d1a5b4047f80d42a7082635a87b.gif

ddcd41f75eadb49697cbe1a04776b64f.png

6712fa43d918eeacb445e51bf896eabe.gif

2011-7-9 17:09 上传

点击文件名下载附件

960 Bytes, 下载次数: 15

6712fa43d918eeacb445e51bf896eabe.gif

2011-7-9 17:09 上传

点击文件名下载附件

795 Bytes, 下载次数: 15

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用MATLAB自带的ellipse函数或者自定义函数来绘制椭圆。下面分别介绍两种方法: 1. 使用MATLAB自带的ellipse函数 可以使用MATLAB自带的ellipse函数来绘制椭圆,该函数需要提供椭圆中心坐标、长半轴、短半轴、偏心率和方向角等参数。例如,已知椭圆中心坐标为[1, 2],长半轴为10,短半轴为5,方向角为45°,可以使用以下代码绘制椭圆: ```matlab % 绘制椭圆 center = [1, 2]; % 椭圆中心坐标 a = 10; % 长半轴 b = 5; % 短半轴 e = sqrt(1 - (b/a)^2); % 偏心率 theta = 45; % 方向角 ellipse(center(1), center(2), a, b, theta); ``` 2. 自定义函数绘制椭圆 也可以自定义函数来绘制椭圆。下面是一个自定义函数ellipsefig1的示例代码,该函数可以根据椭圆的一般方程绘制椭圆: ```matlab function h = ellipsefig1(a,b,c,d,e,f,x,y) % 一般椭圆:ax*x+bx*y+c*y*y+d*x+e*y = f P = [a b/2;b/2 c]; delta = b^2-4*a*c; if delta >= 0 warning('这不是一个椭圆') return; end x0 = (b*e-2*c*d)/delta; y0 = (b*d-2*a*e)/delta; r = a*x0^2 + b*x0*y0 +c*y0^2 + f; if r <= 0 warning('这不是一个椭圆') return; end % 计算椭圆参数 A = a; B = b; C = c; D = d; E = e; F = f; % 计算椭圆中心坐标 x0 = (B*E-2*C*D)/(4*A*C-B^2); y0 = (B*D-2*A*E)/(4*A*C-B^2); % 计算椭圆长短半轴 a = sqrt((2*(A*E^2+C*D^2-F*B*D+(B^2-4*A*C)*F))/((B^2-4*A*C)*(-sqrt((A-C)^2+B^2)-(A+C)))); b = sqrt((2*(A*E^2+C*D^2-F*B*D+(B^2-4*A*C)*F))/((B^2-4*A*C)*(sqrt((A-C)^2+B^2)-(A+C)))); % 计算椭圆旋转角度 theta = 0.5*atan((2*B)/(A-C)); % 绘制椭圆 t = linspace(0,2*pi); X = x0 + a*cos(t)*cos(theta) - b*sin(t)*sin(theta); Y = y0 + a*cos(t)*sin(theta) + b*sin(t)*cos(theta); h = plot(X,Y); ``` 使用该函数绘制椭圆的示例代码如下: ```matlab % 绘制椭圆 a = 1; b = 2; c = 1; d = 0; e = 0; f = -1; x = -10:0.1:10; y = -10:0.1:10; [X,Y] = meshgrid(x,y); Z = a*X.^2 + b*X.*Y + c*Y.^2 + d*X + e*Y - f; contour(X,Y,Z,[0,0],'LineWidth',2,'LineColor','r'); hold on; ellipsefig1(a,b,c,d,e,f,x,y); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值