matlab练习程序(随机抽样一致RANSAC)

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代码如下:

main.m

close all;clear all;clc;

%真实的数据
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];
plot(data(:,1),data(:,2),'ro');     %显示全部数据

K=100;          %设置最大迭代次数
sigma=1;        %设置拟合直线与数据距离的偏差
pretotal=0;     %符合拟合模型的数据的个数
k=1;
while pretotal < size(data,1)*2/3 &&  k<K      %有2/3的数据符合拟合模型或达到最大迭代次数就可以退出了
    SampIndex=floor(1+(size(data,1)-1)*rand(2,1));  %产生两个随机索引,找样本用,floor向下取整
    
    samp1=data(SampIndex(1),:);     %对原数据随机抽样两个样本
    samp2=data(SampIndex(2),:);
    
    line=Mytls([samp1;samp2]);      %对两个数据拟合出直线,或其他变种拟合方法
    mask=abs(line*[data ones(size(data,1),1)]');    %求每个数据到拟合直线的距离
    total=sum(mask<sigma);              %计算数据距离直线小于一定阈值的数据的个数
    
    if total>pretotal            %找到符合拟合直线数据最多的拟合直线
        pretotal=total;
        bestline=line;          %找到最好的拟合直线
    end  
    k=k+1;
end

%显示符合最佳拟合的数据
mask=abs(bestline*[data ones(size(data,1),1)]')<sigma;    
hold on;
for i=1:length(mask)
    if mask(i)
        plot(data(i,1),data(i,2),'+');
    end
end

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

%这里是解如下三个方程的方程组
%a*x1+b*y1+c=0
%a*x2+b*y2+c=0
%a^2+b^2=1
%返回系数[a b c]
function line=Mytls(data)
    x = data(1, :);
    y = data(2, :);

    k=(y(1)-y(2))/(x(1)-x(2));      %直线斜率,有些情况肯定需要个别判断,这里忽略了
    a=sqrt(1-1/(1+k^2));
    b=sqrt(1-a^2);

    if k>0          %如果斜率大于0,a,b异号
       b=-b; 
    end
    
    c=-a*x(1)-b*y(1);
    line=[a b c];
end

更详尽的介绍见下面的网页:

1.http://en.wikipedia.org/wiki/Ransac

2.http://www.cnblogs.com/xrwang/archive/2011/03/09/ransac-1.html

转载于:https://www.cnblogs.com/tiandsp/archive/2013/06/03/3115743.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RANSACRandom Sample Consensus)是一种用于拟合模型并对含有噪声和异常值的数据进行鲁棒估计的算法。它的基本思想是通过迭代的方式从数据集随机选择一部分样本,然后根据这些样本拟合模型,再根据拟合得到的模型评估其他样本是否符合该模型。通过迭代过程,RANSAC可以找到一个对异常值具有鲁棒性的拟合模型。 RANSAC的步骤如下: 1. 随机选择一部分样本,这部分样本称为内群(inliers)。 2. 根据内群拟合模型,得到模型的参数。 3. 对于剩余的样本,计算其与模型的误差,将误差小于一定阈值的样本称为内群,将误差大于阈值的样本称为离群(outliers)。 4. 判断当前模型的质量,可以通过判断内群的数量或者拟合误差的均值来评估模型的好坏。 5. 重复以上步骤多次,选择拟合误差最小或者内群最多的模型作为最终结果。 RANSAC的优点在于它能够有效地处理含有噪声和异常值的数据,对于不同类型的模型都可以使用。相比于最小二乘法,RANSAC可以捕捉到那些偏离心的离群点,并将其排除在拟合过程之外,从而得到更准确的结果。因此,在一些对数据质量要求较高的应用RANSAC的效果往往优于最小二乘法。 参考资料: 基于OpenCV实现的RANSAC随机抽样一致性直线拟合_thequitesunshine007的博客-CSDN博客 如下图所示,由于最小二乘法拟合数据的时候是考虑所有的数据,所以最小二乘法的误差较大,而RANSAC算法是将那些噪声点设为离群点,就像下图偏离心的那些点,所以RANSAC得到的结果准确度较高,所以RANSAC的效果总是远优于最小二乘法。 RANSAC将数据分为内群数据和离群数据,离群数据也就是受噪声影响的数据。RANSAC假定,给定一组内群,存在一个程序,这个程序可以估算最佳解释或最适用于这一数据模型的参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值