问题
给定离散点集Xi=(xi,yi)X_i=(x_i,y_i)Xi=(xi,yi),我们希望找到最好的椭圆去拟合这些离散点。
方法
通常我们使用最小二乘法求解如下的最优化问题:
Min∑i=1Nf(xi,E)2Min \sum_{i=1}^N f(x_i,E)^2 Mini=1∑Nf(xi,E)2
这里f(xi,E)f(x_i,E)f(xi,E)表示点xix_ixi到E(指待拟合的椭圆)的最小距离。
通常我们有两种方法来表达f(xi,E)f(x_i,E)f(xi,E),分别是:几何距离和代数距离。前面我们已经描述了基于代数距离的椭圆拟合,下面我们将重点介绍基于几何距离的椭圆拟合方法,这种方法也是椭圆拟合方法中最鲁棒、精度最高的拟合方法。
我们主要参考论文《Least-squares orthogonal distances fitting of circle,
sphere, ellipse, hyperbola, and parabola》。
论文的核心思路
显然,由于离散点到椭圆的几何距离是非线性的,因此椭圆拟合是一种非线性优化的问题,需要通过多次迭代求解。
因此下面我们阐述论文的思路时,将分成两个片段来讲解。第一段,主要介绍基于高斯-牛顿法的非线性优化方法。第二段,具体介绍这种方法在椭圆拟合中的应用。
非线性最小二乘拟合
问题
考虑一般的非线性最小二乘问题如下:
mina∣∣X−F(a)∣∣2(1)\min_a~~||X-F(a)||^2 ~~~~~~~~~~~~~~~~~~~~~~~~~ (1) amin ∣∣X−F(a)∣∣2 (1)
这里a∈Rqa\in R^qa∈Rq为优化参数,F为非线性函数,X∈RpX\in R^pX∈Rp是已知向量。如下我们给出基于梯度的迭代公式:
ak+1=ak+λAJFT(X−F(ak))(2)a_{k+1}=a_{k}+\lambda AJ_F^T(X-F(a_k)) ~~~~~~~~~~~~~~~~~~~~~~~~~(2) ak+1=ak+λAJFT(X−F(ak)) (2)
这里λ\lambdaλ为步长,A为缩放因子,J_F为F在当前参数a下的Jacobian矩阵。
各种优化方法不同,主要是A的选择不同。具体如下:
- 当A=H−1A=H^{-1}A=H−1时,为牛顿迭代法。
- 当A=(JFTJF)−1A=(J_F^TJ_F)^{-1}A=(JFTJF)−1时,为高斯-牛顿迭代法。
- 当A=IA=IA=I时,为梯度下降法。
这里我们选择使用高斯-牛顿迭代法。
我们将A带入(2),即可以改写为:
{ak+1=ak+λΔa(3)JFΔa=X−F(ak)(4)\left\{\begin{matrix} a_{k+1}=a_{k}+\lambda \Delta a ~~~~~~~~~~~~~~~~~(3)\\ J_F\Delta a= X-F(a_k)~~~~~~~~~~~~~~(4) \end{matrix}\right. {ak+1=ak+λΔa (3)JFΔa=X−F(ak) (4)
这里JF=(∂Fi∂aj),i=1,2,...,p,j=1,2,...,qJ_F=(\frac{\partial F_i}{\partial a_j}),i=1,2,...,p,j=1,2,...,qJF=(∂aj∂Fi),i=1,2,...,p,j=1,2,...,q
并且,我们根据(1)可以写出迭代算法的性能表现指数,其实就是参差的表达式:
σ02=∣∣X−F(a)∣∣2=[X−F(a)]T[X−F(a)](5)\sigma_0^2=||X-F(a)||^2 =[X-F(a)]^T[X-F(a)]~~~~~~~~~~~~~~(5) σ02=∣∣X−F(a)∣∣2=[X−F(a)]T[X−F(a)] (5)
求解
接下来,我们需要求解出Δa\Delta aΔa,才能进行迭代。
事实上求解Δa\Delta aΔa只需要求解方程组(4)即可.我们可以使用奇异值分解求解方程组。
基于几何距离的椭圆拟合
平面上的椭圆可以使用5个参数唯一地表达,即圆心(Xc,Yc)(X_c,Y_c)(Xc,Yc)、主轴a,ba,ba,b,角度α(−π/2<α≤π/2)\alpha (-\pi/2<\alpha\leq \pi/2)α(−π/2<α≤π/2).
对于椭圆的最小二乘正交距离拟合,我们将使用第一段所讲的方法。此时,我们定义
a^=(Xc,Yc,a,b,α)T\hat{a}=(X_c,Y_c,a,b,\alpha)^Ta^=(Xc,Yc,a,b,α)T
XXX可以看成给定的离散点XiX_iXi,而自然F(a^)F(\hat{a})F(a^)就是定点XiX_iXi在椭圆上的最近点Xi′X_i'Xi′(也称为正交关联点)。迭代公式就变成了如下:
{a^k+1=a^k+λΔa^(6)JXi′,a^Δa^=Xi−Xi′,i=1,2....m(7)\left\{\begin{matrix} \hat{a}_{k+1}&=&\hat{a}_{k}+\lambda \Delta \hat{a} ~~~~~~~~~~~~~~~~~~~~~~(6)\\ J_{X_i',\hat{a}}\Delta\hat{a}&=& X_i-X_i',i=1,2....m~~~~(7) \end{matrix}\right. {a^k+1JXi′,a^Δa^==a^k+λΔa^ (6)Xi−Xi′,i=1,2....m (7)
这里m指给定的离散点的个数。各个离散点均满足(7),因此关于(7)可以联立。实际上关于(7)的方程是2m个,而未知数a的维数是5,显然2m>>5,因此解是不唯一的,我们需要求出最小二乘解即可。
显然我们必须计算Xi′X_i'Xi′以及在Xi′X_i'Xi′点上的Jacobian矩阵JXi′,a^J_{X_i',\hat{a}}JXi′,a^。下面我们将阐述如何求解这两个量。
坐标系转换
为了便于后面的求解,我们需要考虑,将原来的坐标系XY,旋转α\alphaα角,建立一个位于(0,0)(0,0)(0,0)的临时坐标系xy。见Fig.3
则有
x=R(X−Xc)(8)x=R(X-X_c) ~~~~~~~~~~~~~~(8) x=R(X−Xc) (8)
or
X=R−1x+Xc(9)X=R^{-1}x+X_c ~~~~~~~~~~~~~~(9) X=R−1x+Xc (9)
这里
R=(CS−SC)和R−1=RTR=\begin{pmatrix} C & S\\ -S & C \end{pmatrix} 和R^{-1}=R^T R=(C−SSC)和R−1=RT
C=cos(α),S=sin(α)C=\cos(\alpha),S=\sin(\alpha)C=cos(α),S=sin(α)
椭圆上的正交关联点
经过坐标轴转换,5个椭圆参数变成了2个,仅仅包含了主轴a,ba,ba,b。椭圆上的点可以用标准方程描述如下:
x2a2+y2b2=1(10)\frac{x^2}{a^2}+\frac{y^2}{b^2}=1~~~~~~~~~~~~~~(10) a2x2+b2y2=1 (10)
从Fig.3上,我们可以看到位于xy坐标系上的正交关联点(xi′,yi′)(x_i',y_i')(xi′,yi′)的切向量与两点(即(xi,yi)、(xi′,yi′)(x_i,y_i)、(x_i',y_i')(xi,yi)、(xi′,yi′))的连线是正交的。因此,有:
dydx⋅yi−yxi−x=−b2xa2y⋅yi−yxi−x=−1(11)\frac{dy}{dx}\cdot\frac{y_i-y}{x_i-x}=\frac{-b^2x}{a^2y}\cdot\frac{y_i-y}{x_i-x}=-1~~~~~~~~~~~~~~(11) dxdy⋅xi−xyi−y=a2y−b2x⋅xi−xyi−y=−1 (11)
重写(10,11)有:
f1(x,y)=12(a2y2+b2x2−a2b2)=0(12)f2(x,y)=b2x(yi−y)−a2y(xi−x)=0(13)f_1(x,y)=\frac{1}{2}(a^2y^2+b^2x^2-a^2b^2)=0 ~~~~~~~~~~~~~~(12) \\ f_2(x,y)=b^2x(y_i-y)-a^2y(x_i-x)=0 ~~~~~~~~~~~(13) f1(x,y)=21(a2y2+b2x2−a2b2)=0 (12)f2(x,y)=b2x(yi−y)−a2y(xi−x)=0 (13)
上面两式称为正交关联条件,我们将使用广义牛顿法来求解上面方程组的解。
即使用如下的迭代公式求解:
{xk+1=xk+ΔxQkΔx=−f(xk)(14)\left\{\begin{matrix} x_{k+1}=x_k+\Delta x\\ Q_k\Delta x=-f(x_k) \end{matrix}\right. ~~~~~~~~~~~ ~~~~~~~~~~~(14) {xk+1=xk+ΔxQkΔx=−f(xk) (14)
Q=(∂f1∂x∂f1∂y∂f2∂x∂f2∂y)=(b2xa2y(a2−b2)y+b2yi(a2−b2)x−a2xi)(15)Q=\begin{pmatrix} \frac{\partial f_1}{\partial x} & \frac{\partial f_1}{\partial y}\\ \frac{\partial f_2}{\partial x} & \frac{\partial f_2}{\partial y} \end{pmatrix}=\begin{pmatrix} b^2x & a^2y\\ (a^2-b^2)y+b^2y_i &(a^2-b^2)x-a^2x_i \end{pmatrix}~~~~~~~~~~~ ~~~~(15) Q=(∂x∂f1∂x∂f2∂y∂f1∂y∂f2)=(b2x(a2−b2)y+b2yia2y(a2−b2)x−a2xi) (15)
对于迭代公式(14),我们提供初始解x0x_0x0,如下:(见Fig.3)
x0=12(x^k1+x^k2)x_0=\frac{1}{2}(\hat{x}_{k1}+\hat{x}_{k2}) x0=21(x^k1+x^k2)
这里
x^k1=(xk1yk1)=(xiyi)ab/b2xi2+a2yi\hat{x}_{k1}=\begin{pmatrix} x_{k1}\\ y_{k1} \end{pmatrix}=\begin{pmatrix} x_{i}\\ y_{i} \end{pmatrix}ab/\sqrt{b^2x_i^2+a^2y_i} x^k1=(xk1yk1)=(xiyi)ab/b2xi2+a2yi
我们先把XiX_iXi通过转换公式(8)转换成xy坐标系的xix_ixi,然后通过求解广义的牛顿法求解得到正交关联点xi′x_i'xi′,最后再通过转换公式(9)转换成XY坐标系的Xi′X_i'Xi′,最后给出正交误差距离向量为:
Xi′′=Xi−Xi′(16)X_i''=X_i-X_i' ~~~~~~~~~~~ ~~~~~~~~~~~(16) Xi′′=Xi−Xi′ (16)
椭圆上的正交关联点的Jacobian矩阵
下面我们直接给出椭圆上的正交关联点的Jacobian矩阵,(注:本部分推导比较复杂,贴出本人的详细推导过程,需要的可以参考推导1,2,3,4,5)
JXi′,a^=(R−1Q−1B)∣x=xi′(17)J_{X_i',\hat{a}}=(R^{-1}Q^{-1}B)|_{x=x_i'}~~~~~~~~~~~ ~~~~~~~~~~~(17) JXi′,a^=(R−1Q−1B)∣x=xi′ (17)
这里QQQ见(15),B=(B1,B2,B3,B4,B5)B=(B_1,B_2,B_3,B_4,B_5)B=(B1,B2,B3,B4,B5)
此时
椭圆的正交距离拟合
给定m个二维点,我们可以利用(16)、(17)给定的误差距离向量Xi′′X_i''Xi′′和Jacobian矩阵JXi′,a^J_{X_i',\hat{a}}JXi′,a^,构造p(=2m)个线性方程组。如下:
,当我们使用奇异值分解求解出上述方程组的解时,就可以进行高斯-牛顿迭代。
此时我们还需要一个初值,一般可以选择基于代数拟合的椭圆或者使用圆作为初始值来进行迭代。通常我们推荐使用圆来作为初始值参数。
显然,从圆拟合中获得的初始参数为:
(Xc,Yc)ellipse=(Xc,Yc)circle,a=b=R,α=0(X_c,Y_c)_{ellipse}=(X_c,Y_c)_{circle},a=b=R,\alpha=0(Xc,Yc)ellipse=(Xc,Yc)circle,a=b=R,α=0
并且在迭代过程中,如果a<ba<ba<b,则需要令α←α−sign(α)π2\alpha\leftarrow \alpha-sign(\alpha)\frac{\pi}{2}α←α−sign(α)2π(保持a为主轴长)
标准坐标轴下的椭圆拟合
有时候,我们也需要为椭圆拟合增加一些约束,经典的就是要求在标准坐标轴下进行椭圆拟合(α=0或者π/2\alpha=0或者 \pi/2α=0或者π/2),或者要求增加椭圆面积约束.此时,我们只需要在原来的第(7)式增加如下约束即可。
此时w3,w4w_3,w_4w3,w4为权重参数,一般可以取1.0×1061.0\times 10^{6}1.0×106.
实验结果
例1.
我们对Table 7的离散点进行椭圆拟合,其中初始参数a0a_0a0源自基于几何距离的圆拟合。
取λ=1.2\lambda=1.2λ=1.2,在经过19次迭代后,最终的校正向量的范数为∣∣Δa∣∣=4.2×10−6||\Delta a||=4.2\times 10^{-6}∣∣Δa∣∣=4.2×10−6,并且得到误差指数σ0=1.1719\sigma_0=1.1719σ0=1.1719.见如下:
为了更好地比较,我们也考虑了初始参数a0a_0a0源自基于代数距离的椭圆拟合,而达到与上述相同的估计,需要进行21次迭代(∣∣Δa∣∣=1.1×10−6||\Delta a||=1.1\times 10^{-6}∣∣Δa∣∣=1.1×10−6).
我们也比较了我们的结果与Gander的结果,而后者达到相同的估计,需要进行71次迭代(∣∣Δa∣∣=1.0×10−6||\Delta a||=1.0\times 10^{-6}∣∣Δa∣∣=1.0×10−6).具体可参考Table 8 的III,IV.
Gander的算法有一个缺点就是不能使用圆的结果作为初始参数,为了克服这个困难,一般取$ a=R, b=R/2$.为了更加直接验证我们算法的鲁棒性,我们也考虑了使用两种设置作为初始值,分别见Table 8的II,III。即:
II:
a=R,b=R/2,α=0a=R,b=R/2,\alpha=0a=R,b=R/2,α=0
III:
a=R,b=R/2,α=−1.211a=R,b=R/2,\alpha=-1.211a=R,b=R/2,α=−1.211.
我们分别使用17次和23次迭代达到了相同的估计,其中校正向量的范数分别是1.2×10−6,5.2×10−61.2\times 10^{-6},5.2\times10^{-6}1.2×10−6,5.2×10−6.
从以上结果来看,我们的算法是鲁棒的,即使初始值不够好,最终也能迭代到较好的效果。