matlab練習程式(隨機抽樣一致RANSAC)

2021-07-10 05:22:56 字數 2376 閱讀 8143

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;

%真實的資料

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

mytls.m(已知兩點求直線)

%這裡是解如下三個方程的方程組

%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 的提示大概意思就是,在...