随机抽样一致算法(Random sample consensus,RANSAC)
作者:桂。
时间:2017-04-25 21:05:07
链接:http://www.cnblogs.com/xingshansi/p/6763668.html
前言
仍然是昨天的问题,别人问到最小二乘、霍夫变换、RANSAC在直线拟合上的区别。昨天梳理了霍夫变换,今天打算抽空梳理一下RANSAC算法,主要包括:
1)RANSAC理论介绍
2)RANSAC应用简介;
内容为自己的学习记录,其中很多地方借鉴了别人,最后一起给出链接。
一、RANSAC理论介绍
普通最小二乘是保守派:在现有数据下,如何实现最优。是从一个整体误差最小的角度去考虑,尽量谁也不得罪。
RANSAC是改革派:首先假设数据具有某种特性(目的),为了达到目的,适当割舍一些现有的数据。
给出最小二乘拟合(红线)、RANSAC(绿线)对于一阶直线、二阶曲线的拟合对比:
可以看到RANSAC可以很好的拟合。RANSAC可以理解为一种采样的方式,所以对于多项式拟合、混合高斯模型(GMM)等理论上都是适用的。
RANSAC的算法大致可以表述为(来自wikipedia):
Given:data – a set of observed data pointsmodel – a model that can be fitted to data pointsn – the minimum number of data values required to fit the modelk – the maximum number of iterations allowed in the algorithmt – a threshold value for determining when a data point fits a modeld – the number of close data values required to assert that a model fits well to data
Return:
bestfit – model parameters which best fit the data (or nul if no good model is found)
iterations = 0
bestfit = nul
besterr = something really large
while iterations < k {
maybeinliers = n randomly selected values from data
maybemodel = model parameters fitted to maybeinliers
alsoinliers = empty set
for every point in data not in maybeinliers {
if point fits maybemodel with an error smaller than t
add point to alsoinliers
}
if the number of elements in alsoinliers is > 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 alsoinliers
thiserr = a measure of how well model fits these points
if thiserr < besterr {
bestfit = bettermodel
besterr = thiserr
}
}
increment iterations
}
return bestfit
RANSAC简化版的思路就是:
第一步:假定模型(如直线方程),并随机抽取Nums个(以2个为例)样本点,对模型进行拟合:
第二步:由于不是严格线性,数据点都有一定波动,假设容差范围为:sigma,找出距离拟合曲线容差范围内的点,并统计点的个数:
第三步:重新随机选取Nums个点,重复第一步~第二步的操作,直到结束迭代:
第四步:每一次拟合后,容差范围内都有对应的数据点数,找出数据点个数最多的情况,就是最终的拟合结果:
至此:完成了RANSAC的简化版求解。
这个RANSAC的简化版,只是给定迭代次数,迭代结束找出最优。如果样本个数非常多的情况下,难不成一直迭代下去?其实RANSAC忽略了几个问题:
- 每一次随机样本数Nums的选取:如二次曲线最少需要3个点确定,一般来说,Nums少一些易得出较优结果;
- 抽样迭代次数Iter的选取:即重复多少次抽取,就认为是符合要求从而停止运算?太多计算量大,太少性能可能不够理想;
- 容差Sigma的选取:sigma取大取小,对最终结果影响较大;
这些参数细节信息参考:维基百科。
RANSAC的作用有点类似:将数据一切两段,一部分是自己人,一部分是敌人,自己人留下商量事,敌人赶出去。RANSAC开的是家庭会议,不像最小二乘总是开全体会议。
附上最开始一阶直线、二阶曲线拟合的code(只是为了说明最基本的思路,用的是RANSAC的简化版):
一阶直线拟合:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
clc ; clear all ; close all ;
set (0, 'defaultfigurecolor' , 'w' );
%Generate data
param = [3 2];
npa = length (param);
x = -20:20;
y = param*[x; ones (1, length (x))]+3* randn (1, length (x));
data = [x randi (20,1,30);...
y randi (20,1,30)];
%figure
figure
subplot 221
plot (data(1,:),data(2,:), 'k*' ); hold on;
%Ordinary least square mean
p = polyfit (data(1,:),data(2,:),npa-1);
flms = polyval (p,x);
plot (x,flms, 'r' , 'linewidth' ,2); hold on;
title ( '最小二乘拟合' );
%Ransac
Iter = 100;
sigma = 1;
Nums = 2; %number select
res = zeros (Iter,npa+1);
for i = 1:Iter
idx = randperm ( size (data,2),Nums);
if diff (idx) ==0
continue ;
end
sample = data(:,idx);
pest = polyfit (sample(1,:),sample(2,:),npa-1); %parameter estimate
res( i ,1:npa) = pest;
res( i ,npa+1) = numel ( find ( abs ( polyval (pest,data(1,:))-data(2,:))<sigma));
end
[~,pos] = max (res(:,npa+1));
pest = res(pos,1:npa);
fransac = polyval (pest,x);
%figure
subplot 222
plot (data(1,:),data(2,:), 'k*' ); hold on;
plot (x,flms, 'r' , 'linewidth' ,2); hold on;
plot (x,fransac, 'g' , 'linewidth' ,2); hold on;
title ( 'RANSAC' );
|
二阶曲线拟合:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
clc ; clear all ;
set (0, 'defaultfigurecolor' , 'w' );
%Generate data
param = [3 2 5];
npa = length (param);
x = -20:20;
y = param*[x.^2;x; ones (1, length (x))]+3* randn (1, length (x));
data = [x randi (20,1,30);...
y randi (200,1,30)];
%figure
subplot 223
plot (data(1,:),data(2,:), 'k*' ); hold on;
%Ordinary least square mean
p = polyfit (data(1,:),data(2,:),npa-1);
flms = polyval (p,x);
plot (x,flms, 'r' , 'linewidth' ,2); hold on;
title ( '最小二乘拟合' );
%Ransac
Iter = 100;
sigma = 1;
Nums = 3; %number select
res = zeros (Iter,npa+1);
for i = 1:Iter
idx = randperm ( size (data,2),Nums);
if diff (idx) ==0
continue ;
end
sample = data(:,idx);
pest = polyfit (sample(1,:),sample(2,:),npa-1); %parameter estimate
res( i ,1:npa) = pest;
res( i ,npa+1) = numel ( find ( abs ( polyval (pest,data(1,:))-data(2,:))<sigma));
end
[~,pos] = max (res(:,npa+1));
pest = res(pos,1:npa);
fransac = polyval (pest,x);
%figure
subplot 224
plot (data(1,:),data(2,:), 'k*' ); hold on;
plot (x,flms, 'r' , 'linewidth' ,2); hold on;
plot (x,fransac, 'g' , 'linewidth' ,2); hold on;
title ( 'RANSAC' );
|
二、RANSAC应用简介
RANSAC其实就是一种采样方式,例如在图像拼接(Image stitching)技术中:
第一步:预处理后(据说桶形变换,没有去了解过)提取图像特征(如SIFT)
第二步:特征点进行匹配,可利用归一化互相关(Normalized Cross Correlation method, NCC)等方法。
但这个时候会有很多匹配错误的点:
这就好比拟合曲线,有很多的误差点,这个时候就想到了RANSAC算法:我不要再兼顾所有了,每次选取Nums个点匹配 → 计算匹配后容差范围内的点数 → 重复实验,迭代结束后,找出点数最多的情况,就是最优的匹配。
利用RANSAC匹配:
第三步:图像拼接,这个就涉及拼接技术了,直接给出结果:
参考:
- RANSAC:https://en.wikipedia.org/wiki/Random_sample_consensus
- 图像拼接:http://blog.csdn.net/xiaoch1222/article/details/53510895
转载自:https://www.cnblogs.com/xingshansi/p/6763668.html
随机抽样一致算法(Random sample consensus,RANSAC)相关推荐
- Random Sample Consensus: A Paradigm for Model Fitting
Random Sample Consensus: A Paradigm for Model Fitting with Applications to Image Analysis and Automa ...
- 【点云处理技术之PCL】随机采样一致算法(Random sample consensus,RANSAC)
文章目录 1. RANSAC介绍 2. RANSAC与最小二乘法 3. RANSAC思路流程 4. 代码举例 1. RANSAC介绍 应用范围:曲线拟合.地面拟合.图像拼接. RANSAC是" ...
- 【论文阅读】24-USAC: A Universal Framework for Random Sample Consensus
[论文阅读]24-USAC: A Universal Framework for Random Sample Consensus 0.basic info 1. standard RANSAC 1.1 ...
- 论文阅读笔记《USAC: A Universal Framework for Random Sample Consensus》
本文总结了RANSAC算法的流程与存在的问题,整理了近几年基于RANSAC提出的改进算法,并整合各个算法的优势,提出一个统一的RANSAC算法框架.因此本文也可以看做是一片关于RANSAC算法的论 ...
- RANSAC(Random Sample Consensus)随机抽样检验一致性
转载请注明出处: 算法简介 RANSAC算法的基本假设是样本中包含正确数据(inliers,可以被模型描述的数据),也包含异常数据(outliers,偏离正常范围很远.无法适应数学模型的数据),即数据 ...
- 随机抽样一致算法(RANSAC)理论介绍和程序实现
1.随机抽样一致算法(Random sample consensus,RANSAC)理论介绍 Ordinary LS是保守派:在现有数据下,如何实现最优.是从一个整体误差最小的角度去考虑,尽量谁也不得 ...
- RANSAC随机抽样一致算法
本文主要参考了http://www.cnblogs.com/xrwang/archive/2011/03/09/ransac-1.html http://grunt1223.iteye.com/blo ...
- pandas对dataframe的数据列进行随机抽样(Random Sample of Columns)、使用sample函数进行数据列随机抽样
pandas对dataframe的数据列进行随机抽样(Random Sample of Columns).使用sample函数进行数据列随机抽样 目录
- pandas对dataframe的数据行进行随机抽样(Random Sample of Rows):使用sample函数进行数据行随机抽样(有放回的随机抽样,replacement)
pandas对dataframe的数据行进行随机抽样(Random Sample of Rows):使用sample函数进行数据行随机抽样(有放回的随机抽样,replacement) 目录
最新文章
- 使用Novell.Directory.Ldap.NETStandard在.NET Core中验证AD域账号
- DHCP Server 故障转移实现 (结合H3C交换机)
- python简单代码画图-Python科学画图代码分享
- C语言 程序代码编写规范
- linux php7.0安装debug,ubuntu 安装php7.0 xdebug
- 常用HTML转义字符,html转义符,JavaScript转义符,html转义字符表,HTML语言特殊字符对照表(ISO Latin-1字符集)...
- c语言与java负数补码,详解原码、反码与补码存储与大小
- qqwry.dat java 乱码_UTF-8使用纯真IP数据库乱码问题
- 把日志实时写入数据库
- 机器学习9-案例1:银行营销策略分析
- mysql 只显示箭头_为什么在DOS窗口中使用MySQL时,输入命令后只出现一个箭头,输入什么内容都是这样?...
- 计算机组成原理感想,学习计算机组成原理的感想
- 从CSV和VCF文件中获取联系人信息
- 大话中国骨干网(上)
- 18650锂电池保护板接线图_锂电池保护板的基础知识及常见不良分析
- react使用echarts地图实现中国地图大区展示
- python绘图小dome
- 在SSH会话中如何实现 X11 Forwarding
- 微型计算机出现在20世纪,北语网院20秋《计算机基础》作业【标准答案】
- java jsf_JSF----概述