| 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)
|
|