Ransac全称为Random Sample Consensus,随机一致性采样。该方法是一种十分高效的数据拟合方法。我们通过最简单的拟合直线任务来了解这种方法思路,继而扩展到特征点匹配中的误点剔除问题。

(注意,RANSAC不是直接用于特征点匹配,而是一种在初步特征匹配后消除误匹配的方法)

直线拟合过程

在平面直线拟合任务中,我们的目标是找到一条直线方程,使得数据集中大部分点都在这条直线方程附近;另一种理解,就是找到一个x,y之间的映射关系(模型),使得该映射关系能够尽量反映数据集中大部分点的x,y之间的关系。

首先,由于两个点能够确定一条直线,我们在数据集中随机选取两个点,通过这两个点确定一条直线方程。

接下来,让数据集内的所有点对刚才选择的直线方程进行评估,看这条方程选的怎么样。我们计算所有点到直线的距离。

设置一个阈值范围来定义直线的”附近“,在这个范围内的点作为内点,范围外的点作为外点。计算内点数量。

接下来重复上面的步骤,再次随机选取两个点,求解方程,所有点计算距离,得到内点数量。

重复这一过程直到内点数量满足要求,或者达到迭代次数,此时得到的直线方程就是我们需要的直线方程。

最后,为了更加精确的找到这个映射关系,我们还是需要对所有的内点进行一次最小二乘拟合。得到最终结果。

整体流程如下:

重复 N 次:

  • 均匀随机抽取 2 个点
  • 对这 2 个点进行直线拟合
  • 在剩余的点中找出该直线的内点(即与直线距离小于 t 的点)
  • 如果内点数量达到 d 个或更多,则接受该直线,并使用所有内点重新拟合

对直线拟合的RANSAC方法的思考

这个方法几乎是完全随机的、暴力的去求解这个问题。这种方法可行吗?

在计算机学科里,这种方法还真是可行。它不仅简单,还能适用于多种不同的问题。

在直线拟合任务中,数据集中每一个点(x, y),我们称其为一个sample,通过许多这样的sample,我们期望找到一个映射关系(model),能够最好的描述x, y之间的关系,使得更多的sample落在该模型的附近。事实上,任何类似这种给定samples(每个sample都是一组离散的映射),求解最优的整体映射模型的问题,都可以用RANSAC方法进行处理。

RANSAC的通用步骤

  1. 随机选择一个最小subset sample集,用于描述模型
  2. 拟合这个模型
  3. 让其他的点对这个模型进行投票,选出距离这个模型近的点作为内点,其他作为外点
  4. 重复这一过程,直到得到最优的模型

RANSAC的大体思想就是这样,我们下面讨论一些细节问题,如何选择参数?

参数选择

初始点的数量 s

通常为拟合模型所需的最少点数,比如直线拟合,确定一条直线的最小点集是2个,s就为2。

距离阈值 t

哪些点是内点,这是一个任务导向的问题。需要根据任务的数据集具体情况而定。选择 t,使内点出现的概率为 p(例如 0.95)

如果数据中的噪声分布符合均值为 0、标准差为 σ 的高斯噪声,则 t² = 3.84σ²

采样次数 N

可能我们迭代几次就找到了最优解,后续的迭代都是浪费资源;也有可能我们迭代了很多次,也找不到最优解,而这个很多次到底选多少?几百?几千?几万?这个迭代次数N如何确定。

这时我们只有采用概率的方式来确定迭代次数,也就是迭代N次,最有可能得到最优解。

设迭代N次后,至少有一次我们选择的随机样本是最优解(不含外点的模型),这个概率为p。也就是说N次迭代后我们完美找到最优解的概率为p,我们当然希望这个p值较高,我们定一个p=0.99。

那么N次迭代后我们一次都没有选择到最优解(不含外点模型)的概率是多少?显然这个说法和上面的是逻辑互斥的,这个概率为1 - p

从另一个角度来说,我们假定真实的外点率为e,在一次迭代内我们选择了s个点,这s个点我们都选择了真实内点的概率,应该是\((1-e)^s\)

相反的,这s个点我们至少选了一个外点的概率,就是\(1-(1-e)^s\),也就是本次迭代没有得到最优解的概率。如果N次迭代每次都没有得到最优解呢,这个概率就是\((1-(1-e)^s)^N\)

上面两个粗体的描述是一致的,我们从两个角度得到了迭代N次都没有得到最优解的概率,从而将e、s、N、p这几个变量建立了关系:

\[\left(1-(1-e)^{s}\right)^{N}=1-p
\]

两边同时log一下,我们就得到了N的表达式

\[N=log (1-p) / log \left(1-(1-e)^{s}\right)
\]

在实践中,我们选择 N时,可以通过确定p = 0.99,估计一下数据集中的外点率e,通过模型类型确定s,来计算N的大小。如图中表格所示,如果外点率为40%,s为2,那么要达到0.99的最优解获得概率,迭代次数就应为7:

当然这是通过概率来算出来的迭代次数,只是给一个参考,实践中我们还是应当适当选取一个更大的值。

此外,内点比例 e 通常是先验未知的,所以选取最不利的情况,例如 50% 。如果发现了更多内点,则进行调整,例如若实际内点比例为 80%,那么异常值比例e=0.2 。

一致集大小 d

这个也是和数据集相关,应与预期的内点比例 1 - e 相匹配

自适应迭代次数

在RANSAC的应用中,我们通常采用一种自适应的过程去控制迭代次数。过程如下:

初始N设为无穷大,sample_count(采样计数)设为 0

当 N>sample_count 时:

  • 选择一个样本并统计内点的数量
  • 计算 e=1−(内点数量)/(点的总数)
  • 根据e重新计算N:
\[N=log (1-p) / log \left(1-(1-e)^{s}\right)
\]
  • sample_count 自增 1

这样尽管最初的迭代次数N为无穷大,但我们在循环中,通过每次迭代算出来的外点率e可以得到新的N值,N值会不断减小。如果N值小于当前sample_count了,表示理论上迭代N次就够了,但我现在已经迭代了sample_count次(>N),所以迭代就可以停止了。

RANSAC在特征匹配问题中的应用

在图像特征进行匹配之后,往往得到的许多匹配点都是误点,如图:

这些误点会影响后续的图像拼接、识别等操作,需要将它们去除掉。得到如下图:

这个过程就可以采用RANSAC的方法。

在特征点的匹配中,每一对匹配的特征,就是一个离散的映射关系,也就是一个sample。(类比于直线拟合中的(x,y))。

存在一个最优的变换模型,对两个图像中的匹配点进行映射(类比于直线拟合中的直线方程)。

在图像的特征点变换时,我们用单应性矩阵描述两个平面之间的透视关系,它把一个平面上的点通过齐次坐标映射到另一个平面上。其公式为:

通常令h33=1来归一化矩阵。由于单应性矩阵有8个未知参数,至少需要8个线性方程求解,对应到点位置信息上,一组点对可以列出两个方程,则至少包含4组匹配点对。

适配这个最优转换模型的samples,就是内点。不适配这个模型的samples,就是外点。(注意这里的内点和外点不是图像上的特征点,而是由一对匹配好的特征点组成的sample)

随机抽样一致性算法(RANSAC)的优缺点

  • 优点

    • 简单且通用
    • 适用于许多不同的问题
    • 在实际应用中通常效果良好
  • 缺点
    • 有很多参数需要调整
    • 对于低内点比例的情况效果不佳(迭代次数过多,甚至可能完全失败)
    • 基于最少样本数量,并不总能获得模型的良好初始值

RANSAC---从直线拟合到特征匹配去噪的更多相关文章

  1. OpenCV2马拉松第25圈——直线拟合与RANSAC算法

    计算机视觉讨论群162501053 转载请注明:http://blog.csdn.net/abcd1992719g/article/details/28118095 收入囊中 最小二乘法(least ...

  2. 利用SIFT进行特征匹配

    SIFT算法是一种基于尺度空间的算法.利用SIFT提取出的特征点对旋转.尺度变化.亮度变化具有不变性,对视角变化.仿射变换.噪声也有一定的稳定性. SIFT实现特征的匹配主要包括四个步骤: 提取特征点 ...

  3. OpenCV2:特征匹配及其优化

    在OpenCV2简单的特征匹配中对使用OpenCV2进行特征匹配的步骤做了一个简单的介绍,其匹配出的结果是非常粗糙的,在这篇文章中对使用OpenCV2进行匹配的细化做一个简单的总结.主要包括以下几个内 ...

  4. 特征提取(Detect)、特征描述(Descriptor)、特征匹配(Match)的通俗解释

    特征匹配(Feature Match)是计算机视觉中很多应用的基础,比如说图像配准,摄像机跟踪,三维重建,物体识别,人脸识别,所以花一些时间去深入理解这个概念是不为过的.本文希望通过一种通俗易懂的方式 ...

  5. 2d-Lidar 点云多直线拟合算法

    具体步骤: EM+GMM(高斯模糊模型) 点云分割聚类算法的实现. 基于RANSAC单帧lidar数据直线拟合算法实现. 多帧lidar数据实时直线优化算法实现. 算法实现逻辑: Struct lin ...

  6. OpenCV-Python 特征匹配 + 单应性查找对象 | 四十五

    目标 在本章节中,我们将把calib3d模块中的特征匹配和findHomography混合在一起,以在复杂图像中找到已知对象. 基础 那么我们在上一环节上做了什么?我们使用了queryImage,找到 ...

  7. OpenCV 之 特征匹配

    OpenCV 中有两种特征匹配方法:暴力匹配 (Brute force matching) 和 最近邻匹配 (Nearest Neighbors matching) 它们都继承自 Descriptor ...

  8. [OpenCV]基于特征匹配的实时平面目标检测算法

    一直想基于传统图像匹配方式做一个融合Demo,也算是对上个阶段学习的一个总结. 由此,便采购了一个摄像头,在此基础上做了实时检测平面目标的特征匹配算法. 代码如下: # coding: utf-8 ' ...

  9. OpenCV2简单的特征匹配

    特征的匹配大致可以分为3个步骤: 特征的提取 计算特征向量 特征匹配 对于3个步骤,在OpenCV2中都进行了封装.所有的特征提取方法都实现FeatureDetector接口,DescriptorEx ...

  10. (原)opencv直线拟合fitLine

    转载请注明出处 http://www.cnblogs.com/darkknightzh/p/5486234.html 参考网址: http://blog.csdn.net/thefutureisour ...

随机推荐

  1. Django_使用汇总(1)

    使用django(4.1.5) 搭建股票信息后台,显示股票信息: Stock -> models.py class Stock(models.Model): symbol = models.Ch ...

  2. 【译】在分析器中使用 Meter Histogram(直方图)解锁见解

    您是否正在与应用程序中的性能瓶颈作斗争?不要再观望了!Visual Studio 2022 在其性能分析套件中引入了 Meter Histogram(直方图)功能,为您提供了前所未有的分析和可视化直方 ...

  3. shell脚本检查192.168.1网段ip是否在用

    要检查 192.168.1 网段中哪些 IP 地址正在使用,可以使用 Shell 脚本结合 ping 命令来扫描整个网段.以下是实现这一功能的完整脚本: 脚本:检查 192.168.1 网段 IP 是 ...

  4. 开箱你的 AI 语音女友「GitHub 热点速览」

    随着大模型 API 服务的不断丰富,开发者无需再依赖昂贵的硬件,也能轻松开发出拥有强大 AI 能力的应用.这不仅降低了技术门槛,也激发了极客们的创造力. 就比如上周飙升 1.5k Star 的开源项目 ...

  5. 阿里云-数据库-表格存储Tablestore

    入门篇一 初步调研了解 Step.1 场景锲合度判断选择使用表格存储前关键需要明确你的场景是否适合.表格存储是阿里云自2010起自研使用的一个多模型NoSQL数据库,面向海量大数据存储,身经百战.非常 ...

  6. Quartz调度框架详解、运用场景、与集群部署实践

    以下将分别从Quartz架构简介.集群部署实践.Quartz监控.集群原理分析详解Quartz任务调度框架. Quartz简介 Quartz是Java领域最著名的开源任务调度工具,是一个任务调度框架, ...

  7. Kubernetes 知识梳理及集群搭建

    Kubernetes介绍 应用部署方式演变 在部署应用程序的方式上,主要经历了三个时代: 传统部署:互联网早期,会直接将应用程序部署在物理机上 优点:简单,不需要其它技术的参与 缺点:不能为应用程序定 ...

  8. LeetCode 未验证规则

    1. for循环容易忘记break,很多提交不过,都是因为这个 2. 左右指针,思考起来比较复杂,但是以代码容易理解.code精简为主,不要在乎省下一两次运算时间 3. 左右指针,有时候以left & ...

  9. Maven:目前的部分技术

  10. android主线程与子线程

    创建子线程创建子线程 更多关于java线程的文章可以查看这两篇 线程1 创建线程的方法 在android中穿件子线程的方案很简单 创建子线程的几种方法 ///////第一种/////// class ...