1. 程式人生 > >matlab 擬合橢圓

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');

結果:


結果誤差還挺大的~~~~~~