62 lines
1.9 KiB
Matlab
62 lines
1.9 KiB
Matlab
function [points] = kp_log(img,o_nb_blobs)
|
|
% Extract keypoints using Laplacian of Gaussian (LoG) algorithm
|
|
%
|
|
% Author :: Vincent Garcia
|
|
% Date :: 05/12/2007
|
|
%
|
|
% INPUT
|
|
% =====
|
|
% img : the graylevel image
|
|
% o_nb_blobs : (optional) number of blobs detected
|
|
%
|
|
% OUTPUT
|
|
% ======
|
|
% points : the interest points extracted
|
|
%
|
|
% REFERENCES
|
|
% ==========
|
|
% Lindeberg, T. Feature Detection with Automatic Scale Selection
|
|
% IEEE Transactions Pattern Analysis Machine Intelligence, 1998, 30, 77-116kp_harris(im)
|
|
%
|
|
% EXAMPLE
|
|
% =======
|
|
% points = kp_log(img)
|
|
|
|
% input image
|
|
img = double(img(:,:,1));
|
|
|
|
% number of blobs detected
|
|
if nargin==1
|
|
nb_blobs = 120;
|
|
else
|
|
nb_blobs = o_nb_blobs;
|
|
end
|
|
|
|
% Laplacian of Gaussian parameters
|
|
sigma_begin = 2;
|
|
sigma_end = 15;
|
|
sigma_step = 1;
|
|
sigma_array = sigma_begin:sigma_step:sigma_end;
|
|
sigma_nb = numel(sigma_array);
|
|
|
|
% variable
|
|
img_height = size(img,1);
|
|
img_width = size(img,2);
|
|
|
|
% calcul scale-normalized laplacian operator
|
|
snlo = zeros(img_height,img_width,sigma_nb);
|
|
for i=1:sigma_nb
|
|
sigma = sigma_array(i);
|
|
snlo(:,:,i) = sigma*sigma*imfilter(img,fspecial('log', floor(6*sigma+1), sigma),'replicate');
|
|
end
|
|
|
|
% search of local maxima
|
|
snlo_dil = imdilate(snlo,ones(3,3,3));
|
|
blob_candidate_index = find(snlo==snlo_dil);
|
|
blob_candidate_value = snlo(blob_candidate_index);
|
|
[tmp,index] = sort(blob_candidate_value,'descend');
|
|
blob_index = blob_candidate_index( index(1:min(nb_blobs,numel(index))) );
|
|
[lig,col,sca] = ind2sub([img_height,img_width,sigma_nb],blob_index);
|
|
points = [lig,col,3*reshape(sigma_array(sca),[size(lig,1),1])];
|
|
|
|
end |