原文转自:http://blog.csdn.net/viewcode/article/details/7828178
RANSAC的原理介绍有:http://en.wikipedia.org/wiki/Ransac
最小二乘法least squares的原理介绍有: http://en.wikipedia.org/wiki/Least_squares
两者的共同点都是要首先确定模型,模型分为线性模型与非线性模型。
一般常见的应用是线性模型,如 f(x) = kx + t。
在应用上,二者的差别是,least squares对噪声比较敏感,算法简单。而RANSAC能去除一些噪声的干扰,如果假定模型与实际的情形一致,那么一般由观测数据计算的RANSAC模型,更能接近实际情况,去除观测或过程噪声干扰,算法稍微复杂些。
最小二乘least squares通过最小化 测量数据与模型数据的平方和, 求出模型参数。
e = sum(Yi - f(Xi)), e是k与t的二次函数,求其最小,即求其极值。求偏导dk = 0, dt = 0。可以计算出k与t值。
RANSAC的线性拟合算法步骤大致如下:
while 最大尝试次数
从观测点集中随机取两点,计算出直线的参数k, t(或者k用向量表示),得出一个候选的直线模型。
计算候选直线与整个点集的匹配程度,可以采用统计在直线上(或到直线的距离小于一个阈值)的点的个数。
保留匹配程度最好的直线的参数。
如果本次尝试匹配点的个数 占整个点集大部分,超出预期(阈值),提前结束尝试。
endwhile
匹配程度也可以用其他指标来衡量,替换上面的匹配计算。
误差/性能分析:
最小二乘的误差为e,但一般用相关系数r来表示, r越接近1,模型越好,r = 0,拟合无意义,模型不实际情况不符合。
RANSAC的误差一般用在拟合直线的一个范围内,在此范围内点的个数占整个点集比例 来衡量。
最小二乘法,也可以先进行去除离群点的数据预处理,应用RANSAC或穷举的方法,利用任意两点计算一条直线,将距离直线太远的点设置为离群点,距离直线较近的点为符合条件的点。循环处理,比较群内点的个数,记录下群内点数最多的集合。 这些点就是 去除离群点 的点集合,利用这些点再进行最小二乘法拟合 -_-!!!。
在图像处理及图形学中,这两种算法经常被用到。特别是RANSAC,在opencv的三维重构和标定模块中有很多应用,如solvePnPRansac,findHomography,estimateAffine3D等。