计算机视觉中的算法 RANSAC

603 阅读4分钟

这是我参与更文挑战的第 9 天,活动详情查看: 更文挑战

什么是图像匹配

图像配准就是找到一幅图像像素到另一幅图像像素间的空间映射关系。这些图像可以是不同时间(多时间配准),不同传感器在不同地方拍摄(多模式配准)。这些图像之间的空间关系可以是刚性 (平移和旋转),仿射(例如剪切),单应性(或复杂的大变形模型)。

005.png

RANSAC(Random sample consensus)

RANSAC 主要是用于处理外点数(outline) 比较多情况下来搜索一条直线或进行模型参数拟合。从 RANSAC 全名字面意思是随机采样一致性。是一种非常简单且有效估计模型参数的方法。不仅限于直线模型的参数,在 SLAM 通过对比前后量帧图像上特征点间关系可以计算出摄像机的外参数,从而计算运动轨迹并生成稀疏点云。

常用术语

对于RANSAC算法来说一个基本的假设就是数据是由内点外点组成的。

  • 内点就是组成模型参数的数据
  • 外点就是不适合模型的数据

003.png

同时 RANSAC 假设:在给定一组含有少部分内点的数据,存在一个程序可以估计出符合内点的模型。

通常会有如下几个步骤

  • 首先选择最小集合,例如估计一条直线参数,就需要选择两个点,因为两点确定一条直线,有了两个点我们就可以写出一个直线方程
  • 然后用除了选中点以外的点对这条直线进行投票,也就是计算剩余点到该直线的距离,然后设定一个阈值,计算距离小于这个阈值的点数量,数量越多投票数也就是越多

002.png

如图

  • Step1 随机选取 2 个点
  • Step2 通过选取的 2 个点绘制一条直线
  • Step3 计算剩余点到该直线的距离,然后根据之前设定阈值 t 来计算距离小于阈 值点数量作为投票点。

到此算完成一次迭代,重复上面的迭代记录小每次迭代选择点后绘制所得到的投票数,投票数最大所对应的直线模型就是我们要找到的直线

如何选择迭代次数 N

从上面求解过程,可以发现迭代次数 N 和内点率 t 或者理解为外点率 e 都可以这些参数确定是比较困难的,可以感觉经验进行来设置这些参数,

t=ninlinersninliners+noutlinerst = \frac{n_{inliners}}{n_{inliners} + n_{outliners}}

(1tS)N=1p(1 - t^S)^N = 1 - p

  • N 表示迭代次数
  • 选择样本数用 S 来表示
  • 其中 p 为 RANSAC 给出正确模型的概率,那么给出正确模型就是说明选择点都是内点,这里 1 - p 也就是 RANSAC 给出错误模型的概率
  • t 内点率,S 表示选择样本数量,如果 S 次选取的都是内点的概率为 tSt^S

N=1p1tSN = \frac{1 - p}{1 - t^S}

RANSAC 输出

通常我们还会设定一个阈值,这个阈值是关于投票数的阈值,也就是最少投票数值,计算出直线中投票数最大的直线的投票数量还需要大于这个最少投票数才可以。其实 RANSAC 输出一个一条投票数最多且大于事先设定好阈值的直线模型参数,也可以是多条投票数大于最小投票(阈值)的多条直线。

如何确定外点率

通常我们对这些点的外点率是一无所知的,那么在这种情况下应该如何处理呢? 首先将迭代次数 N 设置无穷大,因为现在对外点率一无所知,所以也就没办法设置 N。所以真实迭代次数 sample_count 通常都会比 N 小

  • sample_count 可以给一个初始值 0,然后选择两个点来确定一条直线,有了一条直线就可以确定当前直线的内点率,也就是距离直线小于我们事先指定好阈值的哪些点数量比上总的点数量。
  • 通过内点率来计算外点率

e=1numberofinlierstotalnumberofpointse = 1 - \frac{number\,of\, inliers}{total \, number \, of \, points}

  • 那么到现在我们就拿到几个值,分别是直线 l 方程、d 内点数以及 e 外点率从而可以计算出一个 N1

接下来就是将 sample_count 增加 1 然后重复上面步骤,在下一次迭代中 N 就不再是无穷大而是用 N1 来 如果在下一次迭代中计算 d 内点数量要比上一次高就保留本次 d 以及计算得到 N1 而舍弃上一次的计算得到 N1 。