www.pudn.com > MatlabSIFT.zip > detect_features.m


 
%///////////////////////////////////////////////////////////////////////////////////////////// 
% 
% detect_features - scale space feature detector based upon difference of gaussian filters. 
%                 selects features based upon their maximum response in scale space 
% 
% Usage:  [features,pyr,imp,keys] = detect_features(img, scl, disp_flag, thresh, radius, radius2, radius3, min_sep, edgeratio) 
% 
% Parameters:   
%             
%            img :      original image 
%            scl :      scaling factor between levels of the image pyramid 
%            thresh :   threshold value for maxima search (minimum filter response considered) 
%            radius :   radius for maxima comparison within current scale 
%            radius2:   radius for maxima comparison between neighboring scales 
%            radius3:   radius for edge rejection test 
%            min_sep :  minimum separation for maxima selection. 
%            edgeratio: maximum ratio of eigenvalues of feature curvature for edge rejection. 
%            disp_flag: 1- display each scale level on separate figure.  0 - no display 
% 
% Returns: 
% 
%            features  - matrix with one row for each feature consisting of the following: 
%              [x position,  y position, scale(sub-level), size of feature on image, edge flag,  
%                            edge orientation, curvature of response through scale space ]                               
% 
%            pyr, imp -  filter response and image pyramids 
%            keys - key values generated for each feature by construct_key.m 
% 
% Notes:  
%            recommended parameter values are: 
%            scl = 1.5; thresh = 3;   radius = 4; radius2 = 4; radius3 = 4; min_sep = .04; edgeratio = 5; 
% 
% Author:  
% Scott Ettinger 
% scott.m.ettinger@intel.com 
% 
% May 2002 
%///////////////////////////////////////////////////////////////////////////////////////////// 
 
 
 
function [features,pyr,imp,keys] = detect_features(img, scl, disp_flag, thresh, radius, radius2, radius3, min_sep, edgeratio) 
 
    if ~exist('scl') 
        scl = 1.5; 
    end 
      
    if ~exist('thresh') 
        thresh = 3; 
    end 
     
    if ~exist('radius') 
        radius = 4; 
    end 
     
    if ~exist('radius2') 
        radius2 = 4; 
    end 
 
    if ~exist('radius3') 
        radius3 = 4; 
    end 
     
    if ~exist('min_sep') 
        min_sep = .04; 
    end 
 
    if ~exist('edgeratio') 
        edgeratio = 5; 
    end 
     
    if ~exist('disp_flag') 
        disp_flag = 0; 
    end 
 
 
    if size(img,3) > 1 
        img = rgb2gray(img); 
    end 
     
    % Computation of the maximum number of levels: 
    Lmax = floor(min(log(2*size(img)/12)/log(scl))); 
     
    %build image pyramid and difference of gaussians filter response pyramid 
    [pyr,imp] = build_pyramid(img,Lmax,scl);   
    %get the feature points 
    pts = find_features(pyr,img,scl,thresh,radius,radius2,disp_flag,1); 
 
    %classify points and create sub-pixel and sub-scale adjustments  
    [features,keys] = refine_features(img,pyr,scl,imp,pts,radius3,min_sep,edgeratio);