matlab直线拟合RANSAC初探
来源:互联网 发布:linux php打开下载 编辑:程序博客网 时间:2024/06/05 10:12
采用RANSAC做直线拟合最大的优点是具有一定的抗噪声性能,但是其终止条件的选择对拟合效果很关键
RANSAC的线性拟合算法步骤大致如下:
while 最大尝试次数
从观测点集中随机取两点,计算出直线的参数k, t(或者k用向量表示),得出一个候选的直线模型。
计算候选直线与整个点集的匹配程度,可以采用统计在直线上(或到直线的距离小于一个阈值)的点的个数。
保留匹配程度最好的直线的参数。
如果本次尝试匹配点的个数 占整个点集大部分,超出预期(阈值),提前结束尝试。
endwhile
clc;clear;%真实数据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的数据符合拟合模型或者达到最大迭代次数才退出 SampleIndex = floor(1 + (size(data,1) - 1) * rand(2,1)); %产生两个随机索引,用于找样本,floor乡下取整 samp1 = data(SampleIndex(1),:); %对元素数据随机抽样两个样本 samp2 = data(SampleIndex(2),:); line = lineParam([samp1;samp2]); %对两个数据拟合出直线 temp = [data ones(size(data,1),1)]; mask = abs(line * [data ones(size(data,1),1)]'); %求每格数据到拟合直线的距离 d = |ax0 + by0 + c| / sqrt(a * a + b * b); 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),'+'); endend
%----------------------------------------------%这里是解以下三个方程组%a * x1 + b * y1 + c = 0%a * x2 + b * y2 + c = 0%a^2 + b^2 = 1%返回系数[a b c]%----------------------------------------------function line = lineParam(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 b = -b; end c = -a * x(1) - b * y(1); line = [a b c];end
阅读全文
0 0
- matlab直线拟合RANSAC初探
- RANSAC介绍(Matlab版直线拟合+平面拟合)
- Ransac算法--直线拟合
- Ransac算法--直线拟合
- RANSAC算法做直线拟合
- RANSAC算法做直线拟合
- RANSAC算法做直线拟合
- matlab中实现RANSAC平面拟合
- RANSAC估计——以直线拟合为例
- RANSAC直线拟合和最小二乘直线拟合的简单介绍
- 最小二乘拟合&基于RANSAC的直线拟合&椭圆拟合
- [Matlab]基于matlab的ransac平面拟合程序
- 利用MATLAB进行直线拟合的程序
- Matlab直线拟合的原理和代码
- 最小二乘法直线拟合及其Matlab实现
- Matlab直线最小二乘拟合实现
- OpenCV2马拉松第25圈——直线拟合与RANSAC算法
- ransac平面拟合
- 格式化信息窗口内容—ArcGIS API for JavaScript
- JDK中常见的线程池类型
- 关于C++多态问题的整理
- selenium————多窗口切换
- MySQL数据库的逻辑备份和物理备份
- matlab直线拟合RANSAC初探
- 微信小程序--(5-1)点击列表item,把item上面显示的所有数据,传递到另外一个页面
- Velocity入门
- caffe make问题
- Angular2笔记(三)--服务与依赖注入
- bosten key party 2017 signed shell server writeup
- UVA11093JustFinishItUp
- extern "C"
- 统计目录下的文件数