椭圆拟合理论推导和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)∣xi∈R,yi∈R},定义新的向量 { X ∣ X = [ x 1 x 2 . . . x n ] T ∈ R n } \{X|X=[x_1\ x_2...x_n]^T\in \R^n\} { X∣X=[x1 x2...xn]T∈Rn}和 { Y ∣ Y = [ y 1 y 2 . . . y n ] T ∈ R n } \{Y|Y=[y_1\ y_2...y_n]^T\in \R^n\} { Y∣Y=[y1 y2...yn]T∈Rn},求解能够尽可能接近这些点的椭圆。一般斜椭圆具有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ϕ=4AC−B2BE−2CD=4AC−B2BD−2AE=A+C+(A−C)2+B22(Ax02+Cy02+Bx0y0−1)=A+C−(A−C)2+B22(Ax02+Cy02+Bx0y0−1)=21arctan(A−CB)
值得一提的是,上式中的长径和短径并一定满足 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]

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

被折叠的 条评论
为什么被折叠?



