No BSD License  

Highlights from
Simple Particle Tracking

from Simple Particle Tracking by Martin Pastor
Detection of bright spots into a sequence of images and track its trajectory

param_detect_spot_original(nfiles,s_raiz,umbral_1,umbral_2,area_1,area_2,caja,elipse)
function param_detect_spot_original(nfiles,s_raiz,umbral_1,umbral_2,area_1,area_2,caja,elipse)

% Este programa busca los centroides los puntos brillantes en una imagen.
% Esta hecho de tal manera que puede buscar los centroides de una secuencia
% de imagenes.

% nfiles: nmero de archivos a mostrar
% s_raiz: nombre base del archivo (cuidado, 'nombre_base')
% umbral_1: minimo en la escala de grises
% umbral_2: mximo en la escala de grises
% area_1: rea mnima
% area_2= rea mxima (para no ejecutar el criterio de reas, area_1 y area_2 ambos cero)
% caja= proporcin entre anchura y altura de los spots (para no hacer cero)
% elipse= excentricidad (para no hacer 1).

% OJO!! Asegurate del tamao de la imagen (n_rows n_columns) 

close all
set(0,'defaulttextinterpreter','none');

dir_0='C:\programas\';           % origen del programa
dir_1='C:\origen_imagenes\';     %origen de la imagenes

formato='.tif';
n_number=6;             % numero de dgitos que diferencian cada imagen
num=8;                  % agrupa a primeros y segundos vecinos (4 slo a primeros)

for n=1:nfiles,
    
    n_zeros=n_number-length(num2str(n));    %se elige el numero de ceros del nombre
    cero='0';
    while (length(cero)<n_zeros),
        cero=strcat(cero,'0');
    end
    s=strcat(s_raiz,cero,num2str(n),formato);
    
    A=imread(strcat(dir_1,s));A=A(:,:,1);                            % se lee el archivo de imagen
    
    tam=size(A);
    n_rows=tam(1);
    n_columns=tam(2);
    
    I=zeros(n_rows,n_columns);              % se binariza de acuerdo a dos umbrales
    cambiar=find(([A]>=umbral_1)&([A]<=umbral_2));
    I(cambiar)=1;
    I=imfill(I,'holes');                    % relleno huecos
    
    [labeled,numObjects] = bwlabel(I,num);    % busquedad de cluster: etiquetado y propiedades
    balldata = regionprops(labeled,'Area');
    
    % criterio de areas
    
    if ((area_1~=0) | (area_2~=0))  % si se elige criterio de area se ejecuta este paso
        
        selected = find(([balldata.Area]>=area_1)&([balldata.Area]<=area_2));   % eleccion de cluster de acuerdo al area
        I = ismember(labeled,selected);        
        
    end

    [labeled,numObjects] = bwlabel(I,num);    % busquedad de cluster: etiquetado y propiedades
    balldata = regionprops(labeled,'Eccentricity');

    % criterio de excentricidad
    
    if (elipse~=1)  % si se elige criterio de area se ejecuta este paso
        
        selected = find([balldata.Eccentricity]<=elipse);   % eleccion de cluster de acuerdo a la excentricidad
        I = ismember(labeled,selected);
        
    end
        
    
    [labeled,numObjects] = bwlabel(I,num);    % busquedad de cluster: etiquetado y propiedades
    balldata = regionprops(labeled,'Centroid','Area','BoundingBox','Eccentricity');
    
    
    
    if (~isempty(balldata))     % sin hay algn punto
    
        %centroides

        centroids= [balldata.Centroid];
        if (~isempty(centroids))
            x=centroids(1:2:end-1);
            y=centroids(2:2:end);
        end

        % area

        area=[balldata.Area];

        % rectangulo

        BB= [balldata.BoundingBox];
        if (~isempty(BB))
            x_BB=BB(1:4:end-3);
            y_BB=BB(2:4:end-2);
            ancho_BB=BB(3:4:end-1);
            alto_BB=BB(4:4:end);
        end

        % excentricidad

        excentricidad=[balldata.Eccentricity];

        data_act=[n*ones(length(balldata),1) x' y' area' x_BB' y_BB' ancho_BB' alto_BB' excentricidad'];

        % criterio de rectangulo

        if (caja~=0)  % si se elige criterio de area se ejecuta este paso

            selected = find(((ancho_BB./alto_BB)>=caja)|((alto_BB./ancho_BB)>=caja));   % eleccion de cluster de acuerdo al area
            if (~isempty(selected))            % el formato de datos es x e y en una misma columna
                data_act(selected,:)=[];
            end

        end
    
    else
        
        data_act=[];
    end 
    
    subplot(1,2,1)
    imshow(A);
    hold on;
    
    if(~isempty(data_act))
        plot(data_act(:,2),data_act(:,3),'or','MarkerSize',2)
    end
    
    hold off;
    title(strcat('Image: ',s));
    subplot(1,2,2)
    imshow(I);
    title(strcat('AreaScale: ',num2str(area_1),'-',num2str(area_2)));
    xlabel(strcat('Proportion: ',num2str(caja),';  Eccentricity: ',num2str(elipse)));
    pause(2);
        
    clear x y area x_BB y_BB ancho_BB alto_BB ex;
    clear data_act;
    
end

cd (dir_0)

Contact us at files@mathworks.com