椭圆拟合理论推导和Matlab实现

本文详细介绍了如何使用最小二乘法进行椭圆拟合的理论推导,从建立线性方程组到求解参数,再到Matlab的实现。通过矩阵论中的M-P广义逆求解了椭圆的中心坐标、长径、短径和旋转角度。同时,提供了Matlab代码示例,展示了如何处理数据并绘制拟合的椭圆。

椭圆拟合理论推导和Matlab实现

1 理论推导

前面一篇文章,解决了最小二乘圆拟合的问题。这篇文章将以类似的方法解决椭圆拟合的问题。

首先搞清楚问题,最小二乘拟合椭圆,即输入为散点集 { ( x i , y i ) ∣ x i ∈ R , y i ∈ R } \{(x_i,y_i)|x_i\in \R,y_i\in \R\} { (xi,yi)xiR,yiR},定义新的向量 { X ∣ X = [ x 1   x 2 . . . x n ] T ∈ R n } \{X|X=[x_1\ x_2...x_n]^T\in \R^n\} { XX=[x1 x2...xn]TRn} { Y ∣ Y = [ y 1   y 2 . . . y n ] T ∈ R n } \{Y|Y=[y_1\ y_2...y_n]^T\in \R^n\} { YY=[y1 y2...yn]TRn},求解能够尽可能接近这些点的椭圆。一般斜椭圆具有5个参数,即椭圆中心坐标 ( x 0 , y 0 ) (x_0,y_0) (x0,y0),椭圆长径和短径 R 1 , R 2 R_1,R_2 R1,R2以及坐标轴旋转的角度 ϕ \phi ϕ,只需要求解了这几个参数椭圆就被唯一确定了。那么对于椭圆的求解则至少需要5个独立的方程。即输入的点的个数至少是5个。

然后开始我们正式的推导,我们在中学时代就已经知道,一般的圆锥曲线的隐式方程为:
A x 2 + B x y + C y 2 + D x + E y + 1 = 0 Ax^2+Bxy+Cy^2+Dx+Ey+1=0 Ax2+Bxy+Cy2+Dx+Ey+1=0
其与我们想要参数之间的转换关系是(这个地方的推导比较复杂,不是重点):
{ x 0 = B E − 2 C D 4 A C − B 2 y 0 = B D − 2 A E 4 A C − B 2 R 1 = 2 ( A x 0 2 + C y 0 2 + B x 0 y 0 − 1 ) A + C + ( A − C ) 2 + B 2 R 2 = 2 ( A x 0 2 + C y 0 2 + B x 0 y 0 − 1 ) A + C − ( A − C ) 2 + B 2 ϕ = 1 2 a r c t a n ( B A − C ) \begin{cases} \begin{aligned} x_0&=\frac{BE-2CD}{4AC-B^2}\\ y_0&=\frac{BD-2AE}{4AC-B^2}\\ R_1&=\sqrt{\frac{2(Ax_0^2+Cy_0^2+Bx_0y_0-1)}{A+C+\sqrt{(A-C)^2+B^2}}}\\ R_2&=\sqrt{\frac{2(Ax_0^2+Cy_0^2+Bx_0y_0-1)}{A+C-\sqrt{(A-C)^2+B^2}}}\\ \phi &= \frac{1}{2}arctan(\frac{B}{A-C}) \end{aligned} \end{cases} x0y0R1R2ϕ=4ACB2BE2CD=4ACB2BD2AE=A+C+(AC)2+B2 2(Ax02+Cy02+Bx0y01) =A+C(AC)2+B2 2(Ax02+Cy02+Bx0y01) =21arctan(ACB)
值得一提的是,上式中的长径和短径并一定满足 R 1 > R 2 R_1>R_2 R1>R2,称呼为旋转前X轴截距的一半和y轴截距的一半其实更为准确。这样做的目的是为了不失一般性;同样为了不失去一般性,设 ϕ ∈ [ 0 , 2 π ] \phi \in [0,2\pi] ϕ[0,2π]。因此在Matlab中使用反三角函数时,采用atan2() 二不是 atan()

为了计算的方便,凭借我们朴素的数学直觉,我们对于隐式方程进行 x 2 x^2 x2项系数归一处理:
x 2 + a x y + b y 2 + c x + d y + e = 0 x^2+axy+by^2+cx+dy+e=0 x2+axy+by2+cx+dy+e=0

对于每个点,都是关于未知数向量 [ a   b   c   d   e ] T [a\ b\ c\ d\ e]^T [a b c d e]

评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值