图像的斑点检测

function [points] = log_Blob(img,o_nb_blobs)
    % 功能:提取LoG斑点
    % 输入:
    %      img –输入的图像
    %       o_nb_blobs -需要检测的斑点区域的数量
    % 输出:
    %       points -检测出的斑点
    % 参考文献:
    % Lindeberg, T. Feature Detection with Automatic Scale Selection
    % IEEE Transactions Pattern Analysis Machine Intelligence, 1998, 30,
    % 77-116
   
    % 输入图像
    img = double(img(:,:,1));
       
    % 设定检测到斑点的数量
    if nargin==1
        nb_blobs = 120;
    else
        nb_blobs = o_nb_blobs;
    end
   
    % 设定LoG参数
    sigma_begin = 2;
    sigma_end   = 15;
    sigma_step  = 1;
    sigma_array = sigma_begin:sigma_step:sigma_end;
    sigma_nb    = numel(sigma_array);
       
    % 变量
    img_height  = size(img,1);
    img_width   = size(img,2);
       
    % 计算尺度规范化高斯拉普拉斯算子
    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
       
    % 搜索局部极值
    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

你可能感兴趣的:(图像处理)