基于几何距离的椭圆拟合

问题

给定离散点集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,一经查实,立即删除!

相关文章

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

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

Android SimpleAdapter的参数

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

一个excel文档里复制黏贴另外表单跟着变动_利用Excel连接Power BI,实现PPT报告自动输出...

​文/HALI就职于汽车行业战略部门 专注汽车市场信息情报收集和分析因为工作需要&#xff0c;每月周期性的更新数据和撰写PPT 报告成为繁重的劳动。结果是很多时间花费在数据处理上&#xff0c;真正的分析工作&#xff0c;往往只能草草收场。不能坐以待毙&#xff0c;就要想想有…

出现23.97帧率的原因

http://raytao.lofter.com/post/3d177_185a386 关于那些“格&#xff08;Frame&#xff09;”不得不说的事 今天早上&#xff0c;鄙人在社交网络发了这一系列的问题&#xff1a;请解释以下名词之间的关系或差异。帧&#xff0c;格&#xff0c;帧率&#xff0c;时基&#xff0c;…

使用ajax将数据显示在指定位置_AJAX学习主题之一

学习主题&#xff1a;AJAX删除用户功能实现根据视频中的讲解&#xff0c;完成以下内容简述删除功能的基本思路流程点击按钮获取当前元素中的用户uid&#xff0c;向服务器发起请求&#xff0c;将uid提交到服务器删除指定用户&#xff0c;浏览器获取浏览器响应结果。独立完成删除…

js日期比较大小_node.js 内存泄漏的秘密

每日前端夜话第276篇翻译&#xff1a;疯狂的技术宅作者&#xff1a;Giovanny Gongora来源&#xff1a;nodesource正文共&#xff1a;3955 字预计阅读时间&#xff1a;10分钟一直以来&#xff0c;跟踪 Node.js 的内存泄漏是一个反复出现的话题&#xff0c;人们始终希望对其复杂性…

win7+vs2015/13+caffe+matlab+python(CPU only)配置

首先声明本教程可以适用于vs2015 和vs2013 .以vs2015为例。 安装必备软件 vs 2015 /vs2013 matlab 2016a(64bit)推荐使用Anaconda 2.7 或者Miniconda 2.7这两个Python发布版本cmake 3.8.0 以上caffe-window: https://github.com/BVLC/caffe/tree/windows 可选软件&#xff1…

Performance Co-Pilot

Install Performance Co-Pilot 提前安装依赖 [rootiZrj97j6t7ih9hgz1me35hZ ~]# cat install.sh yum install -y docker yum install -y git yum install -y yum-utils-1.1.31-40.el7.noarch yum install lex yum install flex yum install -y bison yum install -y perl-ExtUt…

如何发布打包并发布自己的Android应用(APP)

第一步&#xff0c;在Eclipse中选择需要打包的项目&#xff0c;然后右键--选择Export&#xff0c;会弹出一个打包的提示框&#xff0c;如下图所示。 按Next之后&#xff0c;会继续出现一个提示框&#xff0c;这里你可以选择自己需要打包的项目&#xff08;默认是刚才选中的&…

js变量提升_一道JS变量提升题

var a 0;if(true){a 1;function a(){};a 21;console.log(a);}console.log(a);// 21 1 当前上下文代码执行之前&#xff0c;会将带var/function的进行声明/定义。当遇到“{}”时&#xff0c;新版浏览器和老版浏览器的处理不一致。老版浏览器&#xff08;IE10以下&#xff09;…

Caffe训练过程:test_iter test_interval等概念

转载自http://blog.csdn.net/iamzhangzhuping/article/details/49993899 先上一张图&#xff0c;大家很熟悉的一张图。 首先说明一个概念&#xff1a;在caffe中的一次迭代iteration指的是一个batch&#xff0c;而不是一张图片。 下面主要说下2个概念&#xff1a; test_ite…

R的获取和安装

R的获取和安装 一、下载 R可以在CRAN&#xff08;Comprehensive r archive network&#xff09;http://cran.r-project.org上免费下载&#xff0c;可供选择的有Linux、Mac OS X和windows对应的二进制文件&#xff1b; 我这里选择的是windows版本。打开如下页面&#xff1a; bas…

扩展欧几里得算法求逆元_从辗转相除法到求逆元,数论算法初体验

今天是算法和数据结构专题的第22篇文章&#xff0c;我们一起来聊聊辗转相除法。辗转相除法又名欧几里得算法&#xff0c;是求最大公约数的一种算法&#xff0c;英文缩写是gcd。所以如果你在大牛的代码或者是书上看到gcd&#xff0c;要注意&#xff0c;这不是某某党&#xff0c;…

[翻译] Fast Image Cache

https://github.com/path/FastImageCache Fast Image Cache is an efficient, persistent, and—above all—fast way to store and retrieve images in your iOS application. Part of any good iOS applications user experience is fast, smooth scrolling, and Fast Image …

php练习 租房子

题目要求 1.封装类 <?php class DBDA {public $fuwuqi"localhost"; //服务器地址public $yonghuming"root";//用户名public $mima"";//密码 public $dbconnect;//连接对象//操作数据库的方法//$sql代表需要执行的SQL语句//$type代表SQL语…

centos 安装boost(caffe需要)

安装 由于安装caffe&#xff0c;要求boost的版本在1.55以上&#xff0c;而服务器上的刚好是1.54,所以进行了重装。 参考&#xff1a;《CentOS 7下编译安装Boost_1_57_0 》 不过由于pycaffe需要boost.python,因此需要在./b2时修改为./b2 –stage debug 才可以。而不能去掉py…

JAVA正则表达式介绍和使用

本文引用自 http://www.cnblogs.com/android-html5/archive/2012/06/02/2533924.html 技术博客 1.Java中在某个字符串中查询某个字符或者某个子字串 Java代码 String s "Shang Hai Hong Qiao Fei Ji Chang";    String regEx "a|F"; //表示a或F Pat…

集合框架中的接口及其实现类

Collection&#xff1a;集合层次中的根接口&#xff0c;JDK没有提供这个接口直接地实现类。Set&#xff1a;不能包含重复的元素。SortedSet是一个按照升序排列元素的Set。List&#xff1a;是一个有序的集合&#xff0c;可以包含重复的元素。提供了按索引访问的方式。Map&#x…

C# 多线程 Parallel.For 和 For 谁的效率高?那么 Parallel.ForEach 和 ForEach 呢?

还是那句话&#xff1a;十年河东&#xff0c;十年河西&#xff0c;莫欺少年穷。 今天和大家探讨一个问题&#xff1a;Parallel.For 和 For 谁的效率高呢&#xff1f; 从CPU使用方面而言&#xff0c;Parallel.For 属于多线程范畴&#xff0c;可以开辟多个线程使用CPU内核&#x…