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

article/2025/9/12 20:31:01

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

本人邮箱:sylvester0510@163.com,欢迎交流讨论,
欢迎转载,转载请注明网址http://blog.csdn.net/u010128736/


一、RANSAC介绍

   随机抽样一致算法(RANdom SAmple Consensus,RANSAC),采用迭代的方式从一组包含离群的被观测数据中估算出数学模型的参数。维基百科中的RANSAC该算法最早由Fischler和Bolles于1981年提出。RANSAC算法假设数据中包含正确数据和异常数据(或称为噪声)。正确数据记为内点(inliers),异常数据记为外点(outliers)。同时RANSAC也假设,给定一组正确的数据,存在可以计算出符合这些数据的模型参数的方法。该算法核心思想就是随机性和假设性,随机性是根据正确数据出现概率去随机选取抽样数据,根据大数定律,随机性模拟可以近似得到正确结果。假设性是假设选取出的抽样数据都是正确数据,然后用这些正确数据通过问题满足的模型,去计算其他点,然后对这次结果进行一个评分。
  RANSAC算法被广泛应用在计算机视觉领域和数学领域,例如直线拟合、平面拟合、计算图像或点云间的变换矩阵、计算基础矩阵等方面,使用的非常多。本文将在对RANSAC介绍完后,附两段直线拟合以及平面拟合的matlab代码。关于计算机视觉中基于RANSAC框架的矩阵求解问题,在OpenCV中都有对应的函数接口,如果以后有机会再把这个整理出来。

二、算法基本思想

  如下图所示,存在很多离散的点,而我们认为这些点构成了一条直线。当然,人眼能很清晰地拟合出这条直线,找到外点。但要让计算机找到这条直线,在很久之前是很难的,RACSAC的出现是通过数学之美解决这一难题的重要发明。
这里写图片描述

通过实例对算法基本思想进行描述:

(1)首先,我们知道要得到一个直线模型,我们需要两个点唯一确定一个直线方程。所以第一步我们随机选择两个点。
(2)通过这两个点,我们可以计算出这两个点所表示的模型方程y=ax+b。
(3)我们将所有的数据点套到这个模型中计算误差。
(4)我们找到所有满足误差阈值的点,第4幅图中可以看到,只有很少的点支持这个模型。
(5)然后我们再重复(1)~(4)这个过程,直到达到一定迭代次数后,我们选出那个被支持的最多的模型,作为问题的解。如下图所示:
这里写图片描述

以上是对RANSAC算法的基本思想的介绍,我们可以发现,虽然这个数据集中外点和内点的比例几乎相等,但是RANSAC算法还是能找到最合适的解。试想一下,这个问题如果使用最小二乘法进行优化,由于噪声数据的干扰,我们得到的结果肯定是一个错误的结果,如下图所示。这是由于最小二乘法是一个将外点参与讨论的代价优化问题,而RANSAC是一个使用内点进行优化的问题。经实验验证,对于包含80%误差的数据集,RANSAC的效果远优于直接的最小二乘法。
这里写图片描述

三、RANSAC的数学推导

  我们假设内点在整个数据集中的概率为t,即:

t=ninliersninliers+noutliers

确定该问题的模型需要n个点,这个n是根据问题而定义的,例如拟合直线时n为2,平面拟合时n=3,求解点云之间的刚性变换矩阵时n=3,求解图像之间的射影变换矩阵是n=4,等等。k表示迭代次数,即随机选取n个点计算模型的次数。P为在这些参数下得到正确解的概率。为方便表示,我们可以得到,n个点都是内点的概率为 tn ,则n个点中至少有一个是外点的概率为
1tn

1tnk 表示k次随机抽样中都没有找到一次全是内点的情况,这个时候得到的是错误解,也就是:
P=1(1tn)k

内点概率t是一个先验值,可以给出一些鲁棒的值。同时也可以看出,即使t给的过于乐观,也可以通过增加迭代次数k,来保证正确解的概率P。同样的,我们可以通过上面式子计算出来迭代次数k,即我们假设需要正确概率为P(例如我们需要99%的概率取到正确解),则:
k=log(1P)log(1tn)

四、利用RANSAC拟合直线

clc;clear all;close all;%%%二维直线拟合
%%%生成随机数据
%内点
mu=[0 0];  %均值
S=[1 2.5;2.5 8];  %协方差
data1=mvnrnd(mu,S,200);   %产生200个高斯分布数据
%外点
mu=[2 2];
S=[8 0;0 8];
data2=mvnrnd(mu,S,100);     %产生100个噪声数据
%合并数据
data=[data1',data2'];
iter = 100; %%% 绘制数据点figure;plot(data(1,:),data(2,:),'o');hold on; % 显示数据点number = size(data,2); % 总点数bestParameter1=0; bestParameter2=0; % 最佳匹配的参数sigma = 1;pretotal=0;     %符合拟合模型的数据的个数for i=1:iter%%% 随机选择两个点idx = randperm(number,2); sample = data(:,idx); %%%拟合直线方程 y=kx+bline = zeros(1,3);x = sample(:, 1);y = sample(:, 2);k=(y(1)-y(2))/(x(1)-x(2));      %直线斜率b = y(1) - k*x(1);line = [k -1 b]mask=abs(line*[data; ones(1,size(data,2))]);    %求每个数据到拟合直线的距离total=sum(mask<sigma);              %计算数据距离直线小于一定阈值的数据的个数if total>pretotal            %找到符合拟合直线数据最多的拟合直线pretotal=total;bestline=line;          %找到最好的拟合直线end  end%显示符合最佳拟合的数据
mask=abs(bestline*[data; ones(1,size(data,2))])<sigma;    
hold on;
k=1;
for i=1:length(mask)if mask(i)inliers(1,k) = data(1,i);k=k+1;plot(data(1,i),data(2,i),'+');end
end%%% 绘制最佳匹配曲线bestParameter1 = -bestline(1)/bestline(2);bestParameter2 = -bestline(3)/bestline(2);xAxis = min(inliers(1,:)):max(inliers(1,:));yAxis = bestParameter1*xAxis + bestParameter2;plot(xAxis,yAxis,'r-','LineWidth',2);title(['bestLine:  y =  ',num2str(bestParameter1),'x + ',num2str(bestParameter2)]);

结果如图所示:

这里写图片描述

五、利用RANSAC拟合平面

clc;clear all;close all;%%%三维平面拟合
%%%生成随机数据
%内点
mu=[0 0 0];  %均值
S=[2 0 4;0 4 0;4 0 8];  %协方差
data1=mvnrnd(mu,S,300);   %产生200个高斯分布数据
%外点
mu=[2 2 2];
S=[8 1 4;1 8 2;4 2 8];  %协方差
data2=mvnrnd(mu,S,100);     %产生100个噪声数据
%合并数据
data=[data1',data2'];
iter = 1000; %%% 绘制数据点figure;plot3(data(1,:),data(2,:),data(3,:),'o');hold on; % 显示数据点number = size(data,2); % 总点数bestParameter1=0; bestParameter2=0; bestParameter3=0; % 最佳匹配的参数sigma = 1;pretotal=0;     %符合拟合模型的数据的个数for i=1:iter%%% 随机选择三个点idx = randperm(number,3); sample = data(:,idx); %%%拟合直线方程 z=ax+by+cplane = zeros(1,3);x = sample(:, 1);y = sample(:, 2);z = sample(:, 3);a = ((z(1)-z(2))*(y(1)-y(3)) - (z(1)-z(3))*(y(1)-y(2)))/((x(1)-x(2))*(y(1)-y(3)) - (x(1)-x(3))*(y(1)-y(2)));b = ((z(1) - z(3)) - a * (x(1) - x(3)))/(y(1)-y(3));c = z(1) - a * x(1) - b * y(1);plane = [a b -1 c]mask=abs(plane*[data; ones(1,size(data,2))]);    %求每个数据到拟合平面的距离total=sum(mask<sigma);              %计算数据距离平面小于一定阈值的数据的个数if total>pretotal            %找到符合拟合平面数据最多的拟合平面pretotal=total;bestplane=plane;          %找到最好的拟合平面end  end%显示符合最佳拟合的数据
mask=abs(bestplane*[data; ones(1,size(data,2))])<sigma;    
hold on;
k = 1;
for i=1:length(mask)if mask(i)inliers(1,k) = data(1,i);inliers(2,k) = data(2,i);plot3(data(1,i),data(2,i),data(3,i),'r+');k = k+1;end
end%%% 绘制最佳匹配平面bestParameter1 = bestplane(1);bestParameter2 = bestplane(2);bestParameter3 = bestplane(4);xAxis = min(inliers(1,:)):max(inliers(1,:));yAxis = min(inliers(2,:)):max(inliers(2,:));[x,y] = meshgrid(xAxis, yAxis);z = bestParameter1 * x + bestParameter2 * y + bestParameter3;surf(x, y, z);title(['bestPlane:  z =  ',num2str(bestParameter1),'x + ',num2str(bestParameter2),'y + ',num2str(bestParameter3)]);

结果如图所示:

这里写图片描述
这里写图片描述


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

相关文章

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;也就是管理距离&…

各协议的协议号和端口号

协议号与端口号详解 IP是网络层协议&#xff0c;IP头中的协议号用来说明IP报文中承载的是哪种协议&#xff08;一般是传输层协议&#xff0c;比如6 TCP&#xff0c;17 UDP&#xff1b;但也可能是网络层协议&#xff0c;比如1 ICMP&#xff1b;也可能是应用层协议&#xff0c;比…

TCP/IP协议号

转自http://www.52rd.com/Blog/Detail_RD.Blog_liweikui_22903.html&#xff0c;作者&#xff1a;liweikui IP协议号&#xff1a;IP首部中有8位协议号&#xff0c;用于指明IP的上层协议&#xff0c;具体如下&#xff1a; 协议号 协议类型 说明 0 HOPOPT IPv6逐跳选项 1…

MATLAB APP全局变量的使用

切换到代码视图&#xff0c;左上角代码浏览器点击属性&#xff0c;有如下提示&#xff1a; 点击➕旁边&#xff0c;会出现提示&#xff1a; 按照提示所说&#xff0c;在这里就可以添加全局变量了。 点击➕&#xff0c;在代码中便会添加如下代码&#xff1a; properties (Acce…