matlab 拟合椭圆

自负而又不自信的人会怎样?

会给你的生活带来怎样的影响?

从昨天到今天,我一直在用matlab做一个拟合椭圆的例子:从一开始,不想借用matlab的函数,到后来,调用lsqcurvefit 和lsqnonlin这两个非线性拟合函数不成功,到最后,还是借了同事的code来看,再反看自己的code,其实也可以拟合出。

问题在于:我打心眼儿里不相信自己能做到,所以当我看到:

p =

   1.0e-06 *

   -0.0000   -0.0000   -0.0000    0.0023    0.0027   -0.5831

类似这样的拟合结果时,我认定了这样的系数是错误的。

    I = imread('ellipse.BMP');
    imshow(I);
    hold on
    [x,y] = ginput(15);
    ellipsefit = @(a,x,y)a(1).*x.*x+a(2).*y.*y+a(3).*x.*y+a(4).*x+a(5).*y+a(6);
    a0 = [1 1 1 1 1 1];
    options = optimoptions('lsqnonlin');
    p = lsqnonlin(@ellipsefit,a0,[],[],options,x,y);   %其实对于这个函数,我还是没有搞得很清楚大哭
    plot(XDATA,YDATA,'xr')
    syms x y
    conic = p(1)*x^2+p(2)*y^2+p(3)*x*y+p(4)*x+p(5)*y+p(6);
    c = ezplot(conic,[0,640],[0,480]);
    set(c, 'Color', 'Green');   

结果:



同事code

I = imread('ellipse.BMP');
Ig = rgb2gray(I);
imshow(Ig);
hold on
conicP = ginput(15);
plot(conicP(:,1)', conicP(:,2)', 'xr');     %drawing sample points
a0 = [1 1 1 1 1 1];
f = @(a,x)a(1)*x(:,1).^2+a(2)*x(:,2).^2+a(3)*x(:,1).*x(:,2)+a(4)*x(:,1)+a(5)*x(:,2)+a(6);
p = nlinfit(conicP, zeros(size(conicP, 1), 1), f, a0);
syms x y
conic = p(1)*x^2+p(2)*y^2+p(3)*x*y+p(4)*x+p(5)*y+p(6);
c = ezplot(conic,[0,1152],[0,648]);
set(c, 'Color', 'Green');

结果:


结果误差还挺大的~~~~~~