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

article/2025/9/12 16:54:23

目录

  • 1 最小二乘算法的缺陷
  • 2 RANSAC算法
    • 2.1 原理
    • 2.2 实例
    • 2.3 参数
  • 参考
  • 感谢阅读

RANSAC全程Random sample consensus,中文即“随机抽样一致算法”,该方法采用迭代的方式从一组包含离群(outlier或者错误数据)的被观测数据中估算出数学模型的参数,相比最小二乘方法,它融合了剔除不合格数据的思想,因此对于有部分错误数据的数据样本,能够更快更准的给出辨识结果。该算法首先由Fischler和Bolles 于1981提出,他们采用该方法来解决图像定位问题(LDP)。目前在图像以及辨识等领域广泛应用。

1 最小二乘算法的缺陷

最小二乘方法,即通过最小化误差的平方和寻找数据的最佳函数匹配,广泛应用于数据辨识领域,但是其对于某些数据的拟合有一定的缺陷,最小二乘得到的是针对所有数据的全局最优,但是并不是所有数据都是适合去拟合的,也就是说数据可能存在较大的误差甚至差错,而这种差错的识别是需要一定的代价的,如下示意图(仅示意)就是一个典型的例子:
最小二乘无法得到离线给
很显然,上述线性拟合的结果并不是我们想要的,我们真正需要的是一下拟合的效果:
在这里插入图片描述
这正是RANSAC算法的拟合效果!因为剔除了不想被参与拟合的红点而选择在一定范围内的蓝点,这样保证了样本数据的干净,保证拟合效果更接近真实。

2 RANSAC算法

2.1 原理

通用的RANSAC算法的工作流程如下[2]:

给定如下:
data – 一组观测数据组.
model – 拟合模型(例如线性、二次曲线等等).
n – 用于拟合的最小数据组数.
k – 算法规定的最大遍历次数.
t – 数据和模型匹配程度的阈值,在t范围内即inliers,在范围外即outliers.
d – 表示模型合适的最小数据组数.

返回如下:
bestFit – 一组最匹配的模型参数,即model的参数

以上前提中,data和model以及model的参数我们很容易理解,但是n、k、t、d的含义可能有点模糊,不妨先放一放,容后续慢慢理解。

函数体的伪代码如下:

参数初始化:
iterations = 0 /// 遍历次数
bestFit = nul
bestErr = something really large ///

/// 遍历
while iterations < k domaybeInliers := n /// 从数据中随机选择n个拟合的数据组maybeModel := model parameters fitted to maybeInliers /// 根据以上n个数据获得模型的参数alsoInliers := empty set  /// 初始化空数据组for every point in data not in maybeInliers do  /// 遍历:将处maybeInliers外的其他数据组一一与模型进行比较if point fits maybeModel with an error smaller than t /// 如果比较下来误差在t范围内,则调价到inliers集合中add point to alsoInliersend forif the number of elements in alsoInliers is > d then /// 如果当前得到的Inliers集合中的数据组数量大于d// This implies that we may have found a good model ///意味着该模型是个“好”模型(即好参数)// now test how good it is.betterModel := model parameters fitted to all points in maybeInliers and alsoInliersthisErr := a measure of how well betterModel fits these points/// 如果当前模型的与Inliers中数据的误差比之前得到的最小误差更小,则更新最小误差,/// 最优模型参数设置为当前模型参数if thisErr < bestErr thenbestFit := betterModelbestErr := thisErrend ifend ifincrement iterations  /// 继续遍历
end while

多看两边以上的以上的伪代码,相信应该是可以理解四个参数的含义了,如果还不理解,没关系,还有更实际的例子。往下看:

2.2 实例

以下是用MATLAB实现的一个采用RANSAC算法模型选为线性函数的函数与实例。

function [bestParameter1,bestParameter2] = ransac_demo(data,num,iter,threshDist,inlierRatio)% data: a 2xn dataset with #n data points% num: the minimum number of points. For line fitting problem, num=2% iter: the number of iterations% threshDist: the threshold of the distances between points and the fitting line% inlierRatio: the threshold of the number of inliers %% Plot the data pointsfigure;plot(data(1,:),data(2,:),'o');hold on;number = size(data,2); % Total number of pointsbestInNum = 0; % Best fitting line with largest number of inliersbestParameter1=0;bestParameter2=0; % parameters for best fitting linefor i=1:iter%% Randomly select 2 pointsidx = randperm(number,num); sample = data(:,idx);   %% Compute the distances between all points with the fitting line kLine = sample(:,2)-sample(:,1);% two points relative distancekLineNorm = kLine/norm(kLine);normVector = [-kLineNorm(2),kLineNorm(1)];%Ax+By+C=0 A=-kLineNorm(2),B=kLineNorm(1)distance = normVector*(data - repmat(sample(:,1),1,number));%% Compute the inliers with distances smaller than the thresholdinlierIdx = find(abs(distance)<=threshDist);inlierNum = length(inlierIdx);%% Update the number of inliers and fitting model if better model is found     if inlierNum>=round(inlierRatio*number) && inlierNum>bestInNumbestInNum = inlierNum;parameter1 = (sample(2,2)-sample(2,1))/(sample(1,2)-sample(1,1));parameter2 = sample(2,1)-parameter1*sample(1,1);bestParameter1=parameter1; bestParameter2=parameter2;endend%% Plot the best fitting linexAxis = -number/2:number/2; yAxis = bestParameter1*xAxis + bestParameter2;plot(xAxis,yAxis,'r-','LineWidth',2);
end%% Generate random data for test
data = 150*(2*rand(2,100)-1); data = data.*rand(2,100);
ransac_demo(data,2,100,10,0.1);

结果如下:
ransac - demo
这里,数据(data )集随机产生的100组(x,y)数据集,模型(model)为y=ax+b,需要辨识的参数即a和b, 即n为2,遍历次数k为100(数据量本身较少,可以全部遍历),t为10,即只有满足到直线y=ax+b的距离小于10的点才会被认为是inliers,d指的是认定模型及参数为好的inliers集的最小数量值,这里采用比值表示,0.1表示100的十分之一即数据量达到10即可认为已经满足要求。

2.3 参数

可以看到,RANSAC算法除了选择合适的数据和模型外,还需要选择合适的4个参数n、k、t、d,其中n、t、d可根据经验得到,那么k可以根据如下公式计算:

其中, p p p表示为RANSAC算法结果有用的概率, w w w为数据在inliers集中的概率,那么对于模型拟合一次需要的n个数据,其均在inliers集中的概率为 w n w^n wn(放回取样概率),不在inliers集中的概率则为 1 − w n 1-w^n 1wn,因此k次迭代的结果满足:

从而可有得到k的计算公式。

事实上在MATLAB中也存已有的函数ransac,该函数设计的更加通用,感兴趣的可以自己学习。

最后,本文的例子和原理主要参考自:《Random sample consensus》。

参考

  1. 维基百科:《Random sample consensus》。
  2. Martin A. Fischler and Robert C. Bolles (June 1981). “Random Sample Consensus: A Paradigm for Model Fitting with Applications to Image Analysis and Automated Cartography”. Comm. of the ACM 24: 381–395. doi:10.1145/358669.358692.
  3. MATLAB官网关于RANSAC的介绍: https://www.mathworks.com/discovery/ransac.html

感谢阅读


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

相关文章

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;默认网关基本配置…

TCP/IP-----协议号、端口号、ARP、icmp

文章目录 一、数据流向过程二、协议详解1&#xff09;ARP协议2&#xff09;ICMP协议 协议号 协议号是存在于IP数据报的首部的20字节的固定部分&#xff0c;占有8bit.该字段是指出此数据报所携带的是数据是使用何种协议&#xff0c;以便目的主机的IP层知道将数据部分上交给哪个处…

UDP协议

引言 本文中只关于IPv4&#xff1b;UDP是一种保留消息边界的简单的面向数据报的传输层协议。它不提供差错纠正、队列管理、重复消除、流量控制和拥塞控制。总之&#xff0c;能没有的都没了。但它提供了差错检测&#xff0c;是一种端到端的校验和。因此使用它的程序必须自己实现…

BGP协议

BGP协议 工作层工作原理BGP简单配置———含密码认证配置个人图解BGP 工作层 BGP是工作在应用层的协议&#xff0c;但基于传输层的TCP协议 工作原理 路由协议通常分为内部网关协议&#xff08;IGP: Interior Gateway Protocol&#xff09;和外部网关协议&#xff08;EGP: Ext…

IP协议介绍

文章目录 定义特点作用寻址和路由&#xff1a;分片与重组&#xff1a; ①TCP分段与IP分片的区别&#xff1f;TCP分段IP分片什么是MSS&#xff1f;滑动窗口与MSS的区别&#xff1f; 什么是MTU&#xff1f;MSS与MTU的关系疑问UDP是否会进行分段&#xff1f;TCP分段后会进行IP分片…

华为 协议归纳总结

青出于蓝而胜于蓝 文章目录 一、路由优先级二、路由协议三、常见的永久组地址四、常用的UDP协议及端口号五、常用的TCP协议及端口号六、协议七、报文头格式 一些常用的知识点&#xff0c;经常用到&#xff0c;也很容易忘记、混淆&#xff0c;所以有必要去整理一下这些常用知识点…

管理距离 动态协议端口号 协议号

管理距离(Administrative Distance&#xff0c;简称AD ) 路由器可以通过多种途径获知路由条目∶如静态手工配置、各种动态路由协议等等。当路由器从两种不用的途径获知去往同一个目的地的两条路由&#xff0c;那么路由器会比较这两条路由的AD值&#xff0c;也就是管理距离&…