RANSAC学习笔记

在进行其他方面的学习之前,我准备先仔细了解一下RANSAC算法,虽然这一算法在整个项目里一般只占很小的一个比重,而且很多开源的库里(比如OpenCV)都带有这一算法,或整合了这一算法,但是它的思想和方法可以被用在很多地方。

什么是RANSAC算法

RANSAC,即RANdom SAmple Consensus,随机抽样一致算法,是一个基于概率的模型拟合方法。它的特点是能够排除错误地纳入模型内的数据,防止过拟合和干扰。

RANSAC算法的基本逻辑

首先,这一方法认为所有的数据点分为三种:

  • 局内点:局内点指的是符合模型的点,也是我们要获取的点集。
  • 局外点:局外点指的是虽然是准确而且有意义的数据,但是它不符合我们的模型,属于干扰部分
  • 噪声点:就是通常的噪声点,因为送入的数据在处理或者传输上使用了不恰当的方法而产生或没有排除的干扰点。

RANSAC还假设,如果获得一组局内点,那么可以找到合适的模型拟合方法,拟合后的模型可以解释局内点。

而整个RANSAC算法的运行过程,可以简单理解为,随机抽取一部分点,让这一部分点作为局内点拟合模型,然后评价模型的优秀程度。

RANSAC在机器视觉中的应用

从上文的解释中可以看出来,RANSAC是一个用于拟合的方法思想,甚至不能说是一个独立的算法,仍然要依赖于别的算法自身的拟合方法来处理数据。所以RANSAC在各种不同的地方有不同的应用,在这里我们只讨论RANSAC在机器视觉中的应用,更准确地说,是在特征点匹配时,因为存在大量的误匹配可能,而利用RANSAC提高准确率的方法。

单应性矩阵

在了解RANSAC之前,我们先来看一下什么是单应性矩阵。因为我们之前研究的大多是纯理论层面的算法,所以对这一概念涉及不多,但是之后就要经常用到。单应性矩阵,即Homography Matrix,是用来进行单应性变换的映射矩阵。那么什么是单应性变换呢?可以理解为,是在两个不同的视角下,对同一个物体进行的变换。就是说,可以用来建立两个不同视角下的同一物体的在图像上的状态之间的关系。

生活中使用单应变换的例子有很多,最容易见到的就是二维码扫描。在扫描器处理二维码的时候,先检测到它的特征点集,然后通过单应性变换将它转换到正对摄像头的正方形,之后进行解码,这就是为什么不管从什么角度拍二维码都能够识别(太奇怪的角度除外)。除此之外,像有标记物的AR技术也是使用了单应性变换。

单应性矩阵是这样的:

\[H=\left[\begin{array}{l l l}h_{11} & h_{12} & h_{13} \\ h_{21} & h_{22} & h_{23} \\ h_{31} & h_{32} & h_{33}\end{array}\right]\]

直接用单应性矩阵处理模型坐标组即可获得场景坐标组。虽然它有9个参数,但是因为它可以按比例缩放,所以通常把\(h_{33}\)定为1以方便处理,这样,它只有8个自由度,获得4组对应关系即可求出。

RANSAC运行

首先需要说明的是,RANSAC是一个过滤方法,是用来筛选出匹配点对里面的正确匹配点的,而非是一种匹配方法,所以在完成匹配之后使用。之前说到,因为单应性矩阵最少通过4组对应关系即可求出,所以RANSAC将先随机选出4对匹配点,利用它们求出单应性矩阵,之后使用单应性矩阵处理所有点,并计算满足这个模型的数据点的个数与投影误差。满足这个模型的数据点,就是投影误差在一个阈值以内的点。投影误差就是这里的代价。计算方法是:

\[\sum_{i=0}^n(x_i'-\frac{h_{11}x_i+h_{12}y_i+h_{13}}{h_{31}x_i+h_{32}y_i+h_{33}})^2+(y_i'-\frac{h_{21}x_i+h_{22}y_i+h_{23}}{h_{31}x_i+h_{32}y_i+h_{33}})^2\]

可以想到,因为我们直接用了代价函数来评价一个单应性矩阵的好坏,就不再需要从纯理论的角度来推导怎样调节RANSAC的参数了,但是阈值和迭代次数仍然需要我们手动设置。因为RANSAC是概率方法,有一定概率找到最优解,所以唯一保证能够找到最优解的方法就是遍历所有点的组和,但是因为时间代价太高,通常设置一个搜索上限。到达搜索上限之后,找到的最好的单应性矩阵所过滤出来的局内点集就被认为是最优点集。


到这里RANSAC的基本知识就结束了。之后我们将继续其他图形处理算法的学习。