SIFT演算法MATLAB實現----尺度空間構造
阿新 • • 發佈:2019-01-07
和大家一樣,初學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)因為放大一倍,所以σ=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.獲得關鍵點(待續)