精匹配——Opencv实现RANSAC算法进行误匹配对剔除,并和最小二乘法对比

article/2025/9/12 18:07:57

精匹配——RANSAC算法思想及优缺点

目录

  • 精匹配——RANSAC算法思想及优缺点
  • 前言
  • 一、RANSAC简介
  • 二、RANSAC基本思想
    • 1.步骤
    • 2.迭代次数的公式
    • 3.举例(拟合直线,拟合最佳单应性矩阵)
  • 三、最小二乘法
    • 1、最小二乘法的主要思想
    • 2、最小二乘解
    • 3、仿射变换最小二乘解的例子
  • 四、RANSAC 与 Least Squares Fit(最小二乘法)区别
  • 五、RANSAC 算法的优缺点
  • 六、Opencv实现RANSAC算法


前言

基于特征的图像匹配中会存在误匹配对,因此为提高匹配率,在粗匹配的基础上实现精匹配,可采用下面两种方法:
在这里插入图片描述


以下是本篇文章正对RANSAC的学习记录

一、RANSAC简介

RANSAC(RANdom SAmple Consensus随机采样一致性算法),是在一组含有“外点”的数据中,不断迭代,最终正确估计出最优参数模型的算法。
  • 主要解决样本中的外点问题,最多可处理50%的外点情况。
  • 内点:符合最优参数模型的点。
  • 外点:不符合最优参数模型的点,一般指的数据中的噪声或无效点,比如说匹配中的误匹配对和估计曲线中的离群点。
  • 外点检测算法
  • 应用:在计算机视觉的匹配问题中广泛应用,以寻找最佳的匹配模型,达到去除误匹配对,实现精匹配的效果。

二、RANSAC基本思想

1.步骤

 1. 在样本N中随机采样K个点 	2. 对这K个点进行模型拟合	3. 计算其他点到该拟合模型的距离,并设置阈值,若大于阈值,为外点,则舍弃,小于阈值,为内点,统计内点个数。阈值:为经验值,由具体应用和数据集决定。4. 然后以新的内点为基础,再次进行步骤2,得到新的拟合模型,迭代M次,选择内点数最多的模型,此时的模型为最优模型。5. 也可以在此基础上,选择出内点数最多的模型,然后对它进行重新估计,估计的时候可以采用最小二乘法来拟合。

2.迭代次数的公式

RANSAC算法中需要进行M次的迭代过程,且迭代的次数也是可以进行估算的。
————————————————————
1、n数据中内点所占的比例(内点的概率p):
在这里插入图片描述
2、选取的K个点至少有一个是外点的概率:
在这里插入图片描述
3、因此就能得到迭代M次的情况下,选取点都是外点的概率,进而得到迭代M次中,至少有一次选取点k个点都是内点的概率,也就是正确模型的概率:z一般要求满足大于95%即可。
在这里插入图片描述
4、最终得到迭代次数M:
M = log(1-z)/log(1-p^k )
———————————————————

3.举例(拟合直线,拟合最佳单应性矩阵)

如下(示例1):

用RANSAC算法来拟合直线:

1、首先随机选取K=2个点,且两个点能拟合出一条直线
在这里插入图片描述
2、根据拟合直线,计算其他点到该拟合模型的距离,并设置阈值,其中绿色点为小于阈值的点,为内点,黄色的为外点,此时绿色内点为9。
在这里插入图片描述
3、然后通过此时的绿色内点,拟合出新的直线,再次计算该拟合新直线情况下的内点数目,此过程不断迭代,找到内点数最大的模型。
在这里插入图片描述


如下(示例2):

用RANSAC算法来寻找最佳单应性矩阵H

在特征匹配中,我们最终要得到一个3*3的单应性矩阵。通常令h33=1来归一化矩阵,因此单应性矩阵有8个自由度h11-h32,求这八个未知数,至少要包含四个匹配点对。
在这里插入图片描述
其中(x,y)表示目标图像角点位置,(x’,y’)为场景图像角点位置,s为尺度参数。

h33=1来归一化矩阵?
H单应性矩阵,描述两个平面的映射关系,平面中点的坐标是二维的,第三维取1,为了简单化,将h33=1,为最简单的非零值,来归一化矩阵。
——————
步骤:
通过SIFT算法已经进行了粗匹配,然后利用RANSAC算法来进精匹配。

1、首先在得到的匹配点中,随机选择4个匹配点对(不共线),其他匹配点为外点。2、根据4对内点计算单应性矩阵。3、根据此矩阵来测试其他匹配点(计算的是其他匹配点与该模型的投影误差),并设置阈值,若小于为新内点,若大于则为外点,也就是误匹配对,因此通过计算出的单应性矩阵,就能实现一次误匹配点的剔除。4、将所有的内点统计进行内点更新,在此基础上再次进行步骤3,迭代M次,最终得到含有内点最多的模型,此时模型为最优模型,也就是我们最终所需要的单应性矩阵。

———
大体步骤确定后,我们还需要进行两个参数的确定,阈值和迭代次数。
阈值:经验值
迭代次数:根据上述迭代次数M公式计算得到
——
如何用寻找到的单应性矩阵H来测试该模型下的其他匹配点?
根据代价函数计算,代价函数最小的模型为最优模型。
根据统计的内点数目,数目最多的为最优模型。

三、最小二乘法

1、最小二乘法的主要思想

通过确定未知参数(通常是一个参数矩阵),来使得真实值和预测值的误差(也称残差)平方和最小,其计算公式为
在这里插入图片描述
其中 yi是真实值,yi^是对应的预测值。
下图中,红色为数据点,蓝色为最小二乘法求得的最佳解,绿色即为误差
在这里插入图片描述
图中有四个数据点分别为:(1, 6), (2, 5), (3, 7), (4, 10)。显然,最佳解(3, 7)

2、最小二乘解

  • 上面介绍了最小二乘法的公式:误差平方和

  • 如下是2-范数:
    - ![在这里插入图片描述](https://img-blog.csdnimg.cn/0603137915f74bb58d24c6d80eda6f1b.png)

  • 根据这两个式子,进行最小二乘解的分析:

  • 已知有一个这样的方程组:Ax=b 其中A∈Rm×n ; x∈Rn×k, b∈Rm×k

  • 因此根据最小二乘法公式,那么求解最小二乘的问题即可等价于:

  • 在这里插入图片描述

  • 因此:在这里插入图片描述

  • 对 x 求导:
    在这里插入图片描述

  • 解得(最小二乘解)
    在这里插入图片描述

3、仿射变换最小二乘解的例子

在这里插入图片描述

写成矩阵形式:
在这里插入图片描述
每对匹配点,提供两个约束。因此由N对点得到的等式组有2N个约束:
在这里插入图片描述
也可以简单写成:
u = A
总平方误差:
在这里插入图片描述
对每个参数求偏导,并令其为0,即
在这里插入图片描述
因此可得最小二乘解:
在这里插入图片描述


拓展小知识:

  • 在线性回归中,通常我们使用均方误差来作为损失函数,同时均方误差可以看作是最小二乘法中的 E /m(m 为样本个数),所以最小二乘法求出来的最优解就是将均方误差作为损失函数求出来的最优解。
  • 因此损失函数即可使用最小二乘法来表示
  • 对于一维特征的样本,拟合函数为
    在这里插入图片描述
  • 因此损失函数为:上标(i)表示第 i 个样本
    在这里插入图片描述

四、RANSAC 与 Least Squares Fit(最小二乘法)区别

	RANSAC算法:适用于含有较大的噪声或无效点的情况最小二乘法:适用于误差比较小的情况

如下图所示,在误差比较大的情况下,肉眼也能看出拟合出的直线,但用最小二乘法拟合的直线却是错误的。而用RANSAC算法却能成功拟合。
在这里插入图片描述

五、RANSAC 算法的优缺点

优点:当数据中有大量的异常数据时,也能高精度的进行估计拟合。

缺点:对于异常数据超过50%的时候,拟合效果不佳。需要设置特定于问题的阈值。迭代次数若受到限制,那么达到迭代次数时拟合出来的模型可能并不是最佳模型。特定数据只能拟合出一个模型,一般多模型拟合采用霍夫变换。

六、Opencv实现RANSAC算法

//RANSAC算法
int main()
{Mat img_object = imread("./data/101.png", IMREAD_GRAYSCALE);Mat img_scene = imread("./data/100.png", IMREAD_GRAYSCALE);if (img_object.empty() || img_scene.empty()){cout << "Could not open or find the image!\n" << endl;return -1;}//-- Step 1: Detect the keypoints using SURF Detector, compute the descriptorsint minHessian = 800; // default: 400Ptr<SURF> surf = SURF::create(800);std::vector<KeyPoint> keypoints_object, keypoints_scene;Mat descriptors_object, descriptors_scene;surf->detectAndCompute(img_object, noArray(), keypoints_object, descriptors_object);surf->detectAndCompute(img_scene, noArray(), keypoints_scene, descriptors_scene);//-- Step 2: Matching descriptor vectors with a FLANN based matcher// Since SURF is a floating-point descriptor NORM_L2 is usedPtr<DescriptorMatcher> matcher = DescriptorMatcher::create(DescriptorMatcher::FLANNBASED);std::vector< std::vector<DMatch> > knn_matches;matcher->knnMatch(descriptors_object, descriptors_scene, knn_matches, 2);//-- Filter matches using the Lowe's ratio testconst float ratio_thresh = 0.75f;std::vector<DMatch> good_matches;for (size_t i = 0; i < knn_matches.size(); i++){if (knn_matches[i][0].distance < ratio_thresh * knn_matches[i][1].distance){good_matches.push_back(knn_matches[i][0]);}}//-- Draw matchesMat img_matches;drawMatches(img_object, keypoints_object, img_scene, keypoints_scene, good_matches, img_matches, Scalar::all(-1),Scalar::all(-1), std::vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);//-- Localize the objectstd::vector<Point2f> obj;std::vector<Point2f> scene;for (size_t i = 0; i < good_matches.size(); i++){//-- Get the keypoints from the good matchesobj.push_back(keypoints_object[good_matches[i].queryIdx].pt);scene.push_back(keypoints_scene[good_matches[i].trainIdx].pt);}vector<uchar>inliers;Mat H = findHomography(obj, scene, inliers, RANSAC);//-- Draw matches with RANSACMat img_matches_ransac;std::vector<DMatch> good_matches_ransac;for (size_t i = 0; i < inliers.size(); i++){if (inliers[i]){good_matches_ransac.push_back(good_matches[i]);}}drawMatches(img_object, keypoints_object, img_scene, keypoints_scene, good_matches_ransac, img_matches_ransac, Scalar::all(-1),Scalar::all(-1), std::vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);namedWindow("img_matches", WINDOW_NORMAL);imshow("img_matches", img_matches);imwrite("img_matches.jpg", img_matches);namedWindow("img_matches_ransac", WINDOW_NORMAL);imshow("img_matches_ransac", img_matches_ransac);imwrite("img_matches_ransac.jpg", img_matches_ransac);waitKey();return 0;
}

效果图:
在这里插入图片描述
在这里插入图片描述

参考博文

————————

所有无聊的事情都会衍生出很多细节让你觉得它复杂而有趣,投入其中而浑然不知其无聊的本质。
–王小波


http://chatgpt.dhexx.cn/article/drkvT2W9.shtml

相关文章

ransca算法详细介绍

1、算法概述&#xff1a; RANSAC算法的基本假设是样本中包含正确数据(inliers&#xff0c;可以被模型描述的数据)&#xff0c;也包含异常数据(outliers&#xff0c;偏离正常范围很远、无法适应数学模型的数据)&#xff0c;即数据集中含有噪声。这些异常数据可能是由于错误的测…

RANSAC 特征匹配算法解析

一、RANSAC特征匹配算法简介   RANSAC算法是RANdom SAmple Consensus的缩写&#xff0c;意为随机抽样一致。表面上的意思就是从匹配样本中随机取样&#xff0c;寻找一致的样本点。RANSAC算法是根据一组包含异常数据的样本数据集&#xff0c;计算出数据的数学模型参数&#x…

RANSAC算法(原理及代码实现+迭代次数参数自适应)

RANSAC算法 前言算法流程Python代码RANSAC算法迭代参数的自适应 前言 随机样本一致性 (RANSAC) 是一种迭代方法&#xff0c;用于从一组包含异常值的观察数据中估计数学模型的参数&#xff0c;此时异常值不会对估计值产生影响。简言之&#xff0c;RANSAC是一种滤除异常值的常用算…

RANSAC算法简介

文章目录 1 算法简介2 基本思想3 参数4 应用案例&#xff08;直线拟合&#xff09; 1 算法简介 RANSAC算法的基本假设是样本中包含正确数据(inliers&#xff0c;可以被模型描述的数据)&#xff0c;也包含异常数据(outlies&#xff0c;偏离正常范围很远、无法适应数学模型的数据…

关于RANSAC的理解

先说最小二乘。 ok&#xff0c;你手头有一堆数据&#xff0c;比如这些蓝点&#xff1a; 那么我们假设它符合一个直线模型&#xff1a;yaxb&#xff0c;用最小二乘就可以很容易求解出未知参数a和b。最小二乘大法确实好哇&#xff0c;毕竟高斯用它来估计谷神星的轨道&#xff08…

RANSAC基本原理

计算机视觉基本原理——RANSAC 1. RANSAC简介2. 基本思想3. 范例4. 迭代次数推导 Reference&#xff1a; 1.计算机视觉基本原理——RANSAC 1. RANSAC简介 RANSAC(RAndom SAmple Consensus,随机采样一致)算法是从一组含有“外点”(outliers)的数据中正确估计数学模型参数的迭代…

RANSAC算法的理解与使用

随机抽样一致算法(random sample consensus, RANSAC)&#xff0c;其实就是采用迭代的方法从一组包含离群的被观测数据中估算出数学模型的参数。(比如通过一群点拟合一条直线等) 基本假设 模型假设&#xff1a;事先知道真实数据满足的数学模型&#xff0c;不知道的只是模型的具…

【特征匹配】RANSAC算法原理与源码解析

转载请注明出处&#xff1a;http://blog.csdn.net/luoshixian099/article/details/50217655 勿在浮沙筑高台 随机抽样一致性&#xff08;RANSAC&#xff09;算法&#xff0c;可以在一组包含“外点”的数据集中&#xff0c;采用不断迭代的方法&#xff0c;寻找最优参数模型&…

RANSAC算法详解+Python实现

1.算法描述 RANSAC的基本假设是&#xff1a; &#xff08;1&#xff09;数据由“局内点”组成&#xff0c;例如&#xff1a;数据的分布可以用一些模型参数来解释&#xff1b; &#xff08;2&#xff09;“局外点”是不能适应该模型的数据&#xff1b; &#xff08;3&#xff0…

RANSAC算法与原理(一)

目录 算法介绍举例 算法的基本思想和流程算法的实现流程&#xff1a;迭代次数的推导算法的实现 python代码实现References 算法介绍 首先我们从Random sample consensus - Wikipedia上找到RANSAC原理的介绍。 RANSAC算法的中文名称是随机抽样一致算法(Random Sample Consenus…

RANSAC算法——看完保证你理解

目录 1 最小二乘算法的缺陷2 RANSAC算法2.1 原理2.2 实例2.3 参数 参考感谢阅读 RANSAC全程Random sample consensus&#xff0c;中文即“随机抽样一致算法”&#xff0c;该方法采用迭代的方式从一组包含离群&#xff08;outlier或者错误数据&#xff09;的被观测数据中估算出数…

RANSAC算法介绍

一、RANSAC介绍 随机抽样一致算法&#xff08;RANdom SAmple Consensus,RANSAC&#xff09;,采用迭代的方式从一组包含离群的被观测数据中估算出数学模型的参数。RANSAC算法假设数据中包含正确数据和异常数据&#xff08;或称为噪声&#xff09;。正确数据记为内点&#xff08;…

RANSAC算法讲解

RANSAC是“RANdom SAmple Consensus&#xff08;随机抽样一致&#xff09;”的缩写。它可以从一组包含“局外点”的观测数据集中&#xff0c;通过迭代方式估计数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果&#xff1b;为了提高概率必须提高迭代次…

RANSAC介绍(Matlab版直线拟合+平面拟合)

RANSAC介绍&#xff08;Matlab版直线拟合平面拟合&#xff09; 本人邮箱&#xff1a;sylvester0510163.com&#xff0c;欢迎交流讨论&#xff0c; 欢迎转载&#xff0c;转载请注明网址http://blog.csdn.net/u010128736/ 一、RANSAC介绍 随机抽样一致算法&#xff08;RANdom SA…

RANSAC算法(仅供学习使用)

1.定义 RANSAC&#xff08;Random Sample Consensus&#xff09;算法是一种基于随机采样的迭代算法&#xff0c;用于估计一个数学模型参数。它最初由Fischler和Bolles于1981年提出&#xff0c;主要用于计算机视觉和计算机图形学中的模型拟合和参数估计问题。 RANSAC算法的基本…

前端调试手机app

有时候应用在电脑网页端显示是正常的&#xff0c;但是一安装到手机上或者在手机浏览器上打开&#xff0c;就会显示各种问题问题。 在网上找了很长时间&#xff0c;最方便的就是利用在电脑上利用谷歌浏览器进行调试&#xff0c;输入网址chrome://inspect/#devices&#xff0c;进…

跨平台应用开发进阶(三十七)uni-app前端监控方案 Sentry 探究

文章目录 一、前言二、Sentry 简介三、Sentry 部署3.1 docker 的部署 (mac版)3.2 部署 sentry3.3 创建项目3.4 前端部署&#xff0c;注入监控代码 四、sentry 操作界面介绍五、拓展阅读 一、前言 在日益发达的网络时代&#xff0c;web应用也是越来越复杂&#xff0c;尤其是前端…

uni-app 开发跨平台应用前端框架

前言 uni-app 是一个使用 vue.js 开发跨平台应用的前端框架&#xff0c;由于它具备"编写一次代码可发布到多个平台"的特点&#xff0c;大大的节省了开发成本&#xff0c;极速提升了开发效率。 一、uni-app 简介 uni-app 是一个使用 Vue.js 开发所有前端应用的框架。…

uni-app开发所有前端应用的框架

uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、H5、以及各种小程序&#xff08;微信/支付宝/百度/头条/QQ/钉钉&#xff09;等多个平台。 DCloud公司拥有420万开发者&#xff0c;几十万应用案例、6.5亿手…

比较几种热门Hybrid App前端框架

作为一种既能够在原生应用程序环境中运行&#xff0c;也能够在 Web 浏览器中运行的应用程序&#xff0c;Hybrid App 主要使用 Web 技术进行开发&#xff0c;如 HTML、CSS 和JavaScript&#xff0c;并使用一个中间层将其封装在原生应用程序中。随着技术的持续推进&#xff0c;Hy…