Ransac算法

算法简化思路

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

ransac直线拟合 Python_数据集

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

ransac直线拟合 Python_ransac直线拟合 Python_02

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

ransac直线拟合 Python_拟合_03

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

ransac直线拟合 Python_数据集_04

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


RANSAC算法步骤:

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

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

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

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

  1. 计算数据集中所有点与步骤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\)列向量。如下图:

ransac直线拟合 Python_数据集_05

  1. 如果当前内点集\(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\)即可满足需求.

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

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