椭圆拟合算法
椭圆拟合在医疗图像、工程设计、交通识别、生物识别、人工智能、林火蔓延等领域具有广泛应用,本文总结前人研究综合出基于MATLAB的三种椭圆拟合的算法:直接计算方法,二次多项式拟合方法,标准方程拟合方法。
一,二次多项式拟合方法
利用圆锥曲线二次函数拟合,求算五个参数。关键在于估计的参数单位. p0=[1 1 1 1 1 1]为系数。
% 拟合椭圆型曲线段
close all;
clear; clc; close all;
% 设出圆锥曲线方程
F=@(p,x)p(1)*x(:,1).^2+p(2)*x(:,1).*x(:,2)+p(3)*x(:,2).^2+p(4)*x(:,1)+p(5)*x(:,2)+p(6);%椭圆一般方程
% 离散数据点
Up=xlsread('E:\\Up.xls');%excel文件路径
UpX=Up(:,1);
UpY=Up(:,2);
% p0系数初值
p0=[1 1 1 1 1 1];
warning off
% 拟合系数,最小二乘方法
p =nlinfit(Up,zeros(size(Up,1),1),F,p0);
plot(UpX,UpY,'r.');
hold on;
UpMinx=min(UpX);
UpMaxx=max(UpX);
UpMiny=min(UpY);
UpMaxy=max(UpY);
% 作图
ezplot(@(x,y)F(p,[x,y]),[-1+UpMinx,1+UpMaxx,-1+UpMiny,1+UpMaxy]);
title('曲线拟合');
legend('样本点','拟合曲线');
二,直接计算方法
S=xlsread('E:\\Up.xls');
r=S(:,1);
t=S(:,2);
x=r.*cos((90-t)*pi/180);%转换成直角坐标
y=r.*sin((90-t)*pi/180);%转换成直角坐标
XY=[x,y];
A = EllipseDirectFit(XY);
% A = [a b c d e f]
% ax^2 + bxy + cy^2 + dx + ey + f = 0
function A = EllipseDirectFit(XY);
centroid = mean(XY); % thecentroid of the data set
D1 = [(XY(:,1)-centroid(1)).^2,(XY(:,1)-centroid(1)).*(XY(:,2)-centroid(2)),...
(XY(:,2)-centroid(2)).^2];
D2 = [XY(:,1)-centroid(1),XY(:,2)-centroid(2), ones(size(XY,1),1)];
S1 = D1'*D1;
S2 = D1'*D2;
S3 = D2'*D2;
T = -inv(S3)*S2';
M = S1 + S2*T;
M = [M(3,:)./2; -M(2,:);M(1,:)./2];
[evec,eval] = eig(M);
cond =4*evec(1,:).*evec(3,:)-evec(2,:).^2;
A1 = evec(:,find(cond>0));
A = [A1; T*A1];
A4 =A(4)-2*A(1)*centroid(1)-A(2)*centroid(2);
A5 =A(5)-2*A(3)*centroid(2)-A(2)*centroid(1);
A6 =A(6)+A(1)*centroid(1)^2+A(3)*centroid(2)^2+...
A(2)*centroid(1)*centroid(2)-A(4)*centroid(1)-A(5)*centroid(2);
A(4) = A4; A(5) = A5; A(6) = A6;
A = A/norm(A);
end % EllipseDirectFit
三、标准方程拟合方法
设椭圆拟合方程:f(x,y)=(x-h)²/a²+(y-k)²/b²-1,即椭圆中心为(h,k),长半轴为a,短半轴为b
X=[xi yi]
n=length(X(:,1));
y=ones(n,1);
b=[rand(1) rand(1) rand(1)];
fun=inline('(X(:,1)-a(1)).^2./a(3).^2+(X(:,2)-a(2).^2./a(4).^2-1','a','X');
[a,r,J] = nlinfit(X,y,fun,b);
vpa(a,10)
h=a(1),k=a(2)
b=a(3),a=a(4)