RANSAC算法:从原理到图像拼接的实践
1. RANSAC算法原理和步骤
1.1 RANSAC算法简介
RANSAC (RANdom SAmple Consensus, 随机采样一致) 算法是从一组含有“外点”(outliers)的数据中正确估计数学模型参数的迭代算法。“外点”一般指的的数据中的噪声,比如说匹配中的误匹配和估计曲线中的离群点。所以,RANSAC也是一种“外点”检测算法。RANSAC是一个非确定性算法,在某种意义上说,它会产生一个在一定概率下合理的结果,其允许使用更多次的迭代来使其概率增加。RANSAC算最早是由Fischler和Bolles在SRI上提出用来解决LDP(Location Determination Problem,位置确定问题)问题的。
对于RANSAC算法来说一个基本的假设就是数据是由“内点”和“外点”组成的。“内点”就是组成模型参数的数据,“外点”就是不适合模型的数据。同时RANSAC假设:在给定一组含有少部分“内点”的数据,存在一个程序可以估计出符合“内点”的模型。
1.2 RANSAC算法基本思想和流程
RANSAC的思想比较简单,主要有以下几步:
- 给定一个数据集S,从中选择建立模型所需的最小样本数(空间直线最少可以由两个点确定,所以最小样本数是2,空间平面可以根据不共线三点确定,所以最小样本数为3,拟一个圆时,最小样本数是3),记选择数据集为S1。
- 使用选择的数据集S1计算得到一个数学模型M1。
- 用计算的模型M1去测试数据集中剩余的点,如果测试的数据点在误差允许的范围内,则将该数据点判为内点(inlier),否则判为外点(outlier),记所有内点组成的数据集为S1’,S1’ 称作 S1的一致性集合。
- 比较当前模型和之前推出的最好的模型的“内点”的数量,记录最大“内点”数量时模型参数和“内点”数量。
- 重复1-4步,直到迭代结束或者当前模型已经足够好了(“内点数目大于设定的阈值”);每次产生的模型要么因为内点太少而被舍弃,要么因为比现有的模型更好而被选用。
以RANSAC直线拟合为例,如下图所示,首先在点集中随机选择两个点,求解它们构成的直线参数,再计算点集中剩余点到该直线的距离,距离小于设置的距离阈值的点为内点,统计内点个数;接下来再随机选取两个点,同样统计内点个数,以此类推;其中内点个数最多的点集即为最大一致集,最后将该最大一致集里面的点利用最小二乘拟合出一条直线。
2. 迭代次数的确定
2.1 迭代次数推导
RANSAC(Random Sample Consensus,随机抽样一致性)算法的原理和用于拟合数据中的模型时如何确定迭代次数的方法。RANSAC是一个迭代算法,用于从含有“异常值”(outliers)的数据集中估计数学模型参数。迭代次数的确定是基于概率统计,确保算法以一定的概率找到数据中的有效模型。
让我们以线性回归模型为例,假设我们有一组数据点,其中包含异常值,我们的目标是找到最好的拟合线。
设定:
- t t t:任何一个点被分类为内群点的概率。
- w w w:数据集中内群点的比例。
迭代次数 k k k 的计算基于以下假设:
- 在每次迭代中,至少选中一个内群点的概率是 t t t。
- 至少一次在所有迭代中始终只选中内群点的概率是 P P P。
目标是找到至少有一次迭代中选中的都是内群点,所以计算 k k k,使得至少有 P P P 的概率可以实现这一事件。
推导的公式是:
P = 1 − ( 1 − t n ) k P = 1 - (1 - t^n)^k P=1−(1−tn)k
这里, t n t^n tn 是所有点都是内群点的概率,而 1 − t n 1 - t^n 1−tn 则是至少有一个点是外群点的概率。所以, ( 1 − t n ) k (1 - t^n)^k (1−t