RANSAC演算法詳解

2021-07-22 03:12:05 字數 2561 閱讀 5766

另參考:

給定兩個點p1與p2的座標,確定這兩點所構成的直線,要求對於輸入的任意點p3,都可以判斷它是否在該直線上。初中解析幾何知識告訴我們,判斷乙個點在直線上,只需其與直線上任意兩點點斜率都相同即可。實際操作當中,往往會先根據已知的兩點算出直線的表示式(點斜式、截距式等等),然後通過向量計算即可方便地判斷p3是否在該直線上。 

生產實踐中的資料往往會有一定的偏差。例如我們知道兩個變數x與y之間呈線性關係,y=ax+b,我們想確定引數a與b的具體值。通過實驗,可以得到一組x與y的測試值。雖然理論上兩個未知數的方程只需要兩組值即可確認,但由於系統誤差的原因,任意取兩點算出的a與b的值都不盡相同。我們希望的是,最後計算得出的理論模型與測試值的誤差最小。大學的高等數學課程中,詳細闡述了最小二乘法的思想。通過計算最小均方差關於引數a、b的偏導數為零時的值。事實上,在很多情況下,最小二乘法都是線性回歸的代名詞。

遺憾的是,最小二乘法只適合與誤差較小的情況。試想一下這種情況,假使需要從乙個噪音較大的資料集中提取模型(比方說只有20%的資料時符合模型的)時,最小二乘法就顯得力不從心了。例如下圖,肉眼可以很輕易地看出一條直線(模式),但演算法卻找錯了。 

整個過程可參考下圖: 

c**  

#include 

#include "lineparamestimator.h"

lineparamestimator::lineparamestimator(doubledelta) : m_deltasquared(delta*delta) {}  

voidlineparamestimator::estimate(std::vector&data,   

std::vector<double> ¶meters)  

voidlineparamestimator::leastsquaresestimate(std::vector&data,   

std::vector<double> ¶meters)  

meanx/=datasize;  

meany/=datasize;  

covmat11 -= datasize*meanx*meanx;  

covmat12 -= datasize*meanx*meany;  

covmat22 -= datasize*meany*meany;  

covmat21 = covmat12;  

if(covmat11<1e-12)   

else

parameters.push_back(nx);  

parameters.push_back(ny);  

parameters.push_back(meanx);  

parameters.push_back(meany);  

}boollineparamestimator::agree(std::vector<double> ¶meters, point2d &data)    

ransac尋找匹配的**如下: 

c**  

template<classt,classs>  

doubleransac::compute(std::vector¶meters,   

parameteresitmator*paramestimator ,   

std::vector&data,   

intnumforestimate)  

// 對局內點再次用最小二乘法擬合出模型

paramestimator->leastsquaresestimate(leastsquaresestimatedata,parameters);  

deletearr;  

deletebestvotes;  

deletecurvotes;   

return(double)leastsquaresestimatedata.size()/(double)numdataobjects;  

}  

在模型確定以及最大迭代次數允許的情況下,ransac總是能找到最優解。經過我的實驗,對於包含80%誤差的資料集,ransac的效果遠優於直接的最小二乘法。 

ransac可以用於哪些場景呢?最著名的莫過於的拼接技術

。優於鏡頭的限制,往往需要多張**才能拍下那種巨幅的風景。在多幅影象合成時,事先會在待合成的中提取一些關鍵的特徵點。計算機視覺的研究表明,不同視角下物體往往可以通過乙個透視矩(3x3或2x2)陣的變換而得到。ransac被用於擬合這個模型的引數(矩陣各行列的值),由此便可識別出不同**中的同一物體。可參考下圖: 

RANSAC演算法詳解

另參考 給定兩個點p1與p2的座標,確定這兩點所構成的直線,要求對於輸入的任意點p3,都可以判斷它是否在該直線上。初中解析幾何知識告訴我們,判斷乙個點在直線上,只需其與直線上任意兩點點斜率都相同即可。實際操作當中,往往會先根據已知的兩點算出直線的表示式 點斜式 截距式等等 然後通過向量計算即可方便地...

RANSAC演算法詳解

隨機抽樣一致演算法 random sample consensus,ransac 採用迭代的方式從一組包含離群的被觀測資料中估算出數學模型的引數。資料分兩種 有效資料 inliers 和無效資料 outliers 偏差不大的資料稱為有效資料,偏差大的資料是無效資料。如果有效資料佔大多數,無效資料只是...

RANSAC演算法應用

在對資料進行建模時,我們往往會遇到資料中存在異常資料 outlier,一般稱為外點 的情況,如圖,用一條直線擬合圖中的點,其中左下和右上的點明顯是外點。此時使用最小二乘法,則會由於外點的存在偏離正確模型較多,如下圖,因此我們需要找出並剔除這些外點,從而得到乙個較好的模型。ransac random ...