最小二乘法(least squares analysis)是一种 数学 优化 技术,它通过 最小化 误差 的平方和找到一组数据的最佳 函数 匹配。 最小二乘法是用最简的方法求得一些绝对不可知的真值,而令误差平方之和为最小。 最小二乘法通常用于 曲线拟合 (least squares fitting) 。这里有 拟合圆曲线 的公式推导过程 和 vc实现。




VC实现的代码:

void  CViewActionImageTool::LeastSquaresFitting()
{
    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

看了下面的评论很有启发:贴上来,可以仔细研读下

#2楼   2007-04-05 09:53 |  路不平[未注册用户]
公式错误!

最小二乘法的意义是距离差值的平方(di-R)^2,不是距离平方差的平方(di^2-R^2)^2

两者是不同的!事实上

(di^2-R^2)=(di-R)(di+R)

因此,以上结果将使圆半径“趋小”!

#3楼 [ 楼主]  2007-04-05 13:37 |  .Live 
@路不平 
其实是一样的。

最小化 误差 的平方和,将距离平方差认为是 误差,可以表征和真实值得误差大小,使之最小也可以得到一个相对较优的拟合值。同时简化公式的推导。

如果使用距离的平方差,则平方和中会出现开根号,公式就很难推导了。

支持(1) 反对(0)

#4楼   2007-04-06 09:18 |  路不平[未注册用户]
回:dotLive

我编制过关于圆最小二乘的程序。起先我以为两者是一样的,就是:评价(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)的权重,最终实际的结果,当然是半径偏小。 
事实上,你可以通过编程发现两者的差异! 
当然上述推导依然是有价值的,因为这个结果作为迭代法的初值是再合适不过了! 
实际的推导是不“可解”的,否则,《数学手册》就会出现相应的方法,就象线性回归和抛物线回归一样!

#5楼 [ 楼主]  2007-04-06 10:30 |  .Live 
@路不平 
你的分析是对的,对我很有启发。我没有考虑到偏差的程度是如何变化的。你的分析应该说验证了这个推导在整体圆检测算法中的可行性。 
事实上这个拟合公式确实迭代检测圆的一个步骤,我采取的方法是每次迭代删除方差大于某个阈值的点,认为它们是非圆上的点。 
要使用这个迭代拟合的方法,还需要前面粗检测来限定范围,以保证进行拟合的点在圆周的一个特定范围内;最后删除点的迭代次数,也就是迭代停止条件也需要考虑和分析。最后我们希望是可以得到全部都是圆上的点,或者都是离真实边缘很接近的点,那么拟合的圆稍微有所偏差也是可以接受的。 
还有一点是,这个检测的算法是假设在很高的分辨率下进行的,因此需要采用一些牺牲少量精度,大量降低计算量的方法,检测精度已经由高分辨的采集装置保证了一部分。

最小二乘法拟合圆公式推导及vc实现相关推荐

  1. 最小二乘法拟合圆公式推导及vc实现[r]

    最小二乘法(least squares analysis)是一种 数学 优化 技术,它通过 最小化 误差 的平方和找到一组数据的最佳 函数 匹配. 最小二乘法是用最简的方法求得一些绝对不可知的真值,而 ...

  2. 最小二乘法拟合圆公式推导及其实现

    1.1最小二乘拟合圆介绍与推导 最小二乘法(least squares analysis)是一种数学优化技术,它通过最小化误差的平方和找到一组数据的最佳函数匹配.最小二乘法是用最简的方法求得一些绝对不 ...

  3. 最小二乘法拟合圆c语言,最小二乘法拟合圆公式推导及其实现

    https://blog.csdn.net/Jacky_Ponder/article/details/70314919 1.1最小二乘拟合圆介绍与推导 最小二乘法(least squares anal ...

  4. c++椭圆最小二乘法原理_最小二乘法拟合圆公式推导及其实现

    https://blog.csdn.net/Jacky_Ponder/article/details/70314919 1.1最小二乘拟合圆介绍与推导 最小二乘法(least squares anal ...

  5. python最小二乘法拟合圆_最小二乘法拟合圆

    有一系列的数据点 {xi,yi}.我们知道这些数据点近似的落在一个圆上.依据这些数据预计这个圆的參数就是一个非常有意义的问题.今天就来讲讲怎样来做圆的拟合.圆拟合的方法有非常多种,最小二乘法属于比較简 ...

  6. python 拟合圆_最小二乘法拟合圆 转

    有一系列的数据点 {xi,yi}{xi,yi},我们知道这些数据点近似的落在一个圆上,根据这些数据估计这个圆的参数就是一个很有意义的问题.今天就来讲讲如何来做圆的拟合.圆拟合的方法有很多种,最小二乘法 ...

  7. python最小二乘法拟合圆_最小二乘法拟合圆(示例代码)

    有一系列的数据点 {xi,yi}.我们知道这些数据点近似的落在一个圆上.依据这些数据预计这个圆的參数就是一个非常有意义的问题.今天就来讲讲怎样来做圆的拟合.圆拟合的方法有非常多种,最小二乘法属于比較简 ...

  8. 圆检测——最小二乘法拟合圆的推导

    http://blog.163.com/small_duan/blog/static/28584262200872340079/ 最小二乘法(least squares analysis)是一种 数学 ...

  9. 最小二乘法拟合圆心公式推导及基于opencv的程序实现

    最小二乘法拟合圆心 文章为个人学习过程中笔记,原理部分参考其他作者内容,侵权必删 最小二乘法(least squares analysis)是一种数学优化技术,它通过最小化误差的平方和找到一组数据的最 ...

最新文章

  1. 12月28日二周四次【Python基础语法】
  2. 基于wayland的linux桌面,揭开Wayland的面纱(二):Wayland应运而生
  3. 高考后家有学计算机,2021高考热门专业将有大改动,计算机专业永远的神,榜首才是真黑马...
  4. 信息系统项目管理师:第4章:项目整体管理与变更管理(3)
  5. 如何在CentOS 5/6上安装EPEL源
  6. java 正规 忽略,java-正则表达式查找变量并忽略方法
  7. LeetCode 2032. 至少在两个数组中出现的值(哈希/位运算)
  8. mysql 线性表_线性表之顺序存储,基本操作
  9. java B2B2C springmvc mybatis电子商务平台源码-------zuul网关实现
  10. HDU1480 钥匙计数之二【递推】
  11. Springmvc源码分析之dispatcherServlet
  12. php实现ps修图,ps皮肤处理精修方法
  13. 提高情商,从这几方面做
  14. 职场菜鸟捕食指北【相亲篇】
  15. 10分钟让你彻底理解如何配置子域名来部署多个项目
  16. itools android玩游戏,itools模拟器能玩ios游戏吗?
  17. 用VC++6.0制作简易浏览器
  18. html5把六张图片做成立方体,一篇文章教会你利用html5和css3实现3D立方体效果图...
  19. 风声,雨声,读书声-------候捷和孟岩的谈话
  20. Linux 文件与目录的管理

热门文章

  1. Cannot assign requested address解决办法
  2. CIM系统导论学习笔记
  3. 医院就诊系统(C++队列)源代码
  4. 分析与设计:图书管理系统
  5. java80道面试题
  6. 海思编译kernel
  7. CSS —— 手摸手实现一个文字霓虹灯闪烁特效
  8. 2019--3.10学习笔记
  9. C#调用映美云打印机CFP535
  10. 解决ERROR 1129 (HY000): Host ‘xxx‘ is blocked because of many