在上一篇博客,介绍了图片映射的相关例子。但在操作中,由于噪声以及错误匹配的干扰,结果并不能让两张图片很好的拼接或者映射。
例如这两幅图,由于玻璃的反射角度,光等因素,造成了使用匹配子查找特征点时产生错误
如何解决这个问题呢?可以通过RANSAC方法来解决
一、RANSAC
RANSAC的全称是“RANdom SAmple Consensus(随机抽样一致)”。它可以从一组包含“局外点”的观测数据集中,通过迭代方式估计数学模型的参数。它是一种不确定的算法,也就是说它有一定的概率得出一个合理的结果,所以为了提高概率必须提高迭代次数。
(一)步骤
- 随机选择四对匹配特征
- 根据DLT计算单应矩阵 H (唯一解)
- 对所有匹配点,计算映射误差ε= ||pi’, H pi||
- 根据误差阈值,确定inliers(例如3-5像素)
- 针对最大inliers集合,重新计算单应矩阵 H
(二)示例
1.在给定若干二维空间中的点,求直线 y=ax+b ,使得该直线对空间点的拟合误差最小。
2.随机选择两个点,根据这两个点构造直线,再计算剩余点到该直线的距离
给定阈值(距离小于设置的阈值的点为inliers),计算inliers数量
3.再随机选取两个点,同样计算inliers数量
4.循环迭代,其中inliers最大的点集即为最大一致集,最后将该最大一致集里面的点利用最小二乘拟合出一条直线。
(三)参数
在上面原理介绍中,有两个重要的参数需要设置,即采样次数和阈值。
当数据过大的时候,若采集所有样本会造成算法复杂度过高,计算难度加大。Fischler和Bolles通过概率统计的方法得出了采样次数与数据中外点比例和得到一个好样本概率之间的数学关系
其中K为需要采样的次数,z为获取一个好样本的概率,一般设为99%;w为点集中inliers的比例,一般可以在初始时设置一个较小值,如0.1,然后迭代更新;n为模型参数估计需要的最小点个数,通常设置为2,直线拟合最少需要2个点。
阈值一般根据经验来设定,当观测误差符合0均值和sigma标准差的高斯分布时,则可以计算距离阈值。当inliers被接受的概率为95%时,阈值t2=3.84σ2。
(四)特点
RANSAC只能从特定的数据集中估计出一个模型,如果存在两个(或多个)模型,RANSAC则不能找到别的模型。
优点:能鲁棒的估计模型参数,能从包含大量局外点的数据集中估计出高精度的参数
缺点:它计算参数的迭代次数没有上限,如果设置迭代次数的上限,得到的结果可能不是最优的结果,甚至可能得到错误的结果
(五)使用RANSAC算法匹配
RANSAC算法只能描述同一平面的问题。当特征匹配对处于不同平面时,特征匹配则不同。
二、APAP
在图像拼接融合的过程中,