RANSAC是「RANdom SAmple Consensus(隨機抽樣一致)」的縮寫。它能夠從一組包含「局外點」的觀測數據集中,經過迭代方式估計數學模型的參數。它是一種不肯定的算法——它有必定的機率得出一個合理的結果;爲了提升機率必須提升迭代次數。該算法最先由Fischler和Bolles於1981年提出。核心思想就是隨機性和假設性,隨機性用於減小計算,循環次數是利用正確數據出現的機率。所謂的假設性,就是說隨機抽出來的數據都認爲是正確的,並以此去計算其餘點,得到其餘知足變換關係的點,而後利用投票機制,選出獲票最多的那一個變換。css
RANSAC的基本假設是:
(1)數據由「局內點」組成,例如:數據的分佈能夠用一些模型參數來解釋;
(2)「局外點」是不能適應該模型的數據;
(3)除此以外的數據屬於噪聲。
局外點產生的緣由有:噪聲的極值;錯誤的測量方法;對數據的錯誤假設。html
RANSAC與最小二乘區別:最小二乘法儘可能去適應包括局外點在內的全部點。相反,RANSAC能得出一個僅僅用局內點計算出模型,而且機率還足夠高。可是,RANSAC並不能保證結果必定正確,爲了保證算法有足夠高的合理機率,必須當心的選擇算法的參數(參數配置)。經實驗驗證,對於包含80%偏差的數據集,RANSAC的效果遠優於直接的最小二乘法。算法
驗證思路:RANSAC算法的輸入是一組觀測數據,一個能夠解釋或者適應於觀測數據的參數化模型,一些可信的參數。
RANSAC經過反覆選擇數據中的一組隨機子集來達成目標。被選取的子集被假設爲局內點,並用下述方法進行驗證:
1.有一個模型適應於假設的局內點,即全部的未知參數都能從假設的局內點計算得出。
2.用1中獲得的模型去測試全部的其它數據,若是某個點適用於估計的模型,認爲它也是局內點。
3.若是有足夠多的點被歸類爲假設的局內點,那麼估計的模型就足夠合理。
4.而後,用全部假設的局內點去從新估計模型,由於它僅僅被初始的假設局內點估計過。
5.最後,經過估計局內點與模型的錯誤率來評估模型。
這個過程被重複執行固定的次數,每次產生的模型要麼由於局內點太少而被捨棄,要麼由於比現有的模型更好而被選用。dom
參數選擇:
根據特定的問題和數據集經過實驗來肯定參數 t 和 d。然而參數 k(迭代次數)能夠從理論結果推斷。當估計模型參數時,用 p表示一些迭代過程當中從數據集內隨機選取出的點均爲局內點的機率;此時,結果模型極可能有用,所以 p也表徵了算法產生有用結果的機率。用 w表示每次從數據集中選取一個局內點的機率,以下式所示:
w = 局內點的數目 / 數據集的數目
一般狀況下,咱們事先並不知道w的值,可是能夠給出一些魯棒的值。假設估計模型須要選定n個點,wn是全部n個點均爲局內點的機率;1 − wn是n個點中至少有一個點爲局外點的機率,此時代表咱們從數據集中估計出了一個很差的模型。 (1 − wn)k表示算法永遠都不會選擇到n個點均爲局內點的機率,它和1-p相同。所以,
1 − p = (1 − wn)k
咱們對上式的兩邊取對數,得出
值得注意的是,這個結果假設n個點都是獨立選擇的;也就是說,某個點被選定以後,它可能會被後續的迭代過程重複選定到。這種方法一般都不合理,由此推導出的k值被看做是選取不重複點的上限。例如,要從數據集尋找適合的直線,RANSAC算法一般在每次迭代時選取2個點,計算經過這兩點的直線maybe_model,要求這兩點必須惟一。
爲了獲得更可信的參數,標準誤差或它的乘積能夠被加到k上。k的標準誤差定義爲:
函數
測試代碼:測試
clc;clear all;close all; data = [1.9,0.8,1.1,0.1,-0.1,4.4,4.6,1.6,5.5,3.4;0.7,-1.0,-0.2,-1.2,-0.1,3.4,0.0,0.8,3.7,2.0]; num = 5; iter = 10; threshDist = 1.0; inlierRatio = 0.5; % function [bestParameter1,bestParameter2] = ransac_demo(data,num,iter,threshDist,inlierRatio) %data
: a 2xn dataset with #n data points %num
: the minimum number of points. For line fitting problem, num=2
% iter: the number of iterations
%
threshDist
: the threshold of the distances between points and the fitting line % inlierRatio: the threshold of the numer of inliers %% Plot the data points figure;plot(data(1,:),data(2,:),'o');hold on; % 顯示數據點 number = size(data,2); % Total number of points bestInNum = 0; % Best fitting line with largest number of inliers bestParameter1=0;bestParameter2=0; % parameters for best fitting line for i=1:iter %% Randomly select 2 points idx =randperm
(number,num); sample = data(:,idx); %隨機選取五組數據 %% Compute the distances between all points with the fitting line kLine = sample(:,2)-sample(:,1);%第二點減去第一點
kLineNorm = kLine/norm(kLine);%歐式範數,表示兩點間的距離(向量x的模長),歸一化向量
normVector = [-kLineNorm(2),kLineNorm(1)];%將矩陣A複製m×n塊,複製第一個數據點十份,叉積
distance = normVector*(data - repmat(sample(:,1),1,number));
%% Compute the inliers with distances smaller than the threshold inlierIdx = find(abs(distance)<=threshDist); inlierNum = length(inlierIdx); %% Update the number of inliers and fitting model if better model is found if inlierNum>=round(inlierRatio*number) && inlierNum>bestInNum bestInNum = inlierNum; parameter1 = (sample(2,2)-sample(2,1))/(sample(1,2)-sample(1,1)); parameter2 = sample(2,1)-parameter1*sample(1,1); bestParameter1=parameter1; bestParameter2=parameter2; end end %% Plot the best fitting line xAxis = -number/2:number/2; yAxis = bestParameter1*xAxis + bestParameter2; plot(xAxis,yAxis,'r-','LineWidth',2); title(['bestParameter1 = ',num2str(bestParameter1),'bestParameter2 = ',num2str(bestParameter2)]);
優勢與缺點:
RANSAC的優勢是它能魯棒的估計模型參數。例如,它能從包含大量局外點的數據集中估計出高精度的參數。RANSAC的缺點是它計算參數的迭代次數沒有上限;若是設置迭代次數的上限,獲得的結果可能不是最優的結果,甚至可能獲得錯誤的結果。RANSAC只有必定的機率獲得可信的模型,機率與迭代次數成正比。RANSAC的另外一個缺點是它要求設置跟問題相關的閥值。
RANSAC只能從特定的數據集中估計出一個模型,若是存在兩個(或多個)模型,RANSAC不能找到別的模型。spa
圖像拼接技術應用:.net
因爲鏡頭的限制,每每須要多張照片才能拍下那種巨幅的風景。在多幅圖像合成時,事先會在待合成的圖片中提取一些關鍵的特徵點。計算機視覺的研究代表,不一樣視角下物體每每能夠經過一個透視矩(3X3或2X2)陣的變換而獲得。RANSAC被用於擬合這個模型的參數(矩陣各行列的值),由此即可識別出不一樣照片中的同一物體。(橢圓擬合)code
參考資料:orm
西澳大學MATLAB函數庫:http://www.csse.uwa.edu.au/~pk/Research/MatlabFns/#robust
MATLAB官網:http://cn.mathworks.com/discovery/ransac.html
WiKi維基百科:https://en.wikipedia.org/wiki/RANSAC
參考博客:http://blog.csdn.net/iamsheldon/article/details/8011676