RANSAC算法:从原理到图像拼接的实践

news2024/9/21 16:39:28

RANSAC算法:从原理到图像拼接的实践

1. RANSAC算法原理和步骤

1.1 RANSAC算法简介

RANSAC (RANdom SAmple Consensus, 随机采样一致) 算法是从一组含有“外点”(outliers)的数据中正确估计数学模型参数的迭代算法。“外点”一般指的的数据中的噪声,比如说匹配中的误匹配和估计曲线中的离群点。所以,RANSAC也是一种“外点”检测算法。RANSAC是一个非确定性算法,在某种意义上说,它会产生一个在一定概率下合理的结果,其允许使用更多次的迭代来使其概率增加。RANSAC算最早是由Fischler和Bolles在SRI上提出用来解决LDP(Location Determination Problem,位置确定问题)问题的。

对于RANSAC算法来说一个基本的假设就是数据是由“内点”和“外点”组成的。“内点”就是组成模型参数的数据,“外点”就是不适合模型的数据。同时RANSAC假设:在给定一组含有少部分“内点”的数据,存在一个程序可以估计出符合“内点”的模型。

1.2 RANSAC算法基本思想和流程

RANSAC的思想比较简单,主要有以下几步:

  • 给定一个数据集S,从中选择建立模型所需的最小样本数(空间直线最少可以由两个点确定,所以最小样本数是2,空间平面可以根据不共线三点确定,所以最小样本数为3,拟一个圆时,最小样本数是3),记选择数据集为S1
  • 使用选择的数据集S1计算得到一个数学模型M1
  • 用计算的模型M1去测试数据集中剩余的点,如果测试的数据点在误差允许的范围内,则将该数据点判为内点(inlier),否则判为外点(outlier),记所有内点组成的数据集为S1’S1’ 称作 S1的一致性集合。
  • 比较当前模型和之前推出的最好的模型的“内点”的数量,记录最大“内点”数量时模型参数和“内点”数量。
  • 重复1-4步,直到迭代结束或者当前模型已经足够好了(“内点数目大于设定的阈值”);每次产生的模型要么因为内点太少而被舍弃,要么因为比现有的模型更好而被选用。

以RANSAC直线拟合为例,如下图所示,首先在点集中随机选择两个点,求解它们构成的直线参数,再计算点集中剩余点到该直线的距离,距离小于设置的距离阈值的点为内点,统计内点个数;接下来再随机选取两个点,同样统计内点个数,以此类推;其中内点个数最多的点集即为最大一致集,最后将该最大一致集里面的点利用最小二乘拟合出一条直线。

在这里插入图片描述

2. 迭代次数的确定

2.1 迭代次数推导

RANSAC(Random Sample Consensus,随机抽样一致性)算法的原理和用于拟合数据中的模型时如何确定迭代次数的方法。RANSAC是一个迭代算法,用于从含有“异常值”(outliers)的数据集中估计数学模型参数。迭代次数的确定是基于概率统计,确保算法以一定的概率找到数据中的有效模型。

让我们以线性回归模型为例,假设我们有一组数据点,其中包含异常值,我们的目标是找到最好的拟合线。

设定:

  • t t t:任何一个点被分类为内群点的概率。
  • w w w:数据集中内群点的比例。

迭代次数 k k k 的计算基于以下假设:

  • 在每次迭代中,至少选中一个内群点的概率是 t t t
  • 至少一次在所有迭代中始终只选中内群点的概率是 P P P

目标是找到至少有一次迭代中选中的都是内群点,所以计算 k k k,使得至少有 P P P 的概率可以实现这一事件。

推导的公式是:
P = 1 − ( 1 − t n ) k P = 1 - (1 - t^n)^k P=1(1tn)k
这里, t n t^n tn 是所有点都是内群点的概率,而 1 − t n 1 - t^n 1tn 则是至少有一个点是外群点的概率。所以, ( 1 − t n ) k (1 - t^n)^k (1tn)k 是所有 k k k 次迭代都至少选中一个外群点的概率, 1 − ( 1 − t n ) k 1 - (1 - t^n)^k 1(1tn)k 就是至少有一次迭代选中的都是内群点的概率。

解这个公式以得到 k k k,我们得到:
k = log ⁡ ( 1 − P ) log ⁡ ( 1 − t n ) k = \frac{\log(1 - P)}{\log(1 - t^n)} k=log(1tn)log(1P)

如果我们设置 P P P 为0.99(即我们希望至少有99%的概率找到有效模型),并假设每次迭代至少选中一个内群点的概率 t t t 是0.5(即每个点有50%的概率是内群点),以及在给定的数据集中内群点的比例 w w w 是0.6(即60%的点是内群点),我们可以计算 t n t^n tn(在这个例子中 n n n 是每次迭代选中的点的数目)。如果每次迭代我们选取两个点来确定模型,那么 t n = w 2 t^n = w^2 tn=w2

现在让我们使用这些值来计算 k k k

我们首先计算每次迭代中只选中内群点的概率 t n t^n tn
t n = w 2 = 0. 6 2 = 0.36 t^n = w^2 = 0.6^2 = 0.36 tn=w2=0.62=0.36

然后,我们计算至少有 P P P 概率找到一个有效模型需要的迭代次数 k k k
k = log ⁡ ( 1 − P ) log ⁡ ( 1 − t n ) = log ⁡ ( 1 − 0.99 ) log ⁡ ( 1 − 0.36 ) k = \frac{\log(1 - P)}{\log(1 - t^n)} = \frac{\log(1 - 0.99)}{\log(1 - 0.36)} k=log(1tn)log(1P)=log(10.36)log(10.99)

现在让我们计算具体的 k k k 值。

通过计算,我们发现当数据集中60%是内群点,且我们希望至少有99%的概率找到一个有效的模型时,需要迭代约10.32次。由于迭代次数必须是整数,我们向上取整,所以至少需要进行11次迭代来保证找到有效模型的高概率。

2.2 迭代次数的自适应决定方法

在使用RANSAC算法时,通常需要设定一个迭代次数,以保证有足够的机会找到数据中的正确模型。迭代次数的设定通常依赖于两个参数:

  1. 内点的概率 t t t:这是指任何一个数据点被判断为内点(即模型的合理数据点)的概率。在现实情况下,这通常是一个基于经验的先验值。

  2. 正确模型的期望概率 P P P:这是指算法至少找到一次正确模型的期望概率。例如,我们可能希望有99%的把握算法能给出正确的模型。

在理想情况下,如果我们知道内点的比例,就可以使用前面讨论过的公式来计算应该迭代的次数。但在实际应用中,我们可能不知道这个内点的真实比例。

自适应迭代次数的方法提供了一种解决方案:

  • 开始时,你可以设定一个非常大的迭代次数,实际上是假定你有无限次的机会来找到正确的模型。

  • 每次迭代,当你用当前的数据集来拟合模型时,你会得到一些数据点符合这个模型,这些点称为内点。

  • 更新 t t t 的估计,你将当前的内点比例作为新的内点概率 t t t 的估计值。

  • 使用新的 t t t,根据前面讨论的公式重新计算所需的迭代次数。这个新的迭代次数将会小于一开始设定的无穷大次数。

  • 继续迭代,每次用新的内点比例来更新迭代次数,直到迭代次数收敛到一个相对小的数值,或者直到找到满意的模型为止。

这个自适应方法的优势是它能够根据实时得到的数据动态调整迭代次数,这使得RANSAC算法可以更有效地处理不同的数据集和不同条件下的异常值。它不需要我们预先知道内点的准确概率,因为它将根据实际观察到的内点比例来调整。这使得算法既灵活又健壮,适用于多种实际应用场景。

3.RANSAC应用

3.1 RANSAC在日常生活中的应用

假设你在组织一次户外远足活动,并且在你的朋友圈中收集参与者的身高数据,以决定采购哪种尺寸的远足装备。

  1. 收集数据:你的朋友们各自报告了他们的身高。

  2. 模型假设:这里的“模型”是你的朋友圈的平均身高。

  3. RANSAC算法步骤

    • 随机选择数据点:从你收集的身高数据中随机挑选一部分,比如5个人的身高。
    • 建立模型:计算这5个人的平均身高。
    • 验证模型:将这个平均身高与其他人的身高对比,看看有多少人的身高接近这个平均值(比如,相差不超过5厘米)。
    • 计算一致点的数量:计算有多少人的身高与这个平均值相近。
    • 重复过程:重复上述步骤多次,每次都随机选择不同的人来计算平均身高。
  4. 选择最佳模型:最终,选择那个与最多人身高接近的平均身高。这个平均身高被认为最能代表你朋友圈的普通身高水平。

关于RANSAC的迭代次数,就像之前解释的那样,它取决于数据中异常值的比例以及你所期望的模型置信度。在这个例子中,如果你的朋友圈中身高差异很大,可能就需要更多的迭代来找到一个准确的平均身高。

这个简单的例子帮助说明了RANSAC算法如何在包含异常值的情况下工作,并如何通过迭代来找到最佳模型。在实际应用中,RANSAC通常用于更复杂的任务,比如图像处理或机器人导航,但基本原理是相同的。

3.2 RANSAC在图像拼接中的应用(一)

RANSAC算法在计算机视觉中经常被用于图像拼接,特别是在特征点匹配过程中排除错误匹配(即异常值)来找到正确的变换矩阵。以下是使用RANSAC算法进行图像拼接的步骤:

  1. 特征点检测和匹配

    • 对两张有部分重叠的图像使用特征点检测算法(如SIFT)。
    • 识别出特征点后,使用描述子在两图像间找出相匹配的点对。
    • 这时,你会得到一组特征点匹配,其中可能包含正确的匹配(内点)和错误的匹配(外点)。
  2. RANSAC迭代

    • 随机选择四对匹配点(在变换矩阵估计中,至少需要四个点)并计算变换矩阵,这里的变换矩阵可能是仿射变换或者单应性变换,具体取决于你的应用场景。
    • 使用这个变换矩阵将一张图像中的特征点映射到另一张图像上。
    • 计算其他所有匹配点对变换后的位置与实际匹配位置的距离。
    • 根据一个预先设定的阈值确定哪些点是内点(即距离小于阈值的点对)。
  3. 模型评估和更新

    • 在每次迭代中,保留产生最多内点的变换矩阵。
    • 如果新的变换矩阵产生更多的内点,就用它替换之前的变换矩阵。
    • 更新当前内点比例 w w w,并据此重新估计所需的迭代次数。
  4. 迭代次数计算

    • 使用前面提到的公式 k = log ⁡ ( 1 − P ) log ⁡ ( 1 − w n ) k = \frac{\log(1 - P)}{\log(1 - w^n)} k=log(1wn)log(1P) 来估计迭代次数,其中 P P P 是我们希望得到一个好模型的概率(通常接近1), w w w 是当前内点的比例, n n n 是每次迭代中用于估计模型的点的数量(在图像拼接中通常是4)。
  5. 最终模型

    • 重复上述迭代过程直到达到迭代次数,或者当找到一个足够好的模型时停止。
    • 最后使用产生最多内点的变换矩阵来转换整张图像,从而完成图像拼接。

例子

假设你有两张图片A和B,它们有一定区域的重叠。首先,你在两张图片上各自检测出100个特征点,并找到了50对匹配的特征点。

使用RANSAC进行图像拼接的过程中:

  • 假设在一次迭代中,你随机选择了4对匹配的特征点,并计算出了一组变换矩阵。
  • 应用这个变换矩阵到A图像的所有100个特征点上,将它们映射到B图像的坐标空间。
  • 计算这些映射点与它们在B图像上的匹配点之间的距离。
  • 设定一个阈值(比如3个像素),距离小于阈值的被认为是内点。
  • 假设在这次迭代中,有30对匹配被认为是内点。
  • 你现在可以使用这30对内点更新内点的比例,从而重新计算所需的迭代次数。如果一开始我们没有内点的比例的估计,我们可以从当前迭代得到的内点比例作为 w w w 的初始估计值。

在我们的例子中,如果在某次迭代中我们找到了30对内点,那么内点的比例 w w w 就是 30 50 = 0.6 \frac{30}{50} = 0.6 5030=0.6(因为有50对匹配点)。如果我们希望至少有99%的概率找到一个正确的模型,那么我们可以根据这个内点比例来重新计算所需的迭代次数 k k k

根据前面的计算公式:

k = log ⁡ ( 1 − P ) log ⁡ ( 1 − w n ) k = \frac{\log(1 - P)}{\log(1 - w^n)} k=log(1wn)log(1P)

这里 P P P 可以设定为0.99, n n n 是用于计算变换矩阵的点的数量,对于单应性变换通常是4。将这些值代入到公式中,我们可以得到所需的迭代次数。

这个迭代次数会告诉我们,在当前的内点比例下,我们应该进行多少次迭代,以确保至少有99%的概率找到一个稳健的变换矩阵。每次迭代后,我们都可以用最新的内点比例来更新这个迭代次数,直到满足停止条件——要么是因为我们已经进行了足够多的迭代,要么是因为我们找到了一个非常好的模型。

在计算机视觉中的图像拼接例子里,这个过程就是在排除错误的特征点匹配的同时,找到一个能够正确表示两个图像间关系的变换矩阵。最终,这个变换矩阵可以用于将两张图像合并成一张大的全景图。

3.3 RANSAC在图像拼接中的应用(二)

在计算机视觉中,尤其是在处理具有重叠部分的两张图片时,RANSAC算法的作用非常关键。我们可以用一个具体的例子来理解这个过程:假设你有两张照片,一张是一座桥的左半部分,另一张是同一座桥的右半部分。这两张照片有一部分重叠区域。我们的目标是准确匹配这两张照片的特征点,以便能够将它们拼接成一张完整的桥的图像。

  1. 特征点检测:首先,在每张图片中检测特征点。这些特征点是图片中独特的区域,可以用于比较和匹配。

  2. 特征点匹配:然后,尝试找到两张图片中相对应的特征点。在没有使用RANSAC之前,这个过程可能会包括一些错误匹配,因为有些特征点看起来可能在两张图片中都很相似,但实际上并不是相同的点。

  3. 应用RANSAC算法

    • 随机选择匹配:RANSAC开始时会从所有匹配中随机选择一小部分,比如说4对匹配点。

      选择四对匹配点是基于图像变换中的一个常见做法,尤其是在处理像素坐标间的变换时。让我们详细地探讨这个选择的原因:

      1. 变换模型的需求:在图像拼接中,通常涉及到的变换模型是仿射变换或者更复杂的透视变换(单应性变换)。

      2. 仿射变换:对于仿射变换,你至少需要三对匹配点来唯一确定变换。仿射变换考虑了旋转、平移、缩放和剪切,但保持了直线和平行性。

      3. 透视变换(单应性变换):透视变换则更加复杂,可以处理图像中的深度和视角变化。为了确定一个透视变换,你需要至少四对匹配点。这是因为每对匹配点可以提供两个方程(对应于x和y坐标),而确定透视变换需要至少八个参数。

      4. 准确性和稳定性:在RANSAC算法中,选择四对匹配点是一种比较保守的策略,用于确保能够处理更复杂的透视变换。即使在仿射变换的场景中也适用,因为多出的一对匹配点可以增加估计的准确性和稳定性。

      5. 鲁棒性:选择四对匹配点而不是最低限度的三对,可以提高对噪声和错误匹配的鲁棒性。即使其中一对匹配点是错误的,其他三对正确的匹配点仍然可能足以形成一个可靠的变换模型。

      因此,在RANSAC算法中使用四对匹配点是为了适应各种可能的变换(尤其是透视变换),同时提供足够的准确性和鲁棒性。这在处理具有复杂视角和深度变化的图像拼接时尤为重要。

    • 估计变换模型:使用这些选中的匹配点来估计两张图片之间的变换模型。这个模型可能是一个旋转加平移,或者是更复杂的变换。

    • 验证模型:然后用这个模型来测试所有其他的匹配点,看它们是否符合这个变换。符合变换的点被视为内点,不符合的为外点。

    • 重复过程:重复上述过程多次,每次都使用不同的匹配点来估计模型。

  4. 选择最佳模型:最终选择内点数最多的模型。这个模型被认为最好地表示了两张图片之间的正确对应关系。

通过RANSAC,我们可以排除那些错误的匹配点,这些点可能是由于噪声、光照变化或者其他干扰因素造成的。这样,RANSAC帮助我们找到了最可靠的匹配集合,从而准确地拼接两张图片。

在实际应用中,RANSAC算法不仅可以用于图像拼接,还广泛应用于立体视觉、运动估计和三维重建等领域,因为它能够有效地从带有噪声的数据中找出最合适的模型。

注:仿射变换和透视变换的RANSAC应用比较

在RANSAC算法中,仿射变换和透视变换(或称为单应性变换)是两种常见的几何变换。

  • 仿射变换:它保持了图形的平行线,但不一定保持角度和距离,适用于图像间存在旋转和缩放关系时。
  • 透视变换:它不保持平行线的平行性,能够处理图像间的投影畸变,适用于图像间存在更复杂的空间关系时。

在图像拼接中,选择哪一种变换取决于拍摄图片时相机的运动模式和场景的几何特性。透视变换在处理大角度变换或不同视角下的图像时更为强大。例如,当相机的位置发生显著变动,导致图像间存在视点变化时,透视变换是首选。(它在处理如相机视角变化或3D场景中的图像时特别有效。)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1553042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云CentOS7安装MySQL8

创建目录 [rootnode1 ~]# mkdir /usr/local/mysql [rootnode1 ~]# cd /usr/local/mysql/ 下载安装包 到MySQL官网查看需要下载的版本,并获取到下载地址 https://downloads.mysql.com/archives/community/下载 [rootnode1 mysql]# wget https://downloads.mysql…

uniapp 微信小程序 canvas 手写板获取书写内容区域并输出

uni.canvasGetImageData 返回一个数组,用来描述 canvas 区域隐含的像素数据,在自定义组件下,第二个参数传入自定义组件实例 this,以操作组件内 组件。 // 获取目标 canvas 的像素信息 pixelData let canvas uni.createSelector…

平台介绍-搭建赛事运营平台(3)

上文介绍了品牌隔离的基本原理,就是通过不同的前端和微服务来实现。但是确实很多功能是类似的,所以从编程角度还是有些管理手段的。 前端部分:前端部分没有什么特别手段,就是两个独立的项目工程,分别维护。相同的部分复…

MoonBit MeetUp回顾——张正、宗喆:编程语言在云原生与区块链领域的技术探索

宗喆和张正分别给我们带了 KCL 相关的最新进展,由蚂蚁集团开发的 Rust 编写的开源 DSL,目标是优化云原生策略配置和用户体验。它通过引入动态配置管理、配置校验和基础设施抽象等核心概念,解决开发者认知负担、配置膨胀和标准化工具缺乏的问题…

Flink系列之:Flink SQL Gateway

Flink系列之:Flink SQL Gateway 一、Flink SQL Gateway二、部署三、启动SQL Gateway四、运行 SQL 查询五、SQL 网关启动选项六、SQL网关配置七、支持的端点 一、Flink SQL Gateway SQL 网关是一项允许多个客户端从远程并发执行 SQL 的服务。它提供了一种简单的方法…

机器学习(三)

神经网络: 神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。 f为激活(响应)函数: 理想激活函数是阶跃函数,0表示抑制神经元而1表示激活神经元。 多层前馈网络结构: BP(误差逆…

比较AI编程工具Copilot、Tabnine、Codeium和CodeWhisperer

主流的几个AI智能编程代码助手包括Github Copilot、Codeium、Tabnine、Replit Ghostwriter和Amazon CodeWhisperer。 你可能已经尝试过其中的一些,也可能还在不断寻找最适合自己或公司使用的编程助手。但是,这些产品都会使用精选代码示例来实现自我宣传…

【携程笔试题汇总】2024-03-28-携程春招笔试题-三语言题解(CPP/Python/Java)

🍭 大家好这里是KK爱Coding ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新携程近期的春秋招笔试题汇总~ 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢&#x1f…

PYTHON初级笔记1

0、python? 简单的编程语言 python环境搭建: ①、开发环境:vscode、sublime、pycharm...... ②、运行环境:cpython解释器 python如何写代码? ①、在终端上的命令行上写,可以是我们cmd的中终端,…

【C语言】预处理常见知识详解(宏详解)

文章目录 1、预定义符号2、define2.1 define 定义常量2.2 define 定义宏 3、#和##3.1 **#**3.2 **##** 4、条件编译(开关) 1、预定义符号 在C语言中内置了一些预定义符号,可以直接使用,这些符号实在预处理期间处理的,…

【IntelliJ IDEA】运行测试报错解决方案(附图)

IntelliJ IDEA 版本 2023.3.4 (Ultimate Edition) 测试报错信息 命令行过长。 通过 JAR 清单或通过类路径文件缩短命令行,然后重新运行 解决方案 修改运行配置,里面如果没有缩短命令行,需要再修改选项里面勾选缩短命令行让其显示&#x…

深入浅出的揭秘游标尺模式与迭代器模式的神秘面纱 ✨

​🌈 个人主页:danci_ 🔥 系列专栏:《设计模式》 💪🏻 制定明确可量化的目标,坚持默默的做事。 🚀 转载自:设计模式深度解析:深入浅出的揭秘游标尺模式与迭代…

【机器学习】深入探讨基于实例的学习及K-最近邻算法

深入探讨基于实例的学习及K-最近邻算法 在机器学习的众多策略中,基于实例的学习方法因其简单性和高效性而备受关注。这种方法的核心理念在于利用已知的数据实例来预测新数据的标签或属性。本文将深入探讨其中的两个重要概念:最近邻算法和K-最近邻算法&a…

ArcGIS Pro横向水平图例

终于知道ArcGIS Pro怎么调横向图例了! 简单的像0一样 旋转,左转右转随便转 然后调整图例项间距就可以了,参数太多就随便试,总有一款适合你! 要调整长度,就调整图例块的大小。完美! 好不容易…

CorelDRAW25.0.0.230最新2024版本Crack下载安装方法

CorelDRAW (CDR)是一款专业的平面设计软件。本软件是由加拿大Corel公司开发的一款功能强大的专业平面设计软件、矢量设计软件、矢量绘图软件。本矢量图形制作工具软件广泛应用于商标设计、标志制作、封面设计、CIS设计、产品包装设计、模型绘制、插画绘制、时装/服装设计、印刷…

STM32G473之flash存储结构汇总

STM32G4系列单片机,为32位的微控制器,理论上其内部寄存器地址最多支持4GB的命名及查找(2的32次方,地址命名为0x00000000至0xFFFFFFFF)。STM32官方对4GB的地址存储进行编号时,又分割成了8个block区域&#x…

Switch 和 PS1 模拟器:3000+ 游戏随心玩 | 开源日报 No.174

Ryujinx/Ryujinx Stars: 26.1k License: MIT Ryujinx 是用 C# 编写的实验性任天堂 Switch 模拟器。 该项目旨在提供出色的准确性和性能、用户友好的界面以及稳定的构建。它已经通过了大约 4050 个测试,其中超过 4000 个可以启动并进入游戏,其中大约 340…

新版Idea2023.3.5与lombok冲突、@Data失效

新版idea和lombok冲突,加上Data,其他地方get set也不报错,但是一运行就找不到get set方法。 但是直接使用Getter和Setter可以访问、应该是Data失效了。 解决方法: 看推上介绍是 lombok 与 idea 采集 get 、set 方法的时候所用的技…

yolov8逐步分解(1)--默认参数超参配置文件加载

本章节将介绍yolov8算法训练过程中的第一步:加载默认训练参数以及超参的配置文件default.yaml。 Yolov8 训练的入口文件为train.py,文件结构如下图所示: 1. 执行train函数,函数默认配置参数为cfgDEFAULT_CFG &#xff0c…

samba实现linux共享文件夹

一、samba安装 sudo apt install samba 二、配置Samba 编辑Samba配置文件sudo vi /etc/samba/smb.conf 在文件末尾添加以下内容,设置一个简单的共享目录(替换path_to_share为实际的共享目录路径): [Share] path /path_to_sha…