SIFT特征提取:
角點檢測:
Morvavec角點檢測算子:基於灰度方差的角點檢測方法,該算子計算圖像中某個像素點沿水平、垂直方向上的灰度差異,以確定角點位置
Harris角點檢測算子:不止考察水平,垂直4個方向上的灰度差異,而是考察了所有方向上的灰度差異,並且具有旋轉不變性和部分放射變換的穩定性。
Shi-Tomasi角點檢測算子:通過考察自相關矩陣M的兩個特征值中的較小者來確定角點,大部分情況下,有比Harris更好的檢測效果。
FAST算子:通過考察像素點與其鄰域內16個像素點的差異來確定特征點(角點),並且通過分割測試算法對檢測效率做了極大的提升。
SIFT算子(Scale Invariant Feature Transform):尺度不變特征變換(尺度不變:按比例縮放)
基於尺度空間的,對圖像縮放,旋轉,甚至仿射變換保持不變性的圖像局部特征描述算子。SIFT提取圖像的局部特征,在尺度空間中尋找極值點,並提取出其位置,尺度,方向信息。
算法實質:在不同的尺度空間中查找關鍵點(特征點),計算關鍵點的大小,方向,尺度信息,利用這些這些信息組成關鍵點對特征點進行描述,sift所查找的關鍵點都是十分突出,不會因為光照,仿射和噪聲等因素而變換的穩定的特征點。匹配的過程就是匹配關鍵點(特征點)的過程。流程如下:
參考博客:https://blog.csdn.net/hxg2006/article/details/80398701
Dense-SIFT
圖像識別問題之所以采用密集采樣,是因為密集采樣后的點,會通過訓練后的分類器進行進一步的篩選。在研究目標圖像表示或者理解時,dense sift 更好,因為即使密集采樣的區域不能夠被准確匹配,這塊區域也包含了表達圖像內容的信息。
sif提取特征
輸入:一張圖像,設置的長寬的最大值
每次移動長度的參數
1.圖像轉換為double類型,如果為rgb,先轉成灰度圖像,再轉換為double類型,否則直接轉為double類型
2.讀取圖像的長寬,是否大於輸入的圖像的最大值,如果大於,則按比例縮小圖像
I = imresize(I, maxImSize/max(im_h, im_w), 'bicubic');
[im_h, im_w] = size(I);
3.使用稠密sift提取特征
1)將三維轉換成兩維:i=mean(i,3)
2)歸一化:i=i /max(i(:)) max(i(:))所有點的最大值
3)在0到2π之間截取16段,每一段長度:angle_step = 2 * pi / num_angles
angle_step = 2 * pi / num_angles;
angles = 0:angle_step:2*pi;
angles(num_angles+1) = []; % bin centers
4)生成高斯低通濾波器
f_wid = 4 * ceil(sigma) + 1; % ceil:向上取整
G = fspecial('gaussian', f_wid, sigma);G是5×5大小的矩陣
[GX,GY] = gradient(G);求梯度
GX = GX * 2 ./ sum(sum(abs(GX)));%2與矩陣中對應元素相除
GY = GY * 2 ./ sum(sum(abs(GY)));%得到了GX,GY,分別為5×5的
5)根據濾波器GX,GY,在水平方向和垂直方向對圖像I進行濾波(濾波之后和原來圖像大小相同)
https://blog.csdn.net/sxj0820/article/details/79883233(filter2方法講解)
I_X = filter2(G_X, I, 'same'); % vertical edges
I_Y = filter2(G_Y, I, 'same'); % horizontal edges
計算反正切
I_theta = atan2(I_Y,I_X);
去除I_theta中不是數據的情況 I_theta(find(isnan(I_theta)))=0
6)計算網格:
采樣的圖像塊,64×64
移動16個像素
網格大小27×37
收集的塊個數:999個
grid_x = patch_size/2:grid_spacing:wid-patch_size/2+1;(37)
grid_y = patch_size/2:grid_spacing:hgt-patch_size/2+1;(27)
7)計算方向圖片
計算每一個方向通道
% compute each orientation channel
tmp = (cosI*cos(angles(a))+sinI*sin(angles(a))).^alpha;
tmp = tmp .* (tmp > 0);
% weight by magnitude
I_orientation(:,:,a) = tmp .* I_mag;
% Outputs:
[grid_x,grid_y] = meshgrid(grid_x, grid_y);
[nrows, ncols, cols] = size(sift_arr);
規范化sift描述符
sift_arr = reshape(sift_arr, [nrows*ncols num_angles*num_bins*num_bins]);
sift_arr = normalize_sift(sift_arr);
sift_arr = sift_arr';
大佬對sift算法的解讀
https://blog.csdn.net/molihong28/article/details/89296677
http://www.doc88.com/p-3758093643565.html