RANSAC算法全稱是隨機抽樣一致算法(random sample consensus,RANSAC),RANSAC算法的基本假設是樣本中包含正確數據(inliers,可以被模型描述的數據),也包含異常數據(outliers,偏離正常範圍很遠、無法適應數學模型的數據),即數據集中含有噪聲。這些異常數據可能是由於錯誤的測量、錯誤的假設、錯誤的計算等產生的。同時RANSAC也假設,給定一組正確的數據,存在可以計算出符合這些數據的模型參數的方法。數據分兩種:有效數據(inliers)和無效數據(outliers)。偏差不大的數據稱爲有效數據,偏差大的數據是無效數據。如果有效數據佔大多數,無效數據只是少量時,我們可以通過最小二乘法或類似的方法來確定模型的參數和誤差;如果無效數據很多(比如超過了50%的數據都是無效數據),最小二乘法就失效了,我們需要新的算法。
如果一組二位的數據點含有許多噪聲點,直接採用最小二乘法求出的數學模型不夠準確。而比較好的方法就是用RANSAC算法剔除那些噪聲點,獲得最大的支持數據集合,再用最大支持數據通過最小二乘求出最佳數學模型。
首先如果沒有使用RANSAC算法,通過最小二乘法模擬出的數學模型如下圖所示,其中的二位數據是我們隨機生成的包含噪聲點的數據集合。
可以看出,上半部分是誤差較大的點,而通過最小二乘擬合的直線將噪聲點也考慮進去,得到的不是最佳數學模
型。
現在我們採用RANSAC算法剔除一些噪聲點後,在進行最小二乘擬合得到的圖如下所示。
其中紅色的直線是未使用RANSAC算法擬合的直線,藍色的直線是使用RANSAC算法擬合的直線。從中可以看出使用RANSAC算法之後的數學模型更佳。
算法:
僞代碼的算法如下所示:
輸入:
Data 一組觀測數據
Model 適應於數據的模型
n 適應於模型的最小數據個數
k 算法的迭代次數
t 用於決定數據是否適應於模型的閾值
d 判定模型是否適用於數據集的數據數目
Best_model 與數據最匹配的模型參數(沒有返回null)
Best_consensus_set 估計出模型的數據點
Best_error 跟數據相關的估計出的模型錯誤
iterations = 0
best_model = null
best_consensus_set = null
best_error = 無窮大
while ( iterations < k )
maybe_inliers = 從數據集中隨機選擇n個點
maybe_model = 適合於maybe_inliers的模型參數
consensus_set = maybe_inliers
for ( 每個數據集中不屬於maybe_inliers的點 )
if ( 如果點適合於maybe_model,且錯誤小於t )
將點添加到consensus_set
if ( consensus_set中的元素數目大於d )
已經找到了好的模型,現在測試該模型到底有多好
better_model = 適合於consensus_set中所有點的模型參數
this_error = better_model究竟如何適合這些點的度量
if ( this_error < best_error )
我們發現了比以前好的模型,保存該模型直到更好的模型出現
best_model = better_model
best_consensus_set = consensus_set
best_error = this_error
增加迭代次數
返回 best_model, best_consensus_set, best_error
這次的模擬實驗是使用matlab實現的,詳細代碼可在此處下載點擊打開鏈接