MATLAB 随机抽样一致RANSAC

   2023-02-09 学习力0
核心提示:RANSAC在图像拼接中有所使用,有时候也在图像理解的相关算法中有所使用。算法简介如下(摘自《图像处理、分析与机器视觉(第3版)》):1.假设我们要将n个数据点X={x1,x1,...,xn}拟合为一个由至少m个点决定的模型(m=n,对于直线,m=2)。(我这里实际是两个不

RANSAC在图像拼接中有所使用,有时候也在图像理解的相关算法中有所使用。

算法简介如下(摘自《图像处理、分析与机器视觉(第3版)》):

1.假设我们要将n个数据点X={x1,x1,...,xn}拟合为一个由至少m个点决定的模型(m<=n,对于直线,m=2)。(我这里实际是两个不同均值、协方差高斯分布产生的数据)

2.设迭代计数k=1。

3.从X中随机选取m个项并拟合一个模型。(我这里直线拟合,选了2个项)

4.给定偏差ε,计算X中相对于模型的残差在偏差ε的个数,如果元素个数大于一个阈值t,根据一致点集重新拟合模型(可以利用最小二乘或其变种),算法终止。(我这里的偏差为1,阈值为数据个数的2/3)

5.设k=k+1,如果k小于一个事先给定的K,跳至第3步,否则采用具有迄今最大的一致点集模型,或算法失败。

运行效果如下,红圈是所有的数据,蓝叉是符合拟合模型的数据。

MATLAB 随机抽样一致RANSAC

matlab代码如下:

main.m

 1 close all;clear all;clc;
 2 
 3 %真实的数据
 4 mu=[0 0];  %均值
 5 S=[1 2.5;2.5 8];  %协方差
 6 data1=mvnrnd(mu,S,200);   %产生200个高斯分布数据
 7 
 8 %噪声数据
 9 mu=[2 2];
10 S=[8 0;0 8];
11 data2=mvnrnd(mu,S,100);     %产生100个噪声数据
12 
13 data=[data1;data2];
14 plot(data(:,1),data(:,2),'ro');     %显示全部数据
15 
16 K=100;          %设置最大迭代次数
17 sigma=1;        %设置拟合直线与数据距离的偏差
18 pretotal=0;     %符合拟合模型的数据的个数
19 k=1;
20 while pretotal < size(data,1)*2/3 &&  k<K      %有2/3的数据符合拟合模型或达到最大迭代次数就可以退出了
21     SampIndex=floor(1+(size(data,1)-1)*rand(2,1));  %产生两个随机索引,找样本用,floor向下取整
22     
23     samp1=data(SampIndex(1),:);     %对原数据随机抽样两个样本
24     samp2=data(SampIndex(2),:);
25     
26     line=Mytls([samp1;samp2]);      %对两个数据拟合出直线,或其他变种拟合方法
27     mask=abs(line*[data ones(size(data,1),1)]');    %求每个数据到拟合直线的距离
28     total=sum(mask<sigma);              %计算数据距离直线小于一定阈值的数据的个数
29     
30     if total>pretotal            %找到符合拟合直线数据最多的拟合直线
31         pretotal=total;
32         bestline=line;          %找到最好的拟合直线
33     end  
34     k=k+1;
35 end
36 
37 %显示符合最佳拟合的数据
38 mask=abs(bestline*[data ones(size(data,1),1)]')<sigma;    
39 hold on;
40 for i=1:length(mask)
41     if mask(i)
42         plot(data(i,1),data(i,2),'+');
43     end
44 end

Mytls.m(已知两点求直线)

 1 %这里是解如下三个方程的方程组
 2 %a*x1+b*y1+c=0
 3 %a*x2+b*y2+c=0
 4 %a^2+b^2=1
 5 %返回系数[a b c]
 6 function line=Mytls(data)
 7     x = data(1, :);
 8     y = data(2, :);
 9 
10     k=(y(1)-y(2))/(x(1)-x(2));      %直线斜率,有些情况肯定需要个别判断,这里忽略了
11     a=sqrt(1-1/(1+k^2));
12     b=sqrt(1-a^2);
13 
14     if k>0          %如果斜率大于0,a,b异号
15        b=-b; 
16     end
17     
18     c=-a*x(1)-b*y(1);
19     line=[a b c];
20 end

 

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 如何在Abaqus的python中调用Matlab程序
    目录1. 确定版本信息2. 备份python3. 设置环境变量4. 安装程序5. 调试运行参考资料Abaqus2018操作系统Win10 64位Python版本2.7(路径C:\SIMULIA\CAE\2018\win_b64\tools\SMApy\python2.7)2. 备份python将上述的“python2.7”文件夹复制出来,避免因操作错误
    03-16
  • 如何将极坐标数据转换为笛卡尔坐标系并绘制[MATLAB]
    如何将极坐标数据转换为笛卡尔坐标系并绘制[MAT
    你想做的事考虑根据与原点的距离 $r$ 和 $xy$ 平面上的角度 $heta$ 绘制数据 $P(r, heta)$。例如,雷达获取的信号包含有关目标范围 $r$ 和方位角 $heta$ 的信息。就是下图。在本文中,$heta$ 是从 $x$ 轴测量的角度。显示示例考虑创建依赖于 $r, heta$ 的虚拟
    03-16
  • 【MATLAB与机械设计】一维优化进退法确定初始区间
    【MATLAB与机械设计】一维优化进退法确定初始区
    在讨论一维搜索时,首先保证搜索区间函数具有单峰性,也就是在区间[a,b]中函数是凸函数,对于求极小值问题,函数值具有高—低—高的特性,在区间[a,b]上有唯一的最小值。1,方法的建立2.进退法确定搜索区间的程序框图3,根据上述的程序框图,编写的MATLAB程序
    03-08
  • 用于微型四轮驱动的 6T 小齿轮原型和使用 MATLAB 的 FEM 结构分析
    用于微型四轮驱动的 6T 小齿轮原型和使用 MATLA
    介绍我使用迷你 4WD 套件使用 Raspberry Pi 制作机器人汽车。定制零件丰富且方便,因为它们在附近的商店很容易买到。但是,由于Mini 4WD的速度非常快,因此在低速时很难控制速度。因此,我使用 3D 打印机制作了自己的 6T 小齿轮,并尝试改变齿轮比。 成型小齿
    03-08
  • ROS与Matlab系列:一个简单的运动控制 基于matl
    转自:http://blog.exbot.net/archives/2594Matlab拥有强大的数据处理、可视化绘图能力以及众多成熟的算法函数,非常适合算法开发;在控制系统设计中,Simulink也是普遍使用的设计和仿真工具。而ROS系统,则是一种新的标准化机器人系统软件框架。通过ROS,你
    02-10
  • matlab 遍历结构体struc的成员
    MATLAB中专门用于对结构数组的操作的函数并不多,通过 help datatypes获取数据类型列表,可以看到其中的结构数据类型的有关的函数,主要如表4.3.1所示。表4.3.1 结构数组的操作函数函数名             功能描述 deal                 把输入处
    02-09
  • 02-09
  • schroeder reverb matlab实现
    schroeder reverb matlab实现
    原理参考:Natural sounding artificial reverberation combFilter.m:function output = combFilter(delay, gain, input)fs = 48000;delaySample = int32(delayTime * fs / 1000);B = [1 zeros(1, delaySample - 1)];A=[1 zeros(1, delaySample - 2) -gain];
    02-09
  • C/C++中调用matlab引擎计算 matlab转c
    原帖地址:http://blog.sina.com.cn/s/blog_6adcb3530101cvot.html一,在linux环境使用matlab引擎必须先进行一些必要的配置1,matlab引擎依赖/bin/csh启动,所以不管你使用何种shell,都必须安装csh。**2,matlab引擎依赖的动态库文件目录必须在系统当前的
    02-09
  • MATLAB 图像放大/缩小,双线性插值
    MATLAB 图像放大/缩小,双线性插值
    半年前写过matlab最邻近插值的图像缩放,没怎么考虑边界问题。更早之前用Opencv写过双线性插值图像放大,不过写的比较混乱。所以这里用matlab重新再清楚的写一遍。 1 close all; 2 clear all; 3 clc; 45 m=1.8;%放大或缩小的高度 6 n=2.3;%放大或缩小的宽度 7
    02-09
点击排行