关于RANSAC的理解

article/2025/9/12 20:08:24

先说最小二乘。

ok,你手头有一堆数据,比如这些蓝点:


那么我们假设它符合一个直线模型:y=ax+b,用最小二乘就可以很容易求解出未知参数a和b。最小二乘大法确实好哇,毕竟高斯用它来估计谷神星的轨道(https://math.berkeley.edu/~mgu/MA221/Ceres_Presentation.pdf;http://www.cnblogs.com/washa/p/3164212.html)。


但是,当你的数据充满了噪声时,比如下面图中的黑点,很明显中间有一条妥妥的直线,但是你也用最小二乘去解它,于是悲剧了:



很显然最小二乘失效了,这时候我们就要用RANSAC去解决它。


RANSAC的使用条件是:

1.输入是一组带污染的观测数据,其中的可信数据占了大多数;

2.有一个可以解释可信观测数据的参数化模型


RANSAC的思想是(引自wiki,汉化部分有修改):

  1. Select a random subset of the original data. Call this subset the hypothetical inliers. 从观测数据中随机选择一个子集,称之为hypothetical inliers
  2. A model is fitted to the set of hypothetical inliers.估计出适合于这些个hypothetical inliers的模型
  3. All other data are then tested against the fitted model. Those points that fit the estimated model well, according to some model-specific loss function, are considered as part of the consensus set. 用这个模型测试其他的数据,根据损失函数,得到符合这个模型的点,称为一致性集合:consensus set。
  4. The estimated model is reasonably good if sufficiently many points have been classified as part of the consensus set. 如果足够多的数据都被归类于一致性集合,那么说明这个估计的模型是正确的;如果这个集合中的数据太少,那么说明模型不合适,弃之,返回第一步。
  5. Afterwards, the model may be improved by reestimating it using all members of the consensus set.最后,根据一致性集合中的数据(可以认为是可靠的数据了),用最小二乘的方法重新估计模型。

根据上述思想,如果不停的迭代,就会得到一个最优的模型。如下图所示:



RANSAC有什么用?

可以用于图像拼接,如果你年纪比较大,应该记得Microsoft有一款叫photosynth的产品:


怎么用RANSAC拼接呢?

图像和图像之间的关系可以用一个单应性矩阵描述,即x1=H*x2。

x1和x2就是同名点齐次坐标向量,我们可以用SIFT或SURF算子找到:


但是可以看出,虽然大部分匹配是正确的,但有一些匹配是错误,这些同名点就构成了“受污染的观测数据”,也是RANSAC的适用条件。

用RANSAC估计H的步骤如下(参考http://eric-yuan.me/ransac/):

  1. Select four feature pairs (at random) 随机找4对特征点
  2. Compute homography H  计算H
  3. Compute inliers where ||pi’, H pi|| < ε  (if not enough times, goto 1.) 找到符合H的inliers
  4. Keep largest set of inliers  直到这个H有最多的inliers
  5. Re-compute least-squares H estimate using all of the inliers 用inliers和最小二乘重新估计H

同名点齐次坐标和H的关系可以写为:


4个点对正好构成唯一解,http://eric-yuan.me/ransac/中用QR分解的方法求出H。不停迭代,直到求出最终的inliers,到第5步用最小二乘求解H时,可以用SVD分解(http://blog.csdn.net/dsbatigol/article/details/9625211)。


基于OpenCV的图像拼接的代码在这里:https://ramsrigoutham.com/tag/ransac/,随手贴上来,并感谢作者:

#include <stdio.h>
#include <iostream>#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/nonfree/nonfree.hpp"
#include "opencv2/calib3d/calib3d.hpp"
#include "opencv2/imgproc/imgproc.hpp"using namespace cv;void readme();/** @function main */
int main( int argc, char** argv )
{if( argc != 3 ){ readme(); return -1; }// Load the imagesMat image1= imread( argv[2] );Mat image2= imread( argv[1] );Mat gray_image1;Mat gray_image2;// Convert to GrayscalecvtColor( image1, gray_image1, CV_RGB2GRAY );cvtColor( image2, gray_image2, CV_RGB2GRAY );imshow("first image",image2);imshow("second image",image1);if( !gray_image1.data || !gray_image2.data ){ std::cout<< " --(!) Error reading images " << std::endl; return -1; }//-- Step 1: Detect the keypoints using SURF Detectorint minHessian = 400;SurfFeatureDetector detector( minHessian );std::vector< KeyPoint > keypoints_object, keypoints_scene;detector.detect( gray_image1, keypoints_object );detector.detect( gray_image2, keypoints_scene );//-- Step 2: Calculate descriptors (feature vectors)SurfDescriptorExtractor extractor;Mat descriptors_object, descriptors_scene;extractor.compute( gray_image1, keypoints_object, descriptors_object );extractor.compute( gray_image2, keypoints_scene, descriptors_scene );//-- Step 3: Matching descriptor vectors using FLANN matcherFlannBasedMatcher matcher;std::vector< DMatch > matches;matcher.match( descriptors_object, descriptors_scene, matches );double max_dist = 0; double min_dist = 100;//-- Quick calculation of max and min distances between keypointsfor( int i = 0; i < descriptors_object.rows; i++ ){ double dist = matches[i].distance;if( dist < min_dist ) min_dist = dist;if( dist > max_dist ) max_dist = dist;}printf("-- Max dist : %f \n", max_dist );printf("-- Min dist : %f \n", min_dist );//-- Use only "good" matches (i.e. whose distance is less than 3*min_dist )std::vector< DMatch > good_matches;for( int i = 0; i < descriptors_object.rows; i++ ){ if( matches[i].distance < 3*min_dist ){ good_matches.push_back( matches[i]); }}std::vector< Point2f > obj;std::vector< Point2f > scene;for( int 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 );}// Find the Homography MatrixMat H = findHomography( obj, scene, CV_RANSAC );// Use the Homography Matrix to warp the imagescv::Mat result;warpPerspective(image1,result,H,cv::Size(image1.cols+image2.cols,image1.rows));cv::Mat half(result,cv::Rect(0,0,image2.cols,image2.rows));image2.copyTo(half);imshow( "Result", result );waitKey(0);return 0;}/** @function readme */void readme(){ std::cout << " Usage: Panorama < img1 > < img2 >" << std::endl; }

最后提一句,RANSAC称为RANdom  SAmple Consensus,即随机采样一致算法,发表于1981:

  • Martin A. Fischler & Robert C. Bolles (June 1981). "Random Sample Consensus: A Paradigm for Model Fitting with Applications to Image Analysis and Automated Cartography" (PDF)







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

相关文章

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…

APP管理平台--前端篇,首页(三)

作为首页&#xff0c;肯定在打开网址后就看得到对应信息。那么作为APP管理平台&#xff0c;这个信息自然而然的表现成了APP列表。那么依据现有各大应用市场需要分为已上线和未上线。但是在实际做的时候没有区分&#xff0c;这次项目中将所有新增的APP都展示了。区分布局就决定了…

一天撸一个财务APP系统【安卓端+前端+后端】

昨天有个粉丝朋友也想学开发Web和小程序、安卓&#xff0c;问可以在大学学会吗&#xff1f; 在学校学到的东西真的有限&#xff1a; 在很多的高校&#xff0c;有一些教授是学院派的&#xff0c;他们没有做过多少开发工作&#xff0c;上课就是照本宣科&#xff0c;讲的知识点都…

如何查看手机APP使用的前端框架?

一、首先获取该APP的apk包&#xff08;长按APP&#xff0c;点击‘分享’&#xff0c;分享到微信‘文件传输助手’&#xff0c;即可获得apk包--参考本博主上篇文章&#xff09;。 二、把apk扩展名改成.zip然后解压。不同的编译软件目录结果也不一样。&#xff08;为方便起见&am…

【网络协议】IPV4协议介绍

&#x1f4aa;本节内容&#xff1a;IPV4协议介绍、IPV4地址格式、IPV4数据格式及C项目结构体设计 &#x1f60f;【Qt6网络抓包工具项目实战】总导航目录&#xff08;建议收藏书签~~~&#xff09; ✌️ part1 &#x1f60f;【Qt6网络抓包工具项目实战】1.1Qt6.2.2环境搭建(免费…

DHCP协议

目录 1、DHCP协议 2、DHCP的工作过程 动态获取IP地址流程 跟新租期流程 解除租期流程 1、DHCP协议 DHCP(Dynamic Host Configuration Protocol)协议是处于应用层的协议。一个主机如果想正常上网&#xff0c;需要配置IP地址&#xff0c;子网掩码&#xff0c;默认网关基本配置…