基于几何距离的椭圆拟合

问题

给定离散点集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=1Nf(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  XF(a)2                         1
这里a∈Rqa\in R^qaRq为优化参数,F为非线性函数,X∈RpX\in R^pXRp是已知向量。如下我们给出基于梯度的迭代公式:
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(XF(ak))                         2
这里λ\lambdaλ为步长,A为缩放因子,J_F为F在当前参数a下的Jacobian矩阵。

各种优化方法不同,主要是A的选择不同。具体如下:

  • A=H−1A=H^{-1}A=H1时,为牛顿迭代法。
  • 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=XF(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=(ajFi),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=XF(a)2=[XF(a)]T[XF(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&lt;α≤π/2)\alpha (-\pi/2&lt;\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&#x27;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}&amp;=&amp;\hat{a}_{k}+\lambda \Delta \hat{a} ~~~~~~~~~~~~~~~~~~~~~~(6)\\ J_{X_i&#x27;,\hat{a}}\Delta\hat{a}&amp;=&amp; X_i-X_i&#x27;,i=1,2....m~~~~(7) \end{matrix}\right. {a^k+1JXi,a^Δa^==a^k+λΔa^                      (6)XiXii=1,2....m    (7)
这里m指给定的离散点的个数。各个离散点均满足(7),因此关于(7)可以联立。实际上关于(7)的方程是2m个,而未知数a的维数是5,显然2m>>5,因此解是不唯一的,我们需要求出最小二乘解即可。

显然我们必须计算Xi′X_i&#x27;Xi以及在Xi′X_i&#x27;Xi点上的Jacobian矩阵JXi′,a^J_{X_i&#x27;,\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(XXc)              (8)
or
X=R−1x+Xc(9)X=R^{-1}x+X_c ~~~~~~~~~~~~~~(9) X=R1x+Xc              (9)
这里
R=(CS−SC)和R−1=RTR=\begin{pmatrix} C &amp; S\\ -S &amp; C \end{pmatrix} 和R^{-1}=R^T R=(CSSC)R1=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&#x27;,y_i&#x27;)xi,yi的切向量与两点(即(xi,yi)、(xi′,yi′)(x_i,y_i)、(x_i&#x27;,y_i&#x27;)xi,yixi,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) dxdyxixyiy=a2yb2xxixyiy=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+b2x2a2b2)=0              (12)f2(x,y)=b2x(yiy)a2y(xix)=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} &amp; \frac{\partial f_1}{\partial y}\\ \frac{\partial f_2}{\partial x} &amp; \frac{\partial f_2}{\partial y} \end{pmatrix}=\begin{pmatrix} b^2x &amp; a^2y\\ (a^2-b^2)y+b^2y_i &amp;(a^2-b^2)x-a^2x_i \end{pmatrix}~~~~~~~~~~~ ~~~~(15) Q=(xf1xf2yf1yf2)=(b2x(a2b2)y+b2yia2y(a2b2)xa2xi)               (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

一般经过3-4轮迭代就可以提供了一个很高精度的解。

我们先把XiX_iXi通过转换公式(8)转换成xy坐标系的xix_ixi,然后通过求解广义的牛顿法求解得到正交关联点xi′x_i&#x27;xi,最后再通过转换公式(9)转换成XY坐标系的Xi′X_i&#x27;Xi,最后给出正交误差距离向量为:
Xi′′=Xi−Xi′(16)X_i&#x27;&#x27;=X_i-X_i&#x27; ~~~~~~~~~~~ ~~~~~~~~~~~(16) Xi=XiXi                      (16)

椭圆上的正交关联点的Jacobian矩阵

下面我们直接给出椭圆上的正交关联点的Jacobian矩阵,(注:本部分推导比较复杂,贴出本人的详细推导过程,需要的可以参考推导1,2,3,4,5)
JXi′,a^=(R−1Q−1B)∣x=xi′(17)J_{X_i&#x27;,\hat{a}}=(R^{-1}Q^{-1}B)|_{x=x_i&#x27;}~~~~~~~~~~~ ~~~~~~~~~~~(17) JXi,a^=(R1Q1B)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&#x27;&#x27;Xi和Jacobian矩阵JXi′,a^J_{X_i&#x27;,\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&lt;ba&lt;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×106,并且得到误差指数σ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×106).
我们也比较了我们的结果与Gander的结果,而后者达到相同的估计,需要进行71次迭代(∣∣Δa∣∣=1.0×10−6||\Delta a||=1.0\times 10^{-6}Δa=1.0×106).具体可参考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×106,5.2×106.

从以上结果来看,我们的算法是鲁棒的,即使初始值不够好,最终也能迭代到较好的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258786.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Generate Parentheses

题目 Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses. For example, given n 3, a solution set is: "((()))", "(()())", "(())()", "()(())", "()()()" 方法…

ReportViewer 2010 打印预览,用鼠标快速切换显示比例时报错:存储空间不足,不能处理此命令...

CreateCompatibleDIB 存储空间不足 无法处理此命令 安装 ReportViewer 2010 sp1 即可。转载于:https://www.cnblogs.com/runliuv/p/3640856.html

贪心/二分查找 BestCoder Round #43 1002 pog loves szh II

题目传送门 1 /*2 贪心/二分查找&#xff1a;首先对ai%p&#xff0c;然后sort&#xff0c;这样的话就有序能使用二分查找。贪心的思想是每次找到一个aj使得和为p-1(如果有的话)3 当然有可能两个数和超过p&#xff0c;那么an的值最优&#xff0c;每次还要和…

nohup命令输出日志_逼格高又实用的Linux高级命令,开发运维都要懂

在运维的坑里摸爬滚打好几年了&#xff0c;我还记得我刚开始的时候&#xff0c;我只会使用一些简单的命令&#xff0c;写脚本的时候&#xff0c;也是要多简单有多简单&#xff0c;所以有时候写出来的脚本又长又臭&#xff0c;像一些高级点的命令&#xff0c;比如说Xargs 命令、…

JavaScript中OOP——面向对象中的继承/闭包

前 言 OOP JavaScript中OOP——>>>面向对象中的继承/闭包 1.1面向对象的概念 使用一个子类继承另一个父类&#xff0c;子类可以自动拥有父类的属性和方法。>>> 继承的两方&#xff0c;发生在两个类之间。1.2JS模拟实现继承的三种方式&#xff1a; 首先&am…

js常用字符串函数

这些东西是以前整理的&#xff0c;放到这里&#xff0c;有需要的可以看看~挺全的~ /** * anchor()方法 * 在对象中的指定文本两端放置一个有Name属性的HTML锚点 * strVariable.anchor(anchorString) anchorString为锚点名称 * 它本身不会检查其他的ahchor锚点是否有name指…

c++11中的智能指针

在C11中有四种智能指针&#xff0c;auto_ptr&#xff0c;shared-ptr&#xff0c;unique_ptr和weak-ptr&#xff0c;其中auto_ptr有许多不足之处&#xff0c;在C11中已经建议废弃使用。 1. shared_ptr std::shared_ptr智能指针可以通过共享指向对象的所有权&#xff0c;从而实现…

ubuntu14.04设置静态IP

啊&#xff0c;最近懒惰了&#xff0c;好久没有写博客了。 一般机器启动的时候会自动从DHCP服务器上面获取动态IP地址&#xff0c;这是一件很方便的事情&#xff0c;可以不用手动设置网络相关的蚕参数&#xff0c;但是有时候还是需要机器固定IP地址的。 第一步&#xff0c;编辑…

高中学历python培训靠谱吗_高中学历学完Python就能干人工智能?

最近Python大热&#xff0c;主要是人工智能的热度&#xff0c;昨天后院活动部介绍了一位女网友为男朋友选择Java还是Python&#xff0c;大量的程序员热议&#xff0c;也有人询问如何学习Python&#xff0c;比如这位网友询问高中学历学习Python是不是就能干人工智能。兄弟&#…

curl+个人证书(又叫客户端证书)访问https站点

目前&#xff0c;大公司的OA管理系统&#xff08;俗称内网&#xff09;&#xff0c;安全性要求较高&#xff0c;通常采用https的双向 认证模式。 首先&#xff0c;什么是https&#xff0c;简单的说就是在SSL协议之上实现的http协议&#xff08;get、post等操作&#xff09;。更…

boot.oat FC问题分析报告

【NE现场】 pid: 5252, tid: 5252, name: ndroid.contacts >>> com.android.contacts <<< signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x1458x0 0000000000000000 x1 0000000090d9892c x2 0000000000000001 x3 000000000000012cx4 …

c++ 虚函数的实现机制

转载自&#xff1a;http://blog.csdn.net/jiangnanyouzi/article/details/3720807 1、c实现多态的方法 其实很多人都知道&#xff0c;虚函数在c中的实现机制就是用虚表和虚指针&#xff0c;但是具体是怎样的呢&#xff1f;从more effecive c其中一篇文章里面可以知道&#xff…

powerdesigner 技巧

1.修改建表脚本生成规则。如果每个表格都有相同的字段&#xff0c;可以如下修改&#xff1a; Database -> Edit Current DBMS 展开 Script -> Object -> Table -> Create 见右下的Value值&#xff0c;可以直接修改如下&#xff1a;/* tablename: %TNAME% */ create…

勒索病毒攻击应急防范

北京时间5月12日&#xff0c;互联网上出现针对Windows操作系统的勒索软件&#xff08;Wannacry&#xff09;攻击案例。勒索软件利用此前披露的Windows SMB服务漏洞&#xff08;对应微软漏洞公告&#xff1a;MS17-010&#xff09;攻击手段&#xff0c;向终端用户进行渗透传播&am…

C++中虚析构函数的作用

C中的虚析构函数到底什么时候有用的&#xff0c;什么作用呢。 总的来说虚析构函数是为了避免内存泄露&#xff0c;而且是当子类中会有指针成员变量时才会使用得到的。也就说虚析构函数使得在删除指向子类对象的基类指针时可以调用子类的析构函数达到释放子类中堆内存的目的&…

苹果Swift编程语言入门教程【中文版】

http://www.25pp.com/news/news_60984.html转载于:https://www.cnblogs.com/niaowo/p/4564298.html

python正则表达式匹配aabb_Python正则表达式拆分多个匹配项

我正在尝试将包含2个不同字符的序列的字符串拆分为多个组.如果我们假设字符是a和b,则用于分组的纯文本规则为&#xff1a;>组包含0 a,后跟1 b>后面的所有a都包含在下一组中,除非我们在单词末尾.例如&#xff1a;处理测试后,目标是分成预期的组.tests [abab,ababab,aabab…

MEF 导入(Import)和导出(Export)

前言&#xff1a; MEF不同于其他IOC容器&#xff08;如&#xff1a;Castle&#xff09;很重要的原因在于它使用了特性化编程模型&#xff08;涉及到两个概念&#xff1a;“特性”和“编程模型”&#xff09;。 特性&#xff08;Attribute&#xff09;&#xff1a;举例来说就是我…

Android SimpleAdapter的参数

1.作用是ArrayList和 ListView的桥梁。这个ArrayList里边的每一项都是一个Map<String,?>类型。 ArrayList当中的每一项 Map对象都和ListView里边的每一项进行数据绑定一一对应。2.SimpleAdapter的构造函数&#xff1a;SimpleAdapter(Context context, List<? …

JMeter 教程汇总链接

http://www.360doc.com/content/14/0318/23/16361380_361732630.shtml 可以作为入门系列教程。 尽管网页也给出了视频链接&#xff0c;但是我不建议看视频学习&#xff01; 建议直接看文字&#xff08;可以跳跃式学习&#xff0c;视频的则是线性学习&#xff09;转载于:https:…