RANSAC 算法

Ransac算法

算法简化思路

第一步:假定模型(如直线方程),并随机抽取\(s\)个(以2个为例)样本点,对模型进行拟合:

img

第二步:由于不是严格线性,数据点都有一定波动,假设容差范围为:\(\varepsilon\),找出距离拟合曲线容差范围内的点,并统计点的个数:

img

第三步:重新随机选取s个点,重复第一步~第二步的操作,直到结束迭代:

img

第四步:每一次拟合后,容差范围内都有对应的数据点数,找出数据点个数最多的情况,就是最终的拟合结果:

img

以上可以直观的看出Ransac算法的流程结果。


RANSAC算法步骤:

  1. 随机从数据集中选取s个样本数据,去拟合一个模型M;

    如直线可以选取2个点去拟合一条直线\(y=ax+b\);

    圆可以选取3个点去拟合一个圆\((x-a)^2+(y-b)^2=c^2\)

    图像匹配可以选取四对点去拟合单应矩阵H

  2. 计算数据集中所有点与步骤1拟合出的模型M的投影误差,如果误差小于阈值\(\varepsilon\),则该点认定为内点并加入内点集I,否则认定为外点;

    对于图像匹配而言,通过步骤1计算出的单应矩阵\(H_1\),然后从左图特征点中随机选取点\(p_{lefg}\),对应右图特征点\(p_{right}\),则计算投影误差\(erro = || p_{right} - H_1 \cdot p_{left} ||^2\),其中\(p_{left},p_{right}\)为归一化的\(3 \times 1\)列向量。如下图:

    img

  3. 如果当前内点集\(I\)的数量大于最优内点集\(I_{best}\),则更新\(I_{best} = I\),同时根据得到的内点数计算内点的概率\(\rho\),然后根据内点概率更新采样次数\(k\)

    N:样本点数

    s:求解模型M所需要的最少点数

    k:采样次数

    \(\rho\):内点率

    \(\rho^s\)\(s\)个点都是内点的概率

    \(1-\rho^s\):至少有一个点是外点(采样失败)的概率

    \((1-\rho^s)^k\)\(k\)次采样全部失败的概率

    \(p=1-(1-\rho^s)^k\):采样\(k\)次至少成功一次的概率

    \(\boldsymbol {k=\frac {\lg(1-p)}{\lg(1-\rho^s)}}\):要使成功概率至少为\(p\),采样的次数。(对上式取对数)

    对于一般问题我们不知道内点率值,所以可以给定一个初值\(\rho_o\),后面在迭代的过程中会更新。一般当\(p >=0.95\)即可满足需求.

  4. 如果\(k=0\),则停止采样,说明内点概率$\rho $足够大,生成的模型已经能够满足要求,内点为正确匹配点,删除外点

  5. 否则继续以上操作。

手写测试代码后续补充吧。。。

参考1

posted @ 2021-12-20 16:33  小小灰迪  阅读(718)  评论(0编辑  收藏  举报