欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

直接最小二乘法拟合椭圆

程序员文章站 2024-03-07 21:45:39
...

直接最小二乘法拟合椭圆

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

椭圆方程

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

优化目标

W=[A,B,C,D,E,F]W=\left[A,B,C,D,E,F\right]^\topX=[x2,xy,y2,x,y,1]X=\left[x^2,xy,y^2,x,y,1\right]^\top,则优化目标为
minWX2=WXXWs.t.WHW>0 \min\left\|{W^\top X }\right\|^2 =W^\top X X^\top W\\ s.t. \quad W^\top H W>0
其中H=[002000010000200000000000000000000000] 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}
WHW>0\quad W^\top H W>0是椭圆参数约束4ACB2>04AC-B^2>0

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

于是优化目标变为:
minWX2=WXXWs.t.WHW=1 \min\left\|{W^\top X }\right\|^2 =W^\top X X^\top W\\ s.t. \quad W^\top H W=1

拉格朗日函数

构造拉格朗日函数
L(W)=WXXWλ(WHW1) L\left(W\right)=W^\top X X^\top W-\lambda \left( W^\top H W-1\right)
对其求导得零:
LW=0 \frac{{\partial L}}{{\partial W}} = 0

XXWλHW=0XXW=λHW XX^\top W-\lambda HW = 0 \Rightarrow XX^\top W=\lambda HW
S=XXS=XX^\top,则SW=λHWSW=\lambda HW,通过求解广义特征向量可以得到6个可能的备选WW,其中只有一个的特征值为正,也只有这个对应的特征向量是符合要求的。详见论文"Direct least square fitting of ellipses"。

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

更早的一种直接拟合法

优化目标

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

拉格朗日函数

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

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

筛选符合要求的特征向量

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

此外,对于椭圆方程
ax2+2hxy+by2+2gx+2fy+c=0 ax^2+2hxy+by^2+2gx+2fy+c=0
判别式
Δ=ahghbfgfc=abc+2fghaf2bg2ch2 \Delta=\begin{vmatrix} a&h&g \\ h&b&f \\ g&f&c \\ \end{vmatrix}=abc+2fgh-af^2-bg^2-ch^2
Δ0\Delta\ne0,且abh2>0ab-h^2>0时为椭圆

条件一Δ0\Delta\ne0

条件二abh2>0ab-h^2>0viHvi>0v_i^\top Hv_i>0

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

条件三Δa+b<0\frac{\Delta}{a+b}<0

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

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

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

椭圆方程:
Ax2+Bxy+Cy2+Dx+Ey+F=0 Ax^2+Bxy+Cy^2+Dx+Ey+F=0
长轴倾角:
θ=12arctanBAC \theta=\frac{1}{2}\arctan\frac{B}{A-C}
几何中心:
Xc=BE2CD4ACB2Yc=BD2AE4ACB2 \begin{aligned} X_c&=\frac{BE-2CD}{4AC-B^2}\\ Y_c&=\frac{BD-2AE}{4AC-B^2} \end{aligned}
长半轴短半轴:
A2=2(AXc2+CYc2+BXcYcF)A+C+(AC)2+B2B2=2(AXc2+CYc2+BXcYcF)A+C(AC)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}

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(H,S)
L = diag(L);
[~,I] = max(L);
W = V(:,I);

绘制椭圆

A = 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)))

直接最小二乘法拟合椭圆
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)

直接最小二乘法拟合椭圆
上面是二次误差最小的二次曲线,下面是二次误差第二小的二次曲线,一个是双曲线,一个是抛物线,明显不符合要求。
直接最小二乘法拟合椭圆
因为散点只取了一小段,所以两个算法精度都很差,若是比较完整的数据,则两个算法结果差不多。


参考链接

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