最小二乘法拟合圆公式推导及vc实现
最小二乘法(least squares analysis)是一种 数学 优化 技术,它通过 最小化 误差 的平方和找到一组数据的最佳 函数 匹配。 最小二乘法是用最简的方法求得一些绝对不可知的真值,而令误差平方之和为最小。 最小二乘法通常用于 曲线拟合 (least squares fitting) 。这里有 拟合圆曲线 的公式推导过程 和 vc实现。
VC实现的代码:
{
if (m_nNum<3)
{
return;
}
int i=0;
double X1=0;
double Y1=0;
double X2=0;
double Y2=0;
double X3=0;
double Y3=0;
double X1Y1=0;
double X1Y2=0;
double X2Y1=0;
for (i=0;i<m_nNum;i++)
{
X1 = X1 + m_points[i].x;
Y1 = Y1 + m_points[i].y;
X2 = X2 + m_points[i].x*m_points[i].x;
Y2 = Y2 + m_points[i].y*m_points[i].y;
X3 = X3 + m_points[i].x*m_points[i].x*m_points[i].x;
Y3 = Y3 + m_points[i].y*m_points[i].y*m_points[i].y;
X1Y1 = X1Y1 + m_points[i].x*m_points[i].y;
X1Y2 = X1Y2 + m_points[i].x*m_points[i].y*m_points[i].y;
X2Y1 = X2Y1 + m_points[i].x*m_points[i].x*m_points[i].y;
}
double C,D,E,G,H,N;
double a,b,c;
N = m_nNum;
C = N*X2 - X1*X1;
D = N*X1Y1 - X1*Y1;
E = N*X3 + N*X1Y2 - (X2+Y2)*X1;
G = N*Y2 - Y1*Y1;
H = N*X2Y1 + N*Y3 - (X2+Y2)*Y1;
a = (H*D-E*G)/(C*G-D*D);
b = (H*C-E*D)/(D*D-G*C);
c = -(a*X1 + b*Y1 + X2 + Y2)/N;
double A,B,R;
A = a/(-2);
B = b/(-2);
R = sqrt(a*a+b*b-4*c)/2;
m_fCenterX = A;
m_fCenterY = B;
m_fRadius = R;
return;
}
工程下载
编译运行后随便打开一个图片,当然最好是全白的图片,然后就点吧,大于三个点后就会开始拟合。红线画的圆为拟合的圆,深蓝的点为鼠标点击设置的样本点。单击鼠标右键清空样本集。
转自:http://www.cnblogs.com/dotLive/archive/2007/04/06/524633.html
看了下面的评论很有启发:贴上来,可以仔细研读下
最小二乘法的意义是距离差值的平方(di-R)^2,不是距离平方差的平方(di^2-R^2)^2
两者是不同的!事实上
(di^2-R^2)=(di-R)(di+R)
因此,以上结果将使圆半径“趋小”!
其实是一样的。
最小化 误差 的平方和,将距离平方差认为是 误差,可以表征和真实值得误差大小,使之最小也可以得到一个相对较优的拟合值。同时简化公式的推导。
如果使用距离的平方差,则平方和中会出现开根号,公式就很难推导了。
我编制过关于圆最小二乘的程序。起先我以为两者是一样的,就是:评价(di-R)^2与评价(di^2-R^2)^2是一样的。
但正如你所说,后者是把R^2作为真值进行考虑的。当然如果散点恰能构成一个圆,两者是一样的。因为:
(a^2-b^2)=(a+b)(a-b)=0
但我实际编程后(采用最速下降法)发现,后者的半径偏小(散点越不接近于圆越明显)!为什么呢?因为,最小二乘的几何原理考察的是“距离”的误差(di-R)。那么变成平方差 (di^2-R^2)后,事实上是给(di-R)乘上了一个(di+R约=2R)的权重,最终实际的结果,当然是半径偏小。
事实上,你可以通过编程发现两者的差异!
当然上述推导依然是有价值的,因为这个结果作为迭代法的初值是再合适不过了!
实际的推导是不“可解”的,否则,《数学手册》就会出现相应的方法,就象线性回归和抛物线回归一样!
你的分析是对的,对我很有启发。我没有考虑到偏差的程度是如何变化的。你的分析应该说验证了这个推导在整体圆检测算法中的可行性。
事实上这个拟合公式确实迭代检测圆的一个步骤,我采取的方法是每次迭代删除方差大于某个阈值的点,认为它们是非圆上的点。
要使用这个迭代拟合的方法,还需要前面粗检测来限定范围,以保证进行拟合的点在圆周的一个特定范围内;最后删除点的迭代次数,也就是迭代停止条件也需要考虑和分析。最后我们希望是可以得到全部都是圆上的点,或者都是离真实边缘很接近的点,那么拟合的圆稍微有所偏差也是可以接受的。
还有一点是,这个检测的算法是假设在很高的分辨率下进行的,因此需要采用一些牺牲少量精度,大量降低计算量的方法,检测精度已经由高分辨的采集装置保证了一部分。
最小二乘法拟合圆公式推导及vc实现相关推荐
- 最小二乘法拟合圆公式推导及vc实现[r]
最小二乘法(least squares analysis)是一种 数学 优化 技术,它通过 最小化 误差 的平方和找到一组数据的最佳 函数 匹配. 最小二乘法是用最简的方法求得一些绝对不可知的真值,而 ...
- 最小二乘法拟合圆公式推导及其实现
1.1最小二乘拟合圆介绍与推导 最小二乘法(least squares analysis)是一种数学优化技术,它通过最小化误差的平方和找到一组数据的最佳函数匹配.最小二乘法是用最简的方法求得一些绝对不 ...
- 最小二乘法拟合圆c语言,最小二乘法拟合圆公式推导及其实现
https://blog.csdn.net/Jacky_Ponder/article/details/70314919 1.1最小二乘拟合圆介绍与推导 最小二乘法(least squares anal ...
- c++椭圆最小二乘法原理_最小二乘法拟合圆公式推导及其实现
https://blog.csdn.net/Jacky_Ponder/article/details/70314919 1.1最小二乘拟合圆介绍与推导 最小二乘法(least squares anal ...
- python最小二乘法拟合圆_最小二乘法拟合圆
有一系列的数据点 {xi,yi}.我们知道这些数据点近似的落在一个圆上.依据这些数据预计这个圆的參数就是一个非常有意义的问题.今天就来讲讲怎样来做圆的拟合.圆拟合的方法有非常多种,最小二乘法属于比較简 ...
- python 拟合圆_最小二乘法拟合圆 转
有一系列的数据点 {xi,yi}{xi,yi},我们知道这些数据点近似的落在一个圆上,根据这些数据估计这个圆的参数就是一个很有意义的问题.今天就来讲讲如何来做圆的拟合.圆拟合的方法有很多种,最小二乘法 ...
- python最小二乘法拟合圆_最小二乘法拟合圆(示例代码)
有一系列的数据点 {xi,yi}.我们知道这些数据点近似的落在一个圆上.依据这些数据预计这个圆的參数就是一个非常有意义的问题.今天就来讲讲怎样来做圆的拟合.圆拟合的方法有非常多种,最小二乘法属于比較简 ...
- 圆检测——最小二乘法拟合圆的推导
http://blog.163.com/small_duan/blog/static/28584262200872340079/ 最小二乘法(least squares analysis)是一种 数学 ...
- 最小二乘法拟合圆心公式推导及基于opencv的程序实现
最小二乘法拟合圆心 文章为个人学习过程中笔记,原理部分参考其他作者内容,侵权必删 最小二乘法(least squares analysis)是一种数学优化技术,它通过最小化误差的平方和找到一组数据的最 ...
最新文章
- 12月28日二周四次【Python基础语法】
- 基于wayland的linux桌面,揭开Wayland的面纱(二):Wayland应运而生
- 高考后家有学计算机,2021高考热门专业将有大改动,计算机专业永远的神,榜首才是真黑马...
- 信息系统项目管理师:第4章:项目整体管理与变更管理(3)
- 如何在CentOS 5/6上安装EPEL源
- java 正规 忽略,java-正则表达式查找变量并忽略方法
- LeetCode 2032. 至少在两个数组中出现的值(哈希/位运算)
- mysql 线性表_线性表之顺序存储,基本操作
- java B2B2C springmvc mybatis电子商务平台源码-------zuul网关实现
- HDU1480 钥匙计数之二【递推】
- Springmvc源码分析之dispatcherServlet
- php实现ps修图,ps皮肤处理精修方法
- 提高情商,从这几方面做
- 职场菜鸟捕食指北【相亲篇】
- 10分钟让你彻底理解如何配置子域名来部署多个项目
- itools android玩游戏,itools模拟器能玩ios游戏吗?
- 用VC++6.0制作简易浏览器
- html5把六张图片做成立方体,一篇文章教会你利用html5和css3实现3D立方体效果图...
- 风声,雨声,读书声-------候捷和孟岩的谈话
- Linux 文件与目录的管理