function Icontornos=contornosD2(I,sigma)
% CONTORNOSD2 Detecta contornos en imag. de niv. de gris empleando 2a deriv            
% Se buscan los pasos por cero                                                    

%______________________________________________________________________%
%                                                                      %
% NOMBRE DEL FICHERO:   Icontornos = contornosD2(I,sigma)              %
%                                                                      %
% RECIBE: Imagen de niveles de gris y un umbral                        %
% DEVUELVE:  La misma imagen con los pixels de contorno en blanco      %
% ALGORITMO EMPLEADO: Tecnica basada en segunda derivada               %
% VARIABLES:   Ient = imagen introducida                               %
%              Icontornos = imagen de contornos resultante.Binaria     %
%                      Fondo negro y contornos en blanco               %
%              sigma: intensidad suavizado. Cuanto más alto menos cont %
%              F = Imagen de entrada filtrada con LoG                  %
% LIBRO: VISION ARTIFICIAL INDUSTRIAL. UNIVERSIDAD DE VALLADOLID 2012  %   
% TEMA 7 LA IMAGEN DIGITAL pág.147 
% AUTORES: Eusebio de la Fuente y Félix Miguel Trespaderne             %
%______________________________________________________________________%
%  Ejemplo de ejecucion:                                               %
% >> I=imread('cameraman.tif');                                      %
% >> Icont = contornosD2(I,1.5);
% >> imshow(Icont); 
%______________________________________________________________________%
% Con funciones de matlab
% >>I=imread('cameraman.tif');
% >>C=edge(I,'log');
% >>imshow(C);
%______________________________________________________________________%

[filas,columnas]=size(I);

Id=im2double(I);
Icontornos=zeros(filas,columnas);

fsize = ceil(sigma*3) * 2 + 1;  % choose an odd fsize > 6*sigma;

LoG=fspecial('log',fsize,sigma);

F=imfilter(Id,LoG);
K=mat2gray(F);
%Si queremos mostrar la img LoG figure,imshow(F,[]);

absF=abs(F);
umbral=.1*max(absF(:));

for i=fsize:filas-fsize-1
    for j=fsize:columnas-fsize-1
        %cambios de signo horizontal
        if(sign(F(i,j))*sign(F(i+1,j))~=1 && abs(F(i,j)-F(i+1,j))>umbral)
            Icontornos(i,j)=1.0; 
        %cambios de signo verticales
        elseif(sign(F(i,j))*sign(F(i,j+1))~=1 && abs(F(i,j)-F(i,j+1))>umbral) 
            Icontornos(i,j)=1.0;
        end
    end
end


