ransac在影象拼接中有所使用,有時候也在影象理解的相關演算法中有所使用。
演算法簡介如下(摘自《影象處理、分析與機器視覺(第3版)》):
1.假設我們要將n個資料點x=擬合為乙個由至少m個點決定的模型(m<=n,對於直線,m=2)。(我這裡實際是兩個不同均值、協方差高斯分布產生的資料)
2.設迭代計數k=1。
3.從x中隨機選取m個項並擬合乙個模型。(我這裡直線擬合,選了2個項)
4.給定偏差ε,計算x中相對於模型的殘差在偏差ε的個數,如果元素個數大於乙個閾值t,根據一致點集重新擬合模型(可以利用最小二乘或其變種),演算法終止。(我這裡的偏差為1,閾值為資料個數的2/3)
5.設k=k+1,如果k小於乙個事先給定的k,跳至第3步,否則採用具有迄今最大的一致點集模型,或演算法失敗。
執行效果如下,紅圈是所有的資料,藍叉是符合擬合模型的資料。
matlab**如下:
main.m
close all;clear all;clc;mytls.m(已知兩點求直線)%真實的資料
mu=[0
0]; %均值
s=[1
2.5;2.5
8]; %協方差
data1=mvnrnd(mu,s,200
); %產生200個高斯分布資料
%雜訊資料
mu=[22];
s=[8
0;08
];data2=mvnrnd(mu,s,100
); %產生100個雜訊資料
data=[data1;data2];
plot(data(:,
1),data(:,2),'ro'
); %顯示全部資料
k=100
; %設定最大迭代次數
sigma=1
; %設定擬合直線與資料距離的偏差
pretotal=0
; %符合擬合模型的資料的個數
k=1;
while pretotal < size(data,1)*2/3 && k3
的資料符合擬合模型或達到最大迭代次數就可以退出了
sampindex=floor(1+(size(data,1)-1)*rand(2,1
)); %產生兩個隨機索引,找樣本用,floor向下取整
samp1=data(sampindex(1
),:); %對原資料隨機抽樣兩個樣本
samp2=data(sampindex(2
),:);
line=mytls([samp1;samp2]); %對兩個資料擬合出直線,或其他變種擬合方法
mask=abs(line*[data ones(size(data,1),1)]'
); %求每個資料到擬合直線的距離
total=sum(mask
if total>pretotal %找到符合擬合直線資料最多的擬合直線
pretotal=total;
bestline=line; %找到最好的擬合直線
endk=k+1
;end
%顯示符合最佳擬合的資料
mask=abs(bestline*[data ones(size(data,1),1)]'
)hold on;
for i=1
:length(mask)
ifmask(i)
plot(data(i,
1),data(i,2),'+'
);
endend
%這裡是解如下三個方程的方程組更詳盡的介紹見下面的網頁:%a*x1+b*y1+c=0
%a*x2+b*y2+c=0
%a^2+b^2=1
%返回係數[a b c]
function line=mytls(data)
x = data(1
, :);
y = data(2
, :);
k=(y(1)-y(2))/(x(1)-x(2
)); %直線斜率,有些情況肯定需要個別判斷,這裡忽略了
a=sqrt(1-1/(1+k^2
)); b=sqrt(1-a^2
);
if k>0
%如果斜率大於0,a,b異號
b=-b;
endc=-a*x(1)-b*y(1
); line=[a b c];
end
1.2.
matlab練習程式(隨機抽樣一致RANSAC)
ransac在影象拼接中有所使用,有時候也在影象理解的相關演算法中有所使用。演算法簡介如下 摘自 影象處理 分析與機器視覺 第3版 1.假設我們要將n個資料點x 擬合為乙個由至少m個點決定的模型 m n,對於直線,m 2 我這裡實際是兩個不同均值 協方差高斯分布產生的資料 2.設迭代計數k 1。3....
mR 隨機抽樣
1.問題由來 google曾經有一道非常經典的面試題 給你乙個長度為n的鍊錶。n很大,但你不知道n有多大。你的任務是從這n個元素中隨機取出k個元素。你只能遍歷這個鍊錶一次。你的演算法必須保證取出的元素恰好有k個,且它們是完全隨機的 出現概率均等 這道題的解法非常多,網上討論也非常熱烈。本文要討論的是...
MySQL隨機抽樣
最近由於需要大概研究了一下mysql的隨機抽取實現方法。舉個例子,要從tablename表中隨機提取一條記錄,大家一般的寫法就是 select from tablename order by rand limit 1。但是,後來我查了一下mysql的官方手冊,裡面針對rand 的提示大概意思就是,在...