基于直接最小二乘的椭圆拟合(Direct Least Squares Fitting of Ellipses)
算法思想:
算法通过最小化约束条件4ac-b^2 = 1,最小化距离误差。利用最小二乘法进行求解,首先引入拉格朗日乘子算法获得等式组,然后求解等式组得到最优的拟合椭圆。
算法的优点:
a、椭圆的特异性,在任何噪声或者遮挡的情况下都会给出一个有用的结果;
b、不变性,对数据的Euclidean变换具有不变性,即数据进行一系列的Euclidean变换也不会导致拟合结果的不同;
c、对噪声具有很高的鲁棒性;
d、计算高效性。
算法原理:
代码实现(Matlab):
- %
- function a = fitellipse(X,Y)
- % FITELLIPSE Least-squares fit of ellipse to 2D points.
- % A = FITELLIPSE(X,Y) returns the parameters of the best-fit
- % ellipse to 2D points (X,Y).
- % The returned vector A contains the center, radii, and orientation
- % of the ellipse, stored as (Cx, Cy, Rx, Ry, theta_radians)
- %
- % Authors: Andrew Fitzgibbon, Maurizio Pilu, Bob Fisher
- % Reference: "Direct Least Squares Fitting of Ellipses", IEEE T-PAMI,
- %
- % @Article{Fitzgibbon99,
- % author = "Fitzgibbon, A.~W.and Pilu, M. and Fisher, R.~B.",
- % title = "Direct least-squares fitting of ellipses",
- % journal = pami,
- % year = 1999,
- % volume = 21,
- % number = 5,
- % month = may,
- % pages = "476--480"
- % }
- %
- % This is a more bulletproof version than that in the paper, incorporating
- % scaling to reduce roundoff error, correction of behaviour when the input
- % data are on a perfect hyperbola, and returns the geometric parameters
- % of the ellipse, rather than the coefficients of the quadratic form.
- %
- % Example: Run fitellipse without any arguments to get a demo
- if nargin ==
- % Create an ellipse
- t = linspace(,);
- Rx = ;
- Ry = ;
- Cx = ;
- Cy = ;
- Rotation = .; % Radians
- NoiseLevel = .; % Will add Gaussian noise of this std.dev. to points
- x = Rx * cos(t);
- y = Ry * sin(t);
- nx = x*cos(Rotation)-y*sin(Rotation) + Cx + randn(size(t))*NoiseLevel;
- ny = x*sin(Rotation)+y*cos(Rotation) + Cy + randn(size(t))*NoiseLevel;
- % Clear figure
- clf
- % Draw it
- plot(nx,ny,'o');
- % Show the window
- figure(gcf)
- % Fit it
- params = fitellipse(nx,ny);
- % Note it may return (Rotation - pi/) and swapped radii, this is fine.
- Given = round([Cx Cy Rx Ry Rotation*])
- Returned = round(params.*[ ])
- % Draw the returned ellipse
- t = linspace(,pi*);
- x = params() * cos(t);
- y = params() * sin(t);
- nx = x*cos(params())-y*sin(params()) + params();
- ny = x*sin(params())+y*cos(params()) + params();
- hold on
- plot(nx,ny,'r-')
- return
- end
- % normalize data
- mx = mean(X);
- my = mean(Y);
- sx = (max(X)-min(X))/;
- sy = (max(Y)-min(Y))/;
- x = (X-mx)/sx;
- y = (Y-my)/sy;
- % Force to column vectors
- x = x(:);
- y = y(:);
- % Build design matrix
- D = [ x.*x x.*y y.*y x y ones(size(x)) ];
- % Build scatter matrix
- S = D'*D;
- % Build 6x6 constraint matrix
- C(,) = ; C(,) = -; C(,) = ; C(,) = -;
- % Solve eigensystem
- if
- % Old way, numerically unstable if not implemented in matlab
- [gevec, geval] = eig(S,C);
- % Find the negative eigenvalue
- I = find(real(diag(geval)) < 1e-8 & ~isinf(diag(geval)));
- % Extract eigenvector corresponding to negative eigenvalue
- A = real(gevec(:,I));
- else
- % New way, numerically stabler in C [gevec, geval] = eig(S,C);
- % Break into blocks
- tmpA = S(:,:);
- tmpB = S(:,:);
- tmpC = S(:,:);
- tmpD = C(:,:);
- tmpE = inv(tmpC)*tmpB';
- [evec_x, eval_x] = eig(inv(tmpD) * (tmpA - tmpB*tmpE));
- % Find the positive (as det(tmpD) < ) eigenvalue
- I = find(real(diag(eval_x)) < 1e-8 & ~isinf(diag(eval_x)));
- % Extract eigenvector corresponding to negative eigenvalue
- A = real(evec_x(:,I));
- % Recover the bottom half...
- evec_y = -tmpE * A;
- A = [A; evec_y];
- end
- % unnormalize
- par = [
- A()*sy*sy, ...
- A()*sx*sy, ...
- A()*sx*sx, ...
- -*A()*sy*sy*mx - A()*sx*sy*my + A()*sx*sy*sy, ...
- -A()*sx*sy*mx - *A()*sx*sx*my + A()*sx*sx*sy, ...
- A()*sy*sy*mx*mx + A()*sx*sy*mx*my + A()*sx*sx*my*my ...
- - A()*sx*sy*sy*mx - A()*sx*sx*sy*my ...
- + A()*sx*sx*sy*sy ...
- ]';
- % Convert to geometric radii, and centers
- thetarad = 0.5*atan2(par(),par() - par());
- cost = cos(thetarad);
- sint = sin(thetarad);
- sin_squared = sint.*sint;
- cos_squared = cost.*cost;
- cos_sin = sint .* cost;
- Ao = par();
- Au = par() .* cost + par() .* sint;
- Av = - par() .* sint + par() .* cost;
- Auu = par() .* cos_squared + par() .* sin_squared + par() .* cos_sin;
- Avv = par() .* sin_squared + par() .* cos_squared - par() .* cos_sin;
- % ROTATED = [Ao Au Av Auu Avv]
- tuCentre = - Au./(.*Auu);
- tvCentre = - Av./(.*Avv);
- wCentre = Ao - Auu.*tuCentre.*tuCentre - Avv.*tvCentre.*tvCentre;
- uCentre = tuCentre .* cost - tvCentre .* sint;
- vCentre = tuCentre .* sint + tvCentre .* cost;
- Ru = -wCentre./Auu;
- Rv = -wCentre./Avv;
- Ru = sqrt(abs(Ru)).*sign(Ru);
- Rv = sqrt(abs(Rv)).*sign(Rv);
- a = [uCentre, vCentre, Ru, Rv, thetarad];
实验效果:
a、同等噪声条件下,不同长度的样本点,导致的拟合结果,如下所示:
b、相同长度的样本点下,不同噪声的样本点,导致的拟合结果,如下所示:
c、少样本点下,拟合结果如下:
源码下载:
地址: FitEllipse
参考文献:
[1]. Andrew W. Fitzgibbon, Maurizio Pilu and Robert B. Fisher. Direct Least Squares Fitting of Ellipses. 1996.
[2]. http://research.microsoft.com/en-us/um/people/awf/ellipse/
基于直接最小二乘的椭圆拟合(Direct Least Squares Fitting of Ellipses)的更多相关文章
- 基于MATLAB的多项式数据拟合方法研究-毕业论文
摘要:本论文先介绍了多项式数据拟合的相关背景,以及对整个课题做了一个完整的认识.接下来对拟合模型,多项式数学原理进行了详细的讲解,通过对文献的阅读以及自己的知识积累对原理有了一个系统的认识.介绍多项式 ...
- opencv学习之路(27)、轮廓查找与绘制(六)——外接圆、椭圆拟合、逼近多边形曲线、计算轮廓面积及长度、提取不规则轮廓
一.最小外接圆 #include "opencv2/opencv.hpp" #include<iostream> using namespace std; using ...
- 【Matlab&Mathematica】对三维空间上的点进行椭圆拟合
问题是这样:比如有一个地心惯性系的轨道,然后从轨道上取了几个点,问能不能根据这几个点把轨道还原了? 当然,如果知道轨道这几个点的速度的情况下,根据轨道六根数也是能计算轨道的,不过真近点角是随时间变动的 ...
- 基于EM的多直线拟合
作者:桂. 时间:2017-03-22 06:13:50 链接:http://www.cnblogs.com/xingshansi/p/6597796.html 声明:欢迎被转载,不过记得注明出处哦 ...
- 基于EM的多直线拟合实现及思考
作者:桂. 时间:2017-03-22 06:13:50 链接:http://www.cnblogs.com/xingshansi/p/6597796.html 声明:欢迎被转载,不过记得注明出处哦 ...
- Dlib Opencv cv2.fitEllipse用于人眼轮廓椭圆拟合
dlib库的安装以及人脸特征点的识别分布分别在前两篇博文里面 Dlib Python 检测人脸特征点 Face Landmark Detection Mac OSX下安装dlib (Python) 这 ...
- 6、基于highcharts实现的线性拟合,计算部分在java中实现,画的是正态概率图
1.坐标点类 package cn.test.domain; public class Point { double x; double y; public Point(){ } public Poi ...
- C# + Matlab 实现计件工时基于三层BP神经网络的拟合--真实项目
工序工时由该工序的工艺参数决定,有了工时后乘以固定因子就是计件工资.一般参考本地小时工资以及同类小时工资并考虑作业的风险等因素给出固定因子 采用的VS2010 , Matlab2015a 64, 开 ...
- 【翻译】拟合与高斯分布 [Curve fitting and the Gaussian distribution]
参考与前言 英文原版 Original English Version:https://fabiandablander.com/r/Curve-Fitting-Gaussian.html 如何通俗易懂 ...
随机推荐
- 七、springcloud之配置中心Config(二)之高可用集群
方案一:传统作法(不推荐) 服务端负载均衡 将所有的Config Server都指向同一个Git仓库,这样所有的配置内容就通过统一的共享文件系统来维护,而客户端在指定Config Server位置时, ...
- React 学习一 运行
最近项目准备使用React作为前端,主要第一比较火,第二比较小.抽空先来学习一下. 首先下载资源文件:压缩后不到50KB,是挺小的哦. 其中:react.js 是 React 的核心库,react-d ...
- android设备休眠
从上面的连接里面找到了一些资料: 如果一开始就对Android手机的硬件架构有一定的了解,设计出的应用程序通常不会成为待机电池杀手,而要设计出正确的通信机制与通信协议也并不困难.但如果不去了解而盲目设 ...
- 虚拟机 windows xp sp3 原版
原版的镜像:http://www.7xdown.com/Download.asp?ID=3319&URL=http://d5.7xdown.com/soft2/&file=Window ...
- Javascript之浏览器兼容EventUtil
var EventUtil = { //添加事件处理程序 addHandler: function (element, type, handler) { if (element.addEventLis ...
- es6遍历数组forof
- day1作业:编写登录窗口一个文件实现
思路: 1.参考模型,这个作业我参考了linux的登录认证流程以及结合网上银行支付宝等锁定规则: 1)认证流程参考的是Linux的登录:当你输入完用户名密码后再验证用户名是否存在用户是否被锁定,然后在 ...
- mysql 删除重复项
DELETE FROM j_rank_rise_record WHERE id NOT IN ( SELECT id FROM ( SELECT * FROM j_rank_rise_record g ...
- 全面兼容的Iframe 与父页面交互操作
父页面 Father.htm 源码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" & ...
- thinkphp中I()方法的详解
I('post.email','','email'); int boolean float validate_regexp validate_url validate_email validate_i ...