隨機一致性取樣ransac是一種魯棒的模型擬合
演算法,能夠從有外點的資料中擬合準確的模型。
它的原理很樸素就是從樣本資料中找到具有一致性的資料,用這些資料去建立樣本的數學模型。這個一致性怎麼理解?我的理解是:如果按照聚類處理方式,一致性資料就是可以歸為一類的資料,他們最相近。俗話說:物以類聚,人以群分。非我族類,其心必異。
演算法的詳細原理及說明在維基上很詳細,不贅述。維基上給的是乙個直線隨機一致性檢測,而且還提供了matlab演示**,這個**有幾步關鍵的地方,由於是採用matlab矩陣快速操作風格寫的有點晦澀,當時我看這個**後還做了些註解,後來維基採用了我的那部分註解。
維基隨機一致性演算法**:
下面是我根據演算法原理利用matlab進行直線的隨機一致性檢測,為了直觀沒用採用matlab矩陣化的一些操作,速度上肯定是不太快的呀:
%%2016/11/12 by dq
clc;
clear ;
close all;
%資料的初始化
m=100;
data=zeros(2,m);
data(1,:)=1:m;
data(2,:)=100+20*rand(1,m);
datalen=length(data);
distthresh=4;
inlierratio=0.3;
mininliernum=round(inlierratio*datalen);
bestpointsnum=0;
maxiteration=200;
iter=0;
x=data(1,:);
y=data(2,:);
%原始散點圖
originalscatterplot=plot(x,y,'*');
grid on;
%matlab 函式polyfit 最小二乘法擬合
p=polyfit(x,y,1);
x1=x;
y1=polyval(p,x);
hold on;
polyfitplot=plot(x1,y1,'b');
%ransac 執行過程,不斷迭代
while iterbestpointsnum)&&(inliernum>=mininliernum)
bestpointsset=zeros(2,datalen);
bestpointsnum=inliernum;
bestpointsset(:,inlierindex)=data(:,inlierindex);
enditer=iter+1;
endbestpointsset(:,bestpointsset(1,:)==0)=;
hold on;
ransacscatterplot=plot(bestpointsset(1,:),bestpointsset(2,:),'ro');
bestparameter = polyfit(bestpointsset(1,:),bestpointsset(2,:),1);
xmin=min(data(1,:));
xmax=max(data(1,:));
x=xmin:0.5:xmax;
%最佳直線方程
y=bestparameter(1)*x+bestparameter(2);
%畫出直線方程
hold on;
ransaclineplot=plot(x,y,'r');
title('ransac find best line fit inlier');
legend([originalscatterplot,polyfitplot,ransacscatterplot,ransaclineplot],'originalscatter','polyfit','ransacscatter','ransacline');
RANSAC 隨機取樣一致性演算法
ransac範例的正式描述如下 首先,要給定 1乙個模型,該模型需要最少n個資料點去例項化它的自由引數 2一組資料點p,p中包含資料點的數量 p 大於n。然後,從p中隨機地選擇n個點 組成p的乙個子集s1 並例項化這個模型 構造成m1 接下來,利用例項化的模型m1去測定p中點的某個子集s1 這些點相...
隨機取樣一致性演算法RANSAC
作用1 點雲分割通過 空間平面 直線 二維或三維圓 圓球 錐體等模型 進行分割。作用2 點雲的配準對的剔除 例子 五個點雲,三個配準,利用ransac可以剔除另外兩個 演算法簡介 從樣本中抽取乙個子集,通過該演算法最小方差對這個樣本計算出這個該模型的引數 例如模型是一條直線,那麼計算該樣本所有的點到...
隨機抽樣一致性演算法(RANSAC)
隨機抽樣一致性演算法 ransac 以下都是個人對於ransac的一些認識,可能有比較大的問題,望大家批評指正。應用的範圍 主要在散點圖中獲得乙個已知模型的引數,使得符合這個模型引數的點最多。散點圖由局內點和局外點之分,當散點在模型上時則是局內點,如果在模型外則為局外點。ransac的目標是找尋乙個...