SIFT演算法提取關鍵點

2021-07-11 15:12:20 字數 2823 閱讀 6260

這裡只是用了一層影象

原理框圖:

而為了簡化計算,我們不直接求二維的高斯卷積核,而是將它變成兩個一維的卷積核,原理如下圖

1. 構建影象尺度空間(影象的高斯金字塔)

所謂高斯金字塔,是指假設乙個金字塔型的結構,金字塔的第一層為原影象,然後將影象做一次高斯平滑(高斯卷積或者高斯模糊),而在高斯平滑裡有乙個引數σ,然後將σ乘以乙個係數k之後得到的值作為新的平滑因子來平滑第二層作為第三層,重複多次,我們就可以得到一組高斯金字塔,而在本次實驗中,我們只做到了第三層,即只對原圖做了兩次高斯平滑處理。

2. 獲得dog(difference of gaussian)金字塔

dog是指高斯差分,是從高斯金字塔構造出來的。它的第一層是有高斯金字塔的第二層減去第一層,第二層是由高斯金字塔的第三層減去第二層,如此類推。

3. 定位極值點

由於關鍵點是由dog空間的區域性極值點組成的。所以為了定位極值點,我們需要將每乙個畫素點和它所有的相鄰畫素點進行比較,看它是否比相鄰畫素點大或者小。這裡我們使用每個畫素和它的八鄰域作比較,如果該畫素是該區域內最大並且大於一定閥值的話,則為極大值點,相同地,如果該畫素是該區域最小並且小於一定閥值時,則視為極小值點。

**如下:

clear all

close all

% 讀取

i = imread('tennis.png');

% 將轉為灰度圖

f = rgb2gray(i);

subplot(221):imshow(f):title('原圖');

% 分別求出高斯尺度變換

gx_k = fspecial('gaussian',[5

1],0.8*sqrt(2))

gx = fspecial('gaussian',[5

1],0.8);

% 求在x方向的高斯卷積核

dog_x = conv2(gx,f) - conv2(gx_k,f);

subplot(222):imshow(dog_x):title('dog x'); % dog_x

% 分別求出高斯尺度變換

gy_k = fspecial('gaussian',[1

5],0.8*sqrt(2));

gy = fspecial('gaussian',[1

5],0.8);

% % 求xy方向的高斯卷積核,得到f的dog圖

dog_xy = conv2(gy,dog_x) - conv2(gy_k,dog_x);

subplot(223):imshow(dog_xy):title('dog xy'); % dog_xy

% 定位極值點,0.15為閾值

[m n] = size(dog_xy);

extream = zeros(m,n);

fori = 1:m;

forj = 1:n;

ifi==1||j==1||i==m||j==n

ifi==1&&j==1||i==1&&j==n||i==m&&j==1||i==m&&j==m

else

endelse

a = [dog_xy(i-1,j-1),dog_xy(i-1,j),dog_xy(i-1,j+1),dog_xy(i,j-1),dog_xy(i,j),dog_xy(i,j+1),dog_xy(i+1,j-1),dog_xy(i+1,j),dog_xy(i+1,j+1)];

end% 極大值點

if dog_xy(i,j) == max(a) && dog_xy(i,j)>=0.15

extream(i,j) = 1;

end% 極小值點

if dog_xy(i,j) == min(a) && dog_xy(i,j)<=-0.15

extream(i,j) = -1;

endendend

% 顯示極值點

subplot(224):imshow(i):title('extream points');

hold on;

[a b] = size(extream);

fori = 2:a-1

forj = 2:b-1

if extream(i,j) == 1

line('xdata',[j-1,j+1],'ydata',[i-1,i-1],'color','red');

line('xdata',[j-1,j+1],'ydata',[i+1,i+1],'color','red');

line('xdata',[j-1,j-1],'ydata',[i-1,i+1],'color','red');

line('xdata',[j+1,j+1],'ydata',[i-1,i+1],'color','red');

endif extream(i,j) == -1

line('xdata',[j-1,j+1],'ydata',[i-1,i-1],'color','green');

line('xdata',[j-1,j+1],'ydata',[i+1,i+1],'color','green');

line('xdata',[j-1,j-1],'ydata',[i-1,i+1],'color','green');

line('xdata',[j+1,j+1],'ydata',[i-1,i+1],'color','green');

endendend

Sift特徵提取演算法

2004 年d.lowe 提出了乙個新的演算法 尺度不變特徵變換 sift 這個演算法可以幫助我們提取影象中的關鍵點並計算它們的描述符。sift演算法的特點就是,對於區域性特徵對旋轉 縮放 亮度變化保持不變。sift 演算法主要內容如下 1 尺度空間的極值檢測 2 特徵點定位 3 特徵方向賦值 4 ...

PCL NARF關鍵點提取

關鍵點 區域性特徵描述子 關鍵點描述子 加快識別 追蹤。narf 法向對齊徑向特徵 步驟 遍歷深度影象點,有深度突變位置進行邊緣提取 測度表面變化的係數以及變化的主方向 主方向計算興趣值 對興趣值進行平滑 無最大值壓縮,獲得關鍵點。1 建立rangeimageborderextractor物件,用來...

SIFT特徵提取

原文獻 1 lowe d g.distinctive image features from scale invariant keypoints c international journal of computer vision.2004 91 110.不錯的部落格 2 sift可以用來提取區域性...