随机抽样一致性算法(RANSAC)

Python: RANSAC随机一致性原理与实现 最近要把点云平面做分割,想到可以使用RANSAC做平面拟合。以前经常在图像配准里使用RANSAC做单应性计算,这里记录一下RANSAC的原理以及使用RANSAC拟合平面直线的方法。 阅读详情
 

作者:王先荣
    本文翻译自维基百科,英文原文地址是:http://en.wikipedia.org/wiki/ransac,如果您英语不错,建议您直接查看原文。
    RANSAC是“RANdom SAmple Consensus(随机抽样一致)”的缩写。它可以从一组包含“局外点”的观测数据集中,通过迭代方式估计数学模型的参数。它是一种不确定的算法——它有一定的概率得出一个合理的结果;为了提高概率必须提高迭代次数。该算法最早由Fischler和Bolles于1981年提出。
    RANSAC的基本假设是:
(1)数据由“局内点”组成,例如:数据的分布可以用一些模型参数来解释;
(2)“局外点”是不能适应该模型的数据;
(3)除此之外的数据属于噪声。
    局外点产生的原因有:噪声的极值;错误的测量方法;对数据的错误假设。
    RANSAC也做了以下假设:给定一组(通常很小的)局内点,存在一个可以估计模型参数的过程;而该模型能够解释或者适用于局内点。

本文内容
1 示例
2 概述
3 算法
4 参数
5 优点与缺点
6 应用
7 参考文献
8 外部链接

一、示例
    一个简单的例子是从一组观测数据中找出合适的2维直线。假设观测数据中包含局内点和局外点,其中局内点近似的被直线所通过,而局外点远离于直线。简单的最小二乘法不能找到适应于局内点的直线,原因是最小二乘法尽量去适应包括局外点在内的所有点。相反,RANSAC能得出一个仅仅用局内点计算出模型,并且概率还足够高。但是,RANSAC并不能保证结果一定正确,为了保证算法有足够高的合理概率,我们必须小心的选择算法的参数。

左图:包含很多局外点的数据集       右图:RANSAC找到的直线(局外点并不影响结果)


二、概述
    RANSAC算法的输入是一组观测数据,一个可以解释或者适应于观测数据的参数化模型,一些可信的参数。
    RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并用下述方法进行验证:
    1.有一个模型适应于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。
    2.用1中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点。
    3.如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。
    4.然后,用所有假设的局内点去重新估计模型,因为它仅仅被初始的假设局内点估计过。
    5.最后,通过估计局内点与模型的错误率来评估模型。
    这个过程被重复执行固定的次数,每次产生的模型要么因为局内点太少而被舍弃,要么因为比现有的模型更好而被选用。


三、算法
    伪码形式的算法如下所示:
输入:
data —— 一组观测数据
model —— 适应于数据的模型
n —— 适用于模型的最少数据个数
k —— 算法的迭代次数
t —— 用于决定数据是否适应于模型的阀值
d —— 判定模型是否适用于数据集的数据数目
输出:
best_model —— 跟数据最匹配的模型参数(如果没有找到好的模型,返回null)
best_consensus_set —— 估计出模型的数据点
best_error —— 跟数据相关的估计出的模型错误

iterations = 0
best_model = null
best_consensus_set = null
best_error = 无穷大
while ( iterations < k )
    maybe_inliers = 从数据集中随机选择n个点
    maybe_model = 适合于maybe_inliers的模型参数
    consensus_set = maybe_inliers

    for ( 每个数据集中不属于maybe_inliers的点 )
        if ( 如果点适合于maybe_model,且错误小于t )
            将点添加到consensus_set
    if ( consensus_set中的元素数目大于d )
        已经找到了好的模型,现在测试该模型到底有多好
        better_model = 适合于consensus_set中所有点的模型参数
        this_error = better_model究竟如何适合这些点的度量
        if ( this_error < best_error )
            我们发现了比以前好的模型,保存该模型直到更好的模型出现
            best_model =  better_model
            best_consensus_set = consensus_set
            best_error =  this_error
    增加迭代次数
返回 best_model, best_consensus_set, best_error

    RANSAC算法的可能变化包括以下几种:
    (1)如果发现了一种足够好的模型(该模型有足够小的错误率),则跳出主循环。这样可能会节约计算额外参数的时间。
    (2)直接从maybe_model计算this_error,而不从consensus_set重新估计模型。这样可能会节约比较两种模型错误的时间,但可能会对噪声更敏感。

四、参数
    我们不得不根据特定的问题和数据集通过实验来确定参数t和d。然而参数k(迭代次数)可以从理论结果推断。当我们从估计模型参数时,用p表示一些迭代过程中从数据集内随机选取出的点均为局内点的概率;此时,结果模型很可能有用,因此p也表征了算法产生有用结果的概率。用w表示每次从数据集中选取一个局内点的概率,如下式所示:
    w = 局内点的数目 / 数据集的数目
    通常情况下,我们事先并不知道w的值,但是可以给出一些鲁棒的值。假设估计模型需要选定n个点,wn是所有n个点均为局内点的概率;1 − wn是n个点中至少有一个点为局外点的概率,此时表明我们从数据集中估计出了一个不好的模型。 (1 − wn)k表示算法永远都不会选择到n个点均为局内点的概率,它和1-p相同。因此,
    1 − p = (1 − wn)k
    我们对上式的两边取对数,得出
    
    值得注意的是,这个结果假设n个点都是独立选择的;也就是说,某个点被选定之后,它可能会被后续的迭代过程重复选定到。这种方法通常都不合理,由此推导出的k值被看作是选取不重复点的上限。例如,要从上图中的数据集寻找适合的直线,RANSAC算法通常在每次迭代时选取2个点,计算通过这两点的直线maybe_model,要求这两点必须唯一。
    为了得到更可信的参数,标准偏差或它的乘积可以被加到k上。k的标准偏差定义为:
   
五、优点与缺点
    RANSAC的优点是它能鲁棒的估计模型参数。例如,它能从包含大量局外点的数据集中估计出高精度的参数。RANSAC的缺点是它计算参数的迭代次数没有上限;如果设置迭代次数的上限,得到的结果可能不是最优的结果,甚至可能得到错误的结果。RANSAC只有一定的概率得到可信的模型,概率与迭代次数成正比。RANSAC的另一个缺点是它要求设置跟问题相关的阀值。
    RANSAC只能从特定的数据集中估计出一个模型,如果存在两个(或多个)模型,RANSAC不能找到别的模型。


六、应用
    RANSAC算法经常用于计算机视觉,例如同时求解相关问题与估计立体摄像机的基础矩阵。


七、参考文献

八、外部链接

九、后话

    本文在翻译的过程中参考了沈乐君的文章《随机抽样一致性算法RANSAC源程序和教程》。Ziv Yaniv已经用C++实现了RANSAC,您可以点击这里下载源程序。

不过,如果时间允许的话,我打算自己动手用C#去实现RANSAC算法,原因有两个:

    (1)熟悉算法的最佳途径是自己去实现它;

    (2)方便使用.net的同志们利用RANSAC。

    感谢您耐心看完我的蹩脚翻译,希望对您有所帮助。

RANSAC随机采样一致算法 RANSAC简介 RANSAC(RAndomSAmpleConsensus,随机采样一致)算法是从一组含有“外点”(outliers)的数据中正确估计数学模型参数的迭代算法。“外点”一般指的的数据中的噪声,比如说匹配中的误匹配和估计曲线中的离群点。所以,RANSAC也是一种“外点”检测算法。RANSAC算法是一种不确定算法,它只能在一种概率下产生结果,并且这个概率会随着迭代次数的增加而加大(... 阅读详情

相关推荐

基于MATLAB的随机抽样一致性算法(RANSAC)

网上有许多关于随机抽样一致性算法的介绍,我理解的就是用这个算法可以在一堆离散数据中找到在一条直线上的数据,步骤如下: (1)新建一个ransac_demo.m的脚本,代码如下: function [bestParameter1,bestParameter2] = ransac_demo(data,num,iter,threshDist,inlierRatio) % data: a 2xn ...

qq_38991255的博客 3650

RANSAC(Random sample consensus)随机抽样一致性

RANSAC(Random Sample Consensus)是一种迭代的参数估计算法,用于从包含噪声和异常值的数据中拟合数学模型。它最初由Fischler和Bolles于1981年提出,被广泛应用于计算机视觉和计算机图形学等领域。RANSAC的核心思想是随机选择数据中的一小部分样本,并根据这些样本拟合一个模型。然后,通过计算其他数据点到该模型的距离,并将距离小于一定阈值的数据点划分为内点,而距离大于阈值的数据点则划分为外点。重复此过程多次,并选择具有最多内点的模型作为最终的估计结果。

qq_40622955的博客 4502

隨機抽樣一致性算法(RANSAC)

http://www.cnblogs.com/xrwang/archive/2011/03/09/ransac-1.html 作者:王先榮     本文翻譯自維基百科,英文原文地址是:http://en.wikipedia.org/wiki/ransac,如果您英語不錯,建議您直接查看原文。     RANSAC是「RANdom SAmple Consensus(隨機抽樣一致)」的縮

I am Rocky 5388

RANSAC(随机抽样一致性算法)的原理及其在 SIFT 特征点匹配中的应用

RANSAC(随机抽样一致性算法) 1. OverView RANSAC(RANdom SAmple Consensus, 译作 随机抽样一致性算法)是由Fischler和Bolles于1981年最先提出。它是根据一组包含异常数据的样本数据集,计算出数据的数学模型参数,得到有效样本数据的算法。 该算法在计算机视觉的匹配问题中(比如相机配准, 特征点匹配等)被用来寻找最佳的匹配模型。 2. RANS...

生命在于折腾! 7069

Ransac拟合直线和圆.rar_C#_RANSAC圆拟合_ransac 圆拟合_拟合_直线拟合

C# 实现直线拟合,圆拟合 ransac算法,剔除忽略点

USB PD快充功率监测仪:高精度嵌入式USB电压电流测量终端

USB供电已从数据接口演进为关键电源总线,尤其在PD快充场景下,工程师亟需对5V–20V宽压范围内的实时电压、电流及瞬时功率进行精准捕获。其底层原理依赖高共模抑制比的高边电流检测与分压采样+ADC数字化处理,结合LDO低噪声供电保障模拟链路精度。该类设备的技术价值在于以低成本实现协议无关的‘电气层可视化’,规避商用ASIC测试仪的黑盒局限,支撑PD充电验证、电源设计调试与教学实验等工程实践。本文介绍的开源USB表即基于N32G430 MCU与INA199电流检测芯片,覆盖USB-C输入/输出双通道监测,具备

weixin_42174098的博客 207

java随机抽样算法_随机抽样一致性(RANSAC)算法详解

随机抽样一致性(RANSAC)算法能够有效的剔除特征匹配中的错误匹配点。实际上,RANSAC能够有效拟合存在噪声模型下的拟合函数。实际上,RANSAC算法的核心在于将点划分为“内点”和“外点”。在一组包含“外点”的数据集中,采用不断迭代的方法,寻找最优参数模型,不符合最优模型的点,被定义为“外点”。这就是RANSAC的核心思想。RANSAC原理OpenCV中滤除误匹配对采用RANSAC算法寻找一个...

weixin_39977886的博客 1023

Oracle-如何修复undo坏快

undo出现坏快,导致数据库宕机,无法启动

qqqyyy0422的博客 570

RANSAC(随机抽样一致性算法)

RANSAC(随机抽样一致性算法)是一种用于估计数学模型参数的迭代方法,尤其适用于包含大量异常值的数据。使用 RANSAC,我们可以找到一个最优的线性拟合,同时最大限度地减少对异常值的影响。接下来,我将给出一个使用 RANSAC 进行线性回归的 Python 示例,并绘制散点、回归线及回归线的置信区间。

Python领域优质萌新学习笔记 1262

如何导入su_利用GIS快速生成SU场地模型

01|前言:进入2021年了,希望大家也是一个新的开始。告诫自己多写文章多更新,多读点书多旅行。然而元旦由于出去玩了4天,积累了一些事情要处理,一直没有时间好好写点东西。今天给大家带来的分享主题叫“利用GIS快速生成SU场地模型”。相关的视频方法其实B站上也有,但我相信视频很多人都不会看,我自己也是。直接给大家上操作流程。主要的操作步骤是【获取场地的矢量shp文件】—【导入ArcScen...

weixin_33806859的博客 9813

Python 爬取网页文字并保存为 txt 文件教程

将要爬取的网页网址赋值给变量url。

2403_89537385的博客 2789

ransac算法(随机抽样一致性)

<br />对于运行不了几次,一次运行不了多久的方法,我们不需要考虑性能优化,对于那些需要经常运行几百次几千次的方法,我们头脑里还是要有性能这根弦。C#太优雅方便了,以至于很多人写程序时根本就把性能抛到脑后了,不愿意耗费心思去进行代码优化和算法优化,结果写出来的程序奇慢无比。不明真相的群众把这怪罪给C#语言。这不是C#的杯具,是程序员的无能。<br />2个月前,我研究sift(一种重要的图像分析算法)。最先找到了一个C#实现的library——libsift,这个library处理一张正常大小的图像,要耗

fenggaoyuehei的专栏 1万+

【YOLOv12[基础]】热力图可视化实践 | 脚本升级 | 优化可视化效果 | 论文必备 | GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM等

热力图可视化实践 | 脚本升级 | 优化可视化效果 | 论文必备 GradCAMPlusPlus, GradCAM, XGradCAM, EigenCAM等

静谧、淡雅 895

随机抽样一致性算法RANSAC

什么是RANSAC?RANSAC是RANdom SAmple Consensus(随机抽样一致性)的缩写。它是从一个观察数据集合中,估计模型参数(模型拟合)的迭代方法。它是一种随机的不确定算法,每次运算求出的结果可能不相同,但总能给出一个合理的结果,为了提高概率必须提高迭代次数。RANSAC很强大。如图1所示,RANSAC用于在强干扰环境中寻找以某种模型(如直线)出现的数据。图中黄色点代表坐标原点,蓝色点代表输入的数据点集合(其中包含20个真实点和40个干扰点),红色点代表RANSAC算法在强干扰环境中,经

家家的专栏 2051

【知识分享】车载以太网PCB布局设计指南

本文将深入探讨在设计车载以太网设备的印刷电路板(PCB)时需要着重考虑的若干关键主题。这些主题广泛涵盖了数据布线设计,以确保其符合信号完整性(SI)和电磁兼容性(EMC)标准;外部元器件的合理摆放;以及采取有效的抗电磁干扰(EMI)布局策略等方面。通过全面且细致地处理这些关键环节,能够显著提升车载以太网设备的性能与可靠性。

一只豌豆象的博客 1352

把 MANDT 锁进保险箱:ABAP Client Handling 与 Client Isolation(聚焦 AMDP 的 Client Safety )

本文探讨了ABAP系统中Client Handling与Client Isolation机制的演进,重点分析了AMDP环境下多租户隔离的风险与解决方案。传统ABAP SQL/CDS通过隐式Client过滤提供安全保障,而AMDP因其原生SQLScript特性容易绕过隔离机制。文章对比了旧时代依赖开发自觉的传参方式与新时代通过AMDP OPTIONS强约束的语法方案,详细介绍了CLIENT INDEPENDENT和CDS SESSION CLIENT DEPENDENT两种编译期安全机制,阐述了USING列表

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 340

RANSAC优化PnP算法:从理论到实践的随机抽样一致性应用

本文深入探讨了RANSAC优化PnP算法在计算机视觉中的应用,从理论基础到实践技巧全面解析。通过分析随机抽样一致性算法(RANSAC)与PnP问题的结合,提供了参数调优、代码实现及常见问题解决方案,帮助开发者提升视觉定位系统的鲁棒性和精度。

vodka的博客 769

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

随机抽样一致性算法(RANSAC)示例及源代码

作者:王先荣     大约在两年前翻译了《随机抽样一致性算法RANSAC》,在文章的最后承诺写该算法的C#示例程序。可惜光阴似箭,转眼许久才写出来,实在抱歉。本文将使用随机抽样一致性算法来来检测直线和圆,并提供源代码下载。 一、RANSAC检测流程     在这里复述下RANSAC的检测流程,详细的过程见上一篇翻译文章:     RANSAC算法的输入是一组观测数据,一个可以解释或者适应于...

weixin_33733810的博客 791

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 确保真正的线程安全——微软为什么不提供线程安全库
下一篇: .net中比较两幅图片是否相同
jackfirst86
博客等级 码龄18年 28粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值