基于几何距离的椭圆拟合
問題
給定離散點集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∑N?f(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》。
論文的核心思路
顯然,由于離散點到橢圓的幾何距離是非線性的,因此橢圓擬合是一種非線性優化的問題,需要通過多次迭代求解。
因此下面我們闡述論文的思路時,將分成兩個片段來講解。第一段,主要介紹基于高斯-牛頓法的非線性優化方法。第二段,具體介紹這種方法在橢圓擬合中的應用。
非線性最小二乘擬合
問題
考慮一般的非線性最小二乘問題如下:
min?a∣∣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=(JFT?JF?)?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+1?JXi′?,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?S?SC?)和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+b2yi??a2y(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?=(xk1?yk1??)=(xi?yi??)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.
從以上結果來看,我們的算法是魯棒的,即使初始值不夠好,最終也能迭代到較好的效果。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的基于几何距离的椭圆拟合的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel如何记账
- 下一篇: python xpath定位打印元素_p