在對資料進行建模時,我們往往會遇到資料中存在異常資料(outlier,一般稱為外點)的情況,如圖,用一條直線擬合圖中的點,其中左下和右上的點明顯是外點。
此時使用最小二乘法,則會由於外點的存在偏離正確模型較多,如下圖,因此我們需要找出並剔除這些外點,從而得到乙個較好的模型。
ransac(random sample consensus)基本思想是通過多次隨機抽取部分資料進行模型估計,然後使用全部資料評估這些模型的正確性並進行比較,得出最好的模型。具體步驟如下。
隨機抽取資料集中的一些樣本 si
,估計乙個模型 mi
。通過一定標準檢驗能較好的符合模型mi
的資料集s′
i ,稱為內點(inliner)。若s
ize(
si)>
n ,n為人為設定的閾值,則演算法結束,得到模型m
否則重新進行步驟1~3.若一定重複次數後演算法依然沒結束,則選取內點數目最多的模型。
使用得到模型的內點再次計算更優的模型m′
使用ransac演算法得到的擬合直線如下
ransac進行直線擬合的**如下:
ransac.hpp
#include
#include
class ransacmodelestimator
; cv::mat run(std::vector
point_set);
int iterate(std::vector
& mask);
void estimateparm(std::vector
& initial_point);
void estimateinliners(std::vector
& mask);
cv::mat estimateparm1(std::vector
& initial_point);
double estimatedeparture(cv::point3d& p);
private:
std::vector
point_set;
cv::point3d theta;
std::vector
rand_index;
};
ransac.cpp
#include "ransac.hpp"
#include
#include
using
namespace
std;
using
namespace cv;
double ransacmodelestimator::estimatedeparture(point3d& p)
void ransacmodelestimator::estimateinliners(vector
& mask)
}void ransacmodelestimator::estimateparm(vector
& initial_point)
mat ransacmodelestimator::estimateparm1(vector
& inliner_point)
mat tconstrains;
mat result;
cv::svd::solvez(constrains, result);
return result;
}int ransacmodelestimator::iterate(vector
& mask)
estimateparm(initial_point);
estimateinliners(mask);
return mask.size();
}mat ransacmodelestimator::run(vector
point_set_)
}vector
inliners;
for (size_t i = 0; i < optimal_inliner_num; i++)
return estimateparm1(inliners);
}int main()
,,,,,,,, });
std::cout
<< result << endl;
return
0;}
RANSAC演算法應用
在對資料進行建模時,我們往往會遇到資料中存在異常資料 outlier,一般稱為外點 的情況,如圖,用一條直線擬合圖中的點,其中左下和右上的點明顯是外點。此時使用最小二乘法,則會由於外點的存在偏離正確模型較多,如下圖,因此我們需要找出並剔除這些外點,從而得到乙個較好的模型。ransac random ...
RANSAC演算法理解與應用
ransac核心思想就是隨機性和假設性,隨機性用於減少計算,迴圈次數是利用正確資料出現的概率。而假設性,就是說隨機抽出來的資料都認為是正確的,並以此去計算其他點,獲得其他滿足變換關係的點,然後利用投票機制,選出獲票最多的那乙個變換。具體的流程 1 在可以有 也可以沒有,主要看應用場景 條件限制 比如...
RANSAC演算法詳解
另參考 給定兩個點p1與p2的座標,確定這兩點所構成的直線,要求對於輸入的任意點p3,都可以判斷它是否在該直線上。初中解析幾何知識告訴我們,判斷乙個點在直線上,只需其與直線上任意兩點點斜率都相同即可。實際操作當中,往往會先根據已知的兩點算出直線的表示式 點斜式 截距式等等 然後通過向量計算即可方便地...