Gradient-Plus-Canny Matlab function
function filtered_image=GplusC(original_image,threshold)
% Dr. Miguel Mora
% GplusC ver 1.0
% Función basada en programa CannyPlusGradient_02.m, realizada para
% detectar bordes con suma de filtros pasa-altos, con la finalidad de
% realizar llenado de huecos o regiones.
%
% Entradas de la función: original_image es una matriz (x,y) o (x,y,3);
% threshold es un valor de umbral entre 0 y 255, donde 0 es un umbral
% saturado y 255 el filtro tiende a Canny, en caso de no meter un valor de
% threshold al iniicio entonces se dará un umbral de 150 por default. SOLO
% FUNCIONA CON VALORES DE UMBRAL, YA QUE EN ESTA VERSIÓN NO SE PUDO VALIDAR
% SIN DATO EN UMBRAL.
%
% Salida de la función: entrega una matriz (x,y) a niveles de gris
% normalizada entre 0 y 1.
%
% NOTA: para funcionar la función, tambien se necesita la función del CIO
% rgb2gris, hacer notar que con la función nativa de Matlab rgb2gray no
% funciona.
%
% Inicio: 03-nov-18
% Fin: 04-nov-18
% Validando matriz de entrada
[Nx,Ny,color]=size(original_image);
if (color==1)
iNG=double(original_image);
fprintf('\nImagen de entrada en niveles de gris: Nx=%d y Ny=%d\n',Nx,Ny);
else
iCOL=double(original_image);
fprintf('\nImagen de entrada a color: Nx=%d, Ny=%d y color=%d\n',Nx,Ny,color);
R=double(iCOL(:,:,1));
G=double(iCOL(:,:,2));
B=double(iCOL(:,:,3));
iNG=rgb2gris(R,G,B); %coloca en niveles de gris
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Convolución por gradiente y sus promedios (Bow,2002,chap.12).
maskN=[1,1,1;1,-2,1;-1,-1,-1];% matriz para gradiente norte
maskS=[-1,-1,-1;1,-2,1;1,1,1];% matriz para gradiente sur
maskE=[-1,1,1;-1,-2,1;-1,1,1];% matriz para gradiente este
maskW=[1,1,-1;1,-2,-1;1,1,-1];% matriz para graidente oeste
Gn=conv2(maskN,iNG);
Gs=conv2(maskS,iNG);
Ge=conv2(maskE,iNG);
Gw=conv2(maskW,iNG);
Gav=(Gn+Gs+Ge+Gw)/4;% promedio de gradientes.
% Validando umbral.
%syms threshold
if isempty(threshold)
threshold=150;
fprintf('\nUmbral por default: Umbral=%d\n',threshold);
else
fprintf('\nUmbral=%d\n',threshold);
end
% Umbralización de los gradientes. Mejor opción que umbralizar el promedio, según programa original.
for i=1:Nx+2
for j=1:Ny+2
if(Gn(i,j)<threshold)
Gn2(i,j)=0;
else
Gn2(i,j)=1;
end
if(Gs(i,j)<threshold)
Gs2(i,j)=0;
else
Gs2(i,j)=1;
end
if(Ge(i,j)<threshold)
Ge2(i,j)=0;
else
Ge2(i,j)=1;
end
if(Gw(i,j)<threshold)
Gw2(i,j)=0;
else
Gw2(i,j)=1;
end
end
end
Gav2=(Gn2+Gs2+Ge2+Gw2)./4;
for i=1:Nx+2
for j=1:Ny+2
if(Gav2(i,j)>0)
BGav2(i,j)=1;
else
BGav2(i,j)=0;
end
end
end
% Suma binarizada entre Canny y el promedio de los gradientes, esto es EDsum=binary(Fc)+binary(BGav).
% Filtro de Canny.
Fc=edge(iNG,'canny');
for i=1:Nx
for j=1:Ny
if ((Fc(i,j)>0)|(BGav2(i,j)>0))
EDsum2(i,j)=1;
else
EDsum2(i,j)=0;
end
end
end
filtered_image=EDsum2;
end
No hay comentarios:
Publicar un comentario