最小二乘法椭圆拟合

博客介绍了最小二乘法椭圆拟合,给出平面任意位置椭圆方程,以椭圆轮廓上测量点依据最小二乘原理确定目标函数,通过解方程得到方程参数值,还可根据几何知识算出椭圆五个参数,最后提及有对应的Matlab程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最小二乘法椭圆拟合

设平面任意位置椭圆方程为:
x^2+Axy+By^2+Cx+Dy+E=0
设P_i (x_i,y_i )(i=1,2,…,N)为椭圆轮廓上的N(N≥5) 个测量点,依据最小二乘原理,所拟合的目标函数为:
这里写图片描述
欲使F为最小,需使
这里写图片描述
由此可以得方程:
这里写图片描述
解方程可以得到A,B,C,D,E的值。
根据椭圆的几何知识,可以计算出椭圆的五个参数:位置参数(θ,x_0,y_0 )以及形状参数(a,b)。
这里写图片描述


matlab程序

function [J,x0, y0, L_axis, S_axis, phi] = ellipse_fit_x(x,y)

[N,N1] = size(x);
x = x(:);
y = y(:);
% % x^2+a*x*y+b*y^2+c*x+d*y+e = 0;
M = [sum(x.^2.*y.^2) sum(x.*y.^3) sum(x.^2.*y) sum(x.*y.^2) sum(x.*y)
     sum(x.*y.^3) sum(y.^4) sum(x.*y.^2) sum(y.^3) sum(y.^2)
     sum(x.^2.*y) sum(x.*y.^2) sum(x.^2) sum(x.*y) sum(x)
     sum(x.*y.^2) sum(y.^3) sum(x.*y) sum(y.^2) sum(y)
     sum(x.*y) sum(y.^2) sum(x) sum(y) N] ;
 B = -[sum(x.^3.*y) sum(x.^2.*y.^2) sum(x.^3) sum(x.^2.*y) sum(x.^2)]';

g = M\B;
[a,b,c,d,e] = deal(g(1),g(2),g(3),g(4),g(5));
J = [a,b,c,d,e] ;
delta = a^2-4*b; 
x0 = (2*b*c-a*d)/delta;
y0 = (2*d-a*c)/delta;
nom = 2 * (a*c*d - b*c^2 - d^2 + 4*b*e - a^2*e);
s = sqrt(a^2+(1-b)^2);

% s1 = nom/(delta*(b-s+1));
% s2 = nom/(delta*(b+s+1));

% if s1<0 ||s2<0
%    return
% end
a_prime = sqrt(nom/(delta*(b-s+1))); 
b_prime = sqrt(nom/(delta*(b+s+1))); 
% nom = b*c^2-a*c*d +d^2 - 4*b*e+ a^2*e;
% s = sqrt(a^2+(1-b)^2);
% a_prime = sqrt((nom/delta)*(2*(b+s+1)/delta)); 
% b_prime = sqrt((nom/delta)*(2*(b-s+1)/delta)); 

L_axis = max(a_prime, b_prime); 
S_axis = min(a_prime, b_prime); 
% phi = atan(sqrt((a_prime^2-b_prime^2*b)/(a_prime^2*b-b_prime^2)));

phi = 0.5*atan(a/(1-b));
%  if (a_prime<b_prime) 
%       phi = pi/2 - phi;

% end

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值