文章目录

  • 直接最小二乘法拟合椭圆
    • 椭圆方程
    • 优化目标
    • 拉格朗日函数
  • 更早的一种直接拟合法
    • 优化目标
    • 拉格朗日函数
    • 筛选符合要求的特征向量
    • 根据椭圆一般方程求解椭圆参数
  • Matlab代码
    • 算法1:
    • 算法2:
  • 参考链接

直接最小二乘法拟合椭圆

利用最小二乘算法构造方程,使用拉格朗日乘子进行求解

椭圆方程

Ax2+Bxy+Cy2+Dx+Ey+F=0Ax^2+Bxy+Cy^2+Dx+Ey+F=0 Ax2+Bxy+Cy2+Dx+Ey+F=0

优化目标

令W=[A,B,C,D,E,F]⊤W=\left[A,B,C,D,E,F\right]^\topW=[A,B,C,D,E,F]⊤,X=[x2,xy,y2,x,y,1]⊤X=\left[x^2,xy,y^2,x,y,1\right]^\topX=[x2,xy,y2,x,y,1]⊤,则优化目标为
min⁡∥W⊤X∥2=W⊤XX⊤Ws.t.W⊤HW>0\min\left\|{W^\top X }\right\|^2 =W^\top X X^\top W\\ s.t. \quad W^\top H W>0 min∥∥​W⊤X∥∥​2=W⊤XX⊤Ws.t.W⊤HW>0
其中H=[0020000−10000200000000000000000000000]H = \begin{bmatrix} 0 & 0 & 2 & 0 & 0 & 0 \\ 0 & -1 & 0 & 0 & 0 & 0 \\ 2 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 & 0 & 0 \\ \end{bmatrix} H=⎣⎢⎢⎢⎢⎢⎢⎡​002000​0−10000​200000​000000​000000​000000​⎦⎥⎥⎥⎥⎥⎥⎤​
W⊤HW>0\quad W^\top H W>0W⊤HW>0是椭圆参数约束4AC−B2>04AC-B^2>04AC−B2>0

由于∥W⊤X∥2=0\left\|{W^\top X }\right\|^2=0∥∥​W⊤X∥∥​2=0时,WWW可以有一个缩放因子,即所有W′=αWW^\prime = \alpha WW′=αW也同样满足条件,因此我们让W⊤HW=1\quad W^\top H W=1W⊤HW=1

于是优化目标变为:
min⁡∥W⊤X∥2=W⊤XX⊤Ws.t.W⊤HW=1\min\left\|{W^\top X }\right\|^2 =W^\top X X^\top W\\ s.t. \quad W^\top H W=1 min∥∥​W⊤X∥∥​2=W⊤XX⊤Ws.t.W⊤HW=1

拉格朗日函数

构造拉格朗日函数
L(W,λ)=W⊤XX⊤W−λ(W⊤HW−1)L\left(W,\lambda\right)=W^\top X X^\top W-\lambda \left( W^\top H W-1\right) L(W,λ)=W⊤XX⊤W−λ(W⊤HW−1)
对其求导得零:
∂L∂W=0\frac{{\partial L}}{{\partial W}} = 0 ∂W∂L​=0

XX⊤W−λHW=0⇒XX⊤W=λHWXX^\top W-\lambda HW = 0 \Rightarrow XX^\top W=\lambda HW XX⊤W−λHW=0⇒XX⊤W=λHW
令S=XX⊤S=XX^\topS=XX⊤,则SW=λHWSW=\lambda HWSW=λHW,通过求解广义特征向量可以得到6个可能的备选WWW。然后需要用到W⊤HW=1W^\top H W=1W⊤HW=1这个条件来筛选合格的WWW。由于uWuWuW也满足SuW=λHuWSuW=\lambda HuWSuW=λHuW,要使uW⊤HuW=1uW^\top HuW=1uW⊤HuW=1则u=1W⊤HW=λW⊤SWu=\sqrt{\frac{1}{W^\top HW}}=\sqrt{\frac{\lambda}{W^\top SW}}u=W⊤HW1​​=W⊤SWλ​​,由于SSS是正定矩阵,所以λ>0{\lambda>0}λ>0。因此在特征值大于0的特征向量里面选出那些实特征向量即可满足要求,并计算对应的缩放系数uuu。详见论文"Direct least square fitting of ellipses"。

如果不求广义特征向量,由于SSS为正定矩阵,也可以将SSS的逆乘到左右两边,得
S−1HW=1λW{S^{ - 1}}HW = \frac{1}{\lambda }W S−1HW=λ1​W
这就转换为求解特征向量的问题。

更早的一种直接拟合法

优化目标

min⁡∥W⊤X∥2=W⊤XX⊤Ws.t.W⊤W=1\min\left\|{W^\top X }\right\|^2 =W^\top X X^\top W\\ s.t. \quad W^\top W=1 min∥∥​W⊤X∥∥​2=W⊤XX⊤Ws.t.W⊤W=1
这里W⊤W=1W^\top W=1W⊤W=1是为了避免W=0W=0W=0的情形,但也可以看出,这种方法不能保证结果一定是椭圆,可能是其他二次曲线。

拉格朗日函数

构造拉格朗日函数
L(W)=W⊤XX⊤W−λ(W⊤W−1)L\left(W\right)=W^\top X X^\top W-\lambda \left( W^\top W-1\right) L(W)=W⊤XX⊤W−λ(W⊤W−1)
对其求导得零:
∂L∂W=0\frac{{\partial L}}{{\partial W}} = 0 ∂W∂L​=0

XX⊤W−λW=0⇒XX⊤W=λW⇒SW=λWXX^\top W-\lambda W = 0 \Rightarrow XX^\top W=\lambda W \Rightarrow S W=\lambda W XX⊤W−λW=0⇒XX⊤W=λW⇒SW=λW
然后求解SSS的特征向量即可,但由于有6个特征向量,因此需要筛选符合要求的特征向量

筛选符合要求的特征向量

假设得到特征值和特征向量对{λi,vi}\left\{ {{\lambda _i},{v_i}} \right\}{λi​,vi​}

此外,对于椭圆方程
ax2+2hxy+by2+2gx+2fy+c=0ax^2+2hxy+by^2+2gx+2fy+c=0 ax2+2hxy+by2+2gx+2fy+c=0
判别式
Δ=∣ahghbfgfc∣=abc+2fgh−af2−bg2−ch2\Delta=\begin{vmatrix} a&h&g \\ h&b&f \\ g&f&c \\ \end{vmatrix}=abc+2fgh-af^2-bg^2-ch^2 Δ=∣∣∣∣∣∣​ahg​hbf​gfc​∣∣∣∣∣∣​=abc+2fgh−af2−bg2−ch2
当Δ≠0\Delta\ne0Δ̸​=0,且ab−h2>0ab-h^2>0ab−h2>0时为椭圆

条件一:Δ≠0\Delta\ne0Δ̸​=0

条件二:ab−h2>0ab-h^2>0ab−h2>0 或 vi⊤Hvi>0v_i^\top Hv_i>0vi⊤​Hvi​>0

对于实椭圆,Δa+b&lt;0\frac{\Delta}{a+b}&lt;0a+bΔ​<0

条件三:Δa+b&lt;0\frac{\Delta}{a+b}&lt;0a+bΔ​<0

符合上面三个条件的特征向量可以作为椭圆方程的参数

还有另一种筛选方法,但不如上述方法严格,由于W⊤XX⊤WW^\top XX^\top WW⊤XX⊤W为二次误差,那么使二次误差最小的特征向量应该是椭圆的参数向量。由于
XX⊤W=λW⇒W⊤XX⊤W=λW⊤WXX^\top W=\lambda W \Rightarrow W^\top XX^\top W = \lambda W^\top W XX⊤W=λW⇒W⊤XX⊤W=λW⊤W
而 W⊤HW&gt;0W^\top H W&gt;0W⊤HW>0,所以最小的特征值λi\lambda_iλi​对应的特征向量即为椭圆参数向量。

根据椭圆一般方程求解椭圆参数

椭圆方程:
Ax2+Bxy+Cy2+Dx+Ey+F=0Ax^2+Bxy+Cy^2+Dx+Ey+F=0 Ax2+Bxy+Cy2+Dx+Ey+F=0
几何中心:
Xc=BE−2CD4AC−B2Yc=BD−2AE4AC−B2\begin{aligned} X_c&amp;=\frac{BE-2CD}{4AC-B^2}\\ Y_c&amp;=\frac{BD-2AE}{4AC-B^2} \end{aligned} Xc​Yc​​=4AC−B2BE−2CD​=4AC−B2BD−2AE​​
长半轴短半轴:
A2=2(AXc2+CYc2+BXcYc−F)A+C+(A−C)2+B2B2=2(AXc2+CYc2+BXcYc−F)A+C−(A−C)2+B2\begin{aligned} A^2 = \frac{2\left(AX_c^2+CY_c^2+BX_cY_c-F\right)}{A+C+\sqrt{\left(A-C\right)^2+B^2}}\\ B^2 = \frac{2\left(AX_c^2+CY_c^2+BX_cY_c-F\right)}{A+C-\sqrt{\left(A-C\right)^2+B^2}} \end{aligned} A2=A+C+(A−C)2+B2​2(AXc2​+CYc2​+BXc​Yc​−F)​B2=A+C−(A−C)2+B2​2(AXc2​+CYc2​+BXc​Yc​−F)​​
长轴倾角:
θ=12arctan⁡BA−C\theta=\frac{1}{2}\arctan\frac{B}{A-C} θ=21​arctanA−CB​
上述方法有可能求出来的是短轴的倾角,因为公式并没有区分两个轴的长短,更稳妥的算法如下方python代码所示:

#A*x.^2 + B*x.*y + C*y.^2 + D*x + E*y + F
def solve_ellipse(A,B,C,D,E,F):Xc = (B*E-2*C*D)/(4*A*C-B**2)Yc = (B*D-2*A*E)/(4*A*C-B**2)FA1 = 2*(A*Xc**2+C*Yc**2+B*Xc*Yc-F)FA2 = np.sqrt((A-C)**2+B**2)MA = np.sqrt(FA1/(A+C+FA2)) #长轴SMA= np.sqrt(FA1/(A+C-FA2)) if A+C-FA2!=0 else 0#半长轴if B==0 and F*A<F*C:Theta = 0elif B==0 and F*A>=F*C:Theta = 90elif B!=0 and F*A<F*C:alpha = np.arctan((A-C)/B)*180/np.piTheta = 0.5*(-90-alpha) if alpha<0 else 0.5*(90-alpha)else:alpha = np.arctan((A-C)/B)*180/np.piTheta = 90+0.5*(-90-alpha) if alpha<0 else 90+0.5*(90-alpha)if MA<SMA:MA,SMA = SMA,MAreturn [Xc,Yc,MA,SMA,Theta]

Matlab代码

生成椭圆散点数据

%% parameters of the true ellipse
t = 0:1:120;
xs = 6*cosd(t);
ys = 21*sind(t);
noise = randn(2,length(xs))*0.5;
xs = xs+noise(1,:);
ys = ys+noise(2,:);
M_z = rotz(10);
M_z = M_z(1:2,1:2);
new_X = M_z*[xs; ys];
xs = new_X(1,:)+5;
ys = new_X(2,:)+4;
figure(1)
clf
scatter(xs,ys,[],'.');


拟合椭圆

X = [xs.^2;xs.*ys;ys.^2;xs;ys;ones(1,length(xs))];
H = zeros(6);
H(1,3)=2;
H(3,1)=2;
H(2,2)=-1;
S = X*X';

算法1:

[V,L] = eig(S,H)
L = diag(L);

绘制椭圆

for i=1:6if L(i)<=0continue;endW = V(:,i);if W'*H*W<0continueendW = sqrt(1/(W'*H*W))*WA = W(1); B = W(2); C = W(3); D = W(4); E = W(5); F = W(6); funs = @(x,y) A*x.^2 + B*x.*y + C*y.^2 + D*x + E*y + F; figure; hold on; scatter(xs,ys,[],'.'); fimplicit(funs)Xc = (B*E-2*C*D)/(4*A*C-B^2)Yc = (B*D-2*A*E)/(4*A*C-B^2)MA = sqrt(2*(A*Xc^2+C*Yc^2+B*Xc*Yc-F)/(A+C+sqrt((A-C)^2+B^2)))SMA= sqrt(2*(A*Xc^2+C*Yc^2+B*Xc*Yc-F)/(A+C-sqrt((A-C)^2+B^2)))
end


Xc = 4.8793
Yc = 15.3049
MA = 3.5116
SMA = 10.5489

算法2:

[V,L] = eig(S)
E = zeros(1,6)
for i=1:size(V,2)E(i) = V(:,i)'*S*V(:,i);
end
E
[~,I] = min(E);
W = V(:,I)


上面是二次误差最小的二次曲线,下面是二次误差第二小的二次曲线,一个是双曲线,一个是抛物线,明显不符合要求。

因为散点只取了一小段,所以两个算法精度都很差,若是比较完整的数据,则两个算法结果差不多。


参考链接

一般方程求解椭圆
二次曲线判别
椭圆基础知识

直接最小二乘法拟合椭圆相关推荐

  1. 最小二乘法拟合椭圆(椭圆拟合线)

    参考文章: 最小二乘法拟合椭圆--MATLAB和Qt-C++实现 https://blog.csdn.net/sinat_21107433/article/details/80877758 以上文章中 ...

  2. c++椭圆最小二乘法原理_利用最小二乘法拟合椭圆方程的理论推导,附有matlab代码...

    为了很好的进行椭圆方程拟合,本文先对椭圆基本知识进行复习,后进行非标准椭圆方程拟合公式推导,最后有matlab代码的实现. 1. 用最小二乘法做椭圆拟合 1.1. 椭圆标准方程 对椭圆印象最深的就是高 ...

  3. 最小二乘法拟合椭圆——MATLAB和Qt-C++实现

    本小节Jungle尝试用最小二乘法拟合椭圆,并用MATLAB和C++实现. 1.理论知识 平面上任意位置的一个椭圆,其中心坐标为(x0,y0),半长轴a,半短轴b,长轴偏角为θ,方程通式为 其中 在原 ...

  4. 椭圆 —— 从理论推导到最小二乘法拟合

    前言 椭圆在高中数学里就开始提到,都是从标准方程开始如: x2a2+y2b2=1(a>b>0)\frac{x^2}{a^2}+\frac{y^2}{b^2}=1(a>b>0) ...

  5. 最小二乘法实现椭圆拟合

    本文仅使用Eigen库,使用C++手推最小二乘法实现椭圆拟合 首先定义平面点的结构体: struct Point2d {double u;double v;Point2d() {u = -1;v = ...

  6. 迭代最小二乘拟合椭圆

    迭代最小二乘拟合椭圆 //二维点坐标 struct P2d {double x = 0.0;//横坐标double y = 0.0;//纵坐标double angle = 0.0;//角度int nu ...

  7. matlab 最小二乘法拟合_机器学习十大经典算法之最小二乘法

    点击上方"计算机视觉cv"即可"进入公众号" 重磅干货第一时间送达 最小二乘法概述 最小二乘法(又称最小平方法)是一种数学优化技术.它通过最小化误差的平方和寻找 ...

  8. python散点图拟合曲线-Python解决最小二乘法拟合并绘制散点图

    问题背景 最近物理老师让用Excel弄一个最小二乘法拟合然后弄出方程来求玻尔兹曼常数.无奈发现Linux上的WPS没有绘图功能无语啊O__O"-,据说绘图功能是用delphi写的,不好做跨平 ...

  9. TensorFlow 最小二乘法拟合

    #程序 不是我写的,注释是我做的,转载请注明"lg土木设计" #最小二乘法拟合,用y=ax+b a=weight b=biases from __future__ import p ...

最新文章

  1. KVM虚拟化笔记(七)------kvm虚拟机VNC的配置
  2. smarty二维foreach示例[顺代一维数组],再次加强版
  3. leetcode107. 二叉树的层次遍历 II
  4. java嵌入式开发neo4j_java-嵌入式Neo4j实际如何工作?
  5. 【干货】微信小程序如何设置背景图片
  6. android java 同步_Android 中的同步
  7. python3 输出系统信息
  8. Php与Mysql关系揭秘
  9. 基于Vue学生选课管理系统
  10. 计算机的二课堂成果展示ppt,作品成果展示.ppt
  11. Vacuum tube 真空管/电子管
  12. 淘宝奇葩店铺:一个人的皇冠店|视频
  13. 利用全加器实现7段数码管_单片机入门:LED数码管基础
  14. 初识 Arm 处理器
  15. 联想计算机CDROM启动,光驱启动,联想电脑光驱启动
  16. KMIP协议/TTLV格式解码
  17. vue3 出现 Component inside <Transition> renders non-element root node that cannot be animated.
  18. SDUT ACM 多项式求和(基于C语言)
  19. BULK INSERT如何将大量数据高效地导入SQL Server
  20. 中国大学计算机系写英语论文,计算机专业英语学论文题目 计算机专业英语论文题目怎样取...

热门文章

  1. gaussDB200 单节点安装
  2. 大数据架构师之路-大数据框架大全
  3. Matlab状态模式(State)
  4. Python Flask框架-开发简单博客-项目布局、应用设置
  5. 希尔排序Linux下c 实现
  6. python批量删除文件前缀名_Python3-去除目录中相同的文件名前缀
  7. 第八章 STM32+SGP气体传感器+DHT11温湿度传感器+OLED模块显示室内温湿度、二氧化碳和甲醛浓度
  8. 除尘机器人毕业_【干货】焊接机器人除尘方式
  9. Qt 5入门指南之Qt Quick编程示例
  10. 逆向工程学习笔记(4):fld指令