Gradient-Plus-Canny

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