1. 程式人生 > >SIFT演算法MATLAB實現----尺度空間構造

SIFT演算法MATLAB實現----尺度空間構造

       和大家一樣,初學sift演算法時的那種困惑讓人身心疲憊,寢室難安;本著救廣大同胞於水火之中的“大義”,從而產生啦寫這篇文章的想法;哈哈。

文章不免有錯誤,歡迎大家批評指正,共同學習。


正文:

關於特徵點提取,一直是計算機視覺的重要內容;為了匹配影象,把整幅影象與另一幅影象做相關運算,運算量大的驚人,從而人們就產生了一個想法,能不能只匹配少數幾個有代表性的特徵點,從而達到高效匹配的目的;所以從上世紀到今天一直有大量的人員投入到特徵點的提取上來。

前人的工作:

         (1)Harris

檢測子(經典演算法,當代還在使用)用來匹配兩幅沒有尺度差異(或者沒有太大差異)的圖片,比如雙目視覺中的兩個攝像頭裡的影象,就可以視為沒有太大的差異。

      (2)susan檢測子;這個檢測子有點奇怪,本人看的不是很多。

      (3)LOG檢測子,DOG檢測子;這兩個放一塊的原因是後者計算較快,可以逼近前者(稍後再談這個話題);

準備工作      

高斯濾波:

        

高斯濾波:

      如果先用一個σ1=6的高斯核對影象進行濾波,然後再用σ2=8的高斯核進行濾波,所得的影象相當於用

σ=10=(6*6+8*8)^0.5的核進行濾波;


MATLAB實現:

%高斯濾波函式,使用時請放在另外一個檔案中

function y=gauss(x,theta)

%y--濾波後的影象

%x--需濾波的影象

%theta--高斯濾波核;


n=round(6*theta);
if mod(n,2)==0
    n=n+1;
end
h=fspecial('gaussian',[n,n],theta);
y=filter2(h,x);

正文

        %(1)根據lowe理論;為了增加特徵點數量先對影象放大一倍,
%並假設影象已經被攝像機鏡頭濾波一次,濾波因子為0.5(詳見lowe論文)
        %(σ=0.5)因為放大一倍,所以σ=1;
        %(2)要求初始尺度σ=1.6,所以最初的濾波因子為σ=(1.6*1.6-1*1)^0.5

clear;clc; img=imread('f3.jpg');
%將彩色影象灰度化;
if(size(img,3)==3)
gray_img=rgb2gray(img);
else
gray_img=img;    
end
 %1.獲得初始影象,初始theta0=1.6;##########################################
%獲得初始影象
    %將影象放大一倍;
    db_img=imresize(gray_img,2);
    db_img=double(db_img);
    %將影象規範化到(0---1);詳見lowe論文;
    db_img=db_img/255.0;
    %濾波後獲得初始影象;
    theta=(1.6*1.6-1*1)^0.5;
    init_img=gauss(db_img,theta);

    %2.獲得高斯影象金字塔##################################
    %假設每組層數S=3;組數O=4;

    S=3;
    O=4;
    theta0=1.6;
    k=2^(1/S);
    %儲存相對sigma(即層間相對的theta)
    for i=1:S+3
        sig(i)=theta0*(k^(i-1));
    end
    for j=1:O
        if j==1
            gauss_pyr_img{j}{1}=init_img;
        else
            %每層的初始影象為上層的倒數第三張的降取樣,即縮小一倍;
            gauss_pyr_img{j}{1}=imresize(gauss_pyr_img{j-1}{S+1},0.5,'nearest');
        end
        
        for i=2:S+3
            %每層濾波;
            gauss_pyr_img{j}{i}=gauss(gauss_pyr_img{j}{i-1},(sig(i)*sig(i)-sig(i-1)*sig(i-1))^0.5);
        end
    end
   %3.獲得DOG金字####################################################
   for j=1:O
       for i=1:S+2
           dog_pyr_img{j}{i}=gauss_pyr_img{j}{i+1}-gauss_pyr_img{j}{i};
       end
   end
% 4.獲得關鍵點(待續)