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

https://blog.csdn.net/Jacky_Ponder/article/details/70314919

1.1最小二乘拟合圆介绍与推导
最小二乘法(least squares analysis)是一种数学优化技术,它通过最小化误差的平方和找到一组数据的最佳函数匹配。最小二乘法是用最简的方法求得一些绝对不可知的真值,而令误差平方之和为最小来寻找一组数据的最佳匹配函数的计算方法,最小二乘法通常用于曲线拟合 (least squares fitting) 。最小二乘圆拟合方法是一种基于统计的检测方法,即便是图像中圆形目标受光照强度不均等因素的影响而产生边缘缺失,也不会影响圆心的定位和半径的检测,若边缘定位精确轮廓清晰,最小二乘法可实现亚像素级别的精确拟合定位。
这里有拟合圆曲线的公式推导过程和vc实现。
1.2VC实现的代码
[cpp] view plain copy
<code class="language-cpp">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;  
}</code>  
--------------------- 
作者:Jacky_Ponder 
来源:CSDN 
原文:https://blog.csdn.net/Jacky_Ponder/article/details/70314919 
版权声明:本文为博主原创文章,转载请附上博文链接!

posted on 2018-11-05 13:33 zmj 阅读(933) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理