1. 程式人生 > >Sift描述子的實現

Sift描述子的實現

%E:\matlabworkplace\headpose_with_block\feature\sift
clearvars;close all;
% prepare data
imgPath='E:\data\lfw\imgs\Aaron_Eckhart\Aaron_Eckhart_0001.jpg';
img=imread(imgPath);
img=rgb2gray(img);
bbox=[63 72 126+63 126+72];%box.x box.y box.x2 box.y2
landmark=[34 35; 53 38; 41 86; 75 90; 58 93; 59 87 ;72 40
;94 43; 48 70; 72 72]
;%相對於box.x box.y nlandmark=size(landmark,1); isShow=false; for i=1:nlandmark landmark(i,1)=landmark(i,1)+bbox(1); landmark(i,2)=landmark(i,2)+bbox(2); end figure(1); imshow(img); hold on; %% sigma調節的引數 sigma=1.0; sigma2=ones(1,10).*sigma; ori=zeros(1,10); f2=[]; for i=1:nlandmark plot(landmark(i
,1),landmark(i,2),'.r','markersize',15); f2_t=[landmark(i,1);landmark(i,2);sigma2(i);ori(i)]; f2=[f2 f2_t]; end %% sift_descriptor tic; [d1,ori]=sift_descriptor(img,landmark,sigma,0); time1=toc; d1=d1'; f1=[]; for i=1:nlandmark f1_t=[landmark(i,1);landmark(i,2);sigma;ori(i)]; f1=[f1 f1_t ]
; end hold on; h1=vl_plotframe(f1(:,1:end)); h2=vl_plotframe(f1(:,1:end)); set(h1,'color','k','linewidth',3); set(h2,'color','y','linewidth',2); h3 = vl_plotsiftdescriptor(d1(:,1:end),f1(:,1:end)) ; set(h3,'color','g') ; disp(['sift_descriptor計算描述子的時間為 :' num2str(time1)]); %% vl_sift tic; img=single(img); [f2,d2]=vl_sift(img,'frames',f2,'orientations','FloatDescriptors'); time2=toc; disp(['vl_sift計算描述子的時間為 :' num2str(time2)]); saveas(gcf,'sift_descriptor.png');

sift_descriptor計算描述子的時間為 :0.0017716
vl_sift計算描述子的時間為 :0.083869

尺度為1.0的情況:
這裡寫圖片描述

尺度為1.6的情況:
這裡寫圖片描述

尺度為2.4的情況:
這裡寫圖片描述

我們可以看到主方向大體上沿著其明顯紋理的邊緣方向。