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

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场景中的图像时特别有效。)

  • 25
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jmu xzh_0618

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值