clear all;
clc;
%ingrese imagen en escala de grises sino ejecutar imagen = rgb2gray(imagen);
imagen = imread ('219090.jpg');imagen2 = imread ('219090.jpg')
%imagen = imread ('lena.jpg');imagen = rgb2gray(imagen);imagen2 = imread ('lena.jpg');imagen2 = rgb2gray(imagen);
%imagen = imread ('blocks_gray.jpg');imagen2 = imread ('blocks_gray.jpg');
%imagen = imread ('open_shapes.png');imagen2 = imread ('open_shapes.png');
%imagen = imread ('eight.png');imagen2 = imread ('eight.png')
%Muetra la imagen original
figure, imshow(imagen);
title('Imagen original');
imagen = double (imagen);
%valor para la umbralizaci�n
umbral_bajo = 0.075;
umbral_alto = 0.175;
%coeficiente del filtro gaussiano
B = [2, 4, 5, 4, 2; 4, 9, 12, 9, 4; 5, 12, 15, 12, 5; 4, 9, 12, 9, 4; 2, 4, 5, 4, 2 ];
B = 1/159.* B;
%Convolucion de la imagen por el coficiente gaussiano
A=conv2(imagen, B, 'same');
%filtro para la direccion horizontal X y vertical Y
GradienteX = [-1, 0, 1; -2, 0, 2; -1, 0, 1];
GradienteY = [1, 2, 1; 0, 0, 0; -1, -2, -1];
%Convolucion de la imagen en direccion horizontal y vertical del filtro
filtradoEnX = conv2(A,GradienteX , 'same');
filtradoEnY = conv2(A, GradienteY , 'same');
%calcular la direccion y orientacion con atan2 cuadrantes de la tangente inversa
direcciones = atan2 (filtradoEnY, filtradoEnX);
direcciones = direcciones*180/pi;
%Muetra la gradiante de CANNY en direccion X
pan=size(A,1);
leb=size(A,2);
figure, imshow(filtradoEnX);
title('Gradiente en direccion X');
%Muetra la gradiante de CANNY en direccion Y
figure, imshow(filtradoEnY);
title('Gradiente en direccion Y');
% ajuses para colocar todas las direcciones positivas y eliminar negativos
for i=1:pan
for j=1:leb
if (direcciones(i,j)<0)
direcciones(i,j)=360+direcciones(i,j);
end;
end;
end;
%Ajuste de las direcciones cercana de 0 , 45, 90 , o 135 grados
for i = 1 : pan
for j = 1 : leb
if ((direcciones(i, j) >= 0 ) && (direcciones(i, j) < 22.5) || (direcciones(i, j) >= 157.5) && (direcciones(i, j) < 202.5) || (direcciones(i, j) >= 337.5) && (direcciones(i, j) <= 360))
arah2(i, j) = 0;
elseif ((direcciones(i, j) >= 22.5) && (direcciones(i, j) < 67.5) || (direcciones(i, j) >= 202.5) && (direcciones(i, j) < 247.5))
arah2(i, j) = 45;
elseif ((direcciones(i, j) >= 67.5 && direcciones(i, j) < 112.5) || (direcciones(i, j) >= 247.5 && direcciones(i, j) < 292.5))
arah2(i, j) = 90;
elseif ((direcciones(i, j) >= 112.5 && direcciones(i, j) < 157.5) || (direcciones(i, j) >= 292.5 && direcciones(i, j) < 337.5))
arah2(i, j) = 135;
end;
end;
end;
%Muestra la direcion de la gradiente Canny.
figure, imagesc(arah2);
title('Direccion de la gradiente');
%Calcula y muestra la magnitud de la gradiente Canny
magnitudGradienteI= sqrt((filtradoEnX.^2) + (filtradoEnY.^2));
imagenBinaria = zeros (pan, leb);
figure, imagesc(magnitudGradienteI);
title('Magnitud de la gradiente');
%Sin Maximum Supression
for i=2:pan-1
for j=2:leb-1
if (arah2(i,j)==0)
imagenBinaria(i,j) = (magnitudGradienteI(i,j) == max([magnitudGradienteI(i,j),magnitudGradienteI(i,j+1),magnitudGradienteI(i,j-1)]));
elseif (arah2(i,j)==45)
imagenBinaria(i,j) = (magnitudGradienteI(i,j) == max([magnitudGradienteI(i,j),magnitudGradienteI(i+1,j-1),magnitudGradienteI(i-1,j+1)]));
elseif (arah2(i,j)==90)
imagenBinaria(i,j) = (magnitudGradienteI(i,j) == max([magnitudGradienteI(i,j),magnitudGradienteI(i+1,j) magnitudGradienteI(i-1,j)]));
elseif (arah2(i,j)==135)
imagenBinaria(i,j) = (magnitudGradienteI(i,j) == max([magnitudGradienteI(i,j),magnitudGradienteI(i+1,j+1),magnitudGradienteI(i-1,j-1)]));
end;
end;
end;
%Muestra los bordes sin supression maxima
imagenBinaria = imagenBinaria.*magnitudGradienteI;
figure, imshow(imagenBinaria);
title('Sin supression maxima');
%umbralizacion por histeresis
umbral_bajo = umbral_bajo * max(max(imagenBinaria));
umbral_alto = umbral_alto * max(max(imagenBinaria));
%Muestra el umbral resultante.
umbral_resultante = zeros (pan, leb);
for i = 1 : pan
for j = 1 : leb
if (imagenBinaria(i, j) < umbral_bajo)
umbral_resultante(i, j) = 0;
elseif (imagenBinaria(i, j) > umbral_alto)
umbral_resultante(i, j) = 1;
%usando componentes conectados #8
elseif ( imagenBinaria(i+1,j)>umbral_alto || imagenBinaria(i-1,j)>umbral_alto || imagenBinaria(i,j+1)>umbral_alto || imagenBinaria(i,j-1)>umbral_alto || imagenBinaria(i-1, j-1)>umbral_alto || imagenBinaria(i-1, j+1)>umbral_alto || imagenBinaria(i+1, j+1)>umbral_alto || imagenBinaria(i+1, j-1)>umbral_alto)
umbral_resultante(i,j) = 1;
end;
end;
end;
%muestra los bordes de Canny.
bordesPorCanny = uint8(umbral_resultante.*255);
figure, imshow(bordesPorCanny);
title('Bordes de Canny');
%deteccion de bordes de Canny
figure;
subplot(2,2,1)
imshow(imagen2)
title('Imagen original');
subplot(2,2,2)
imshow(bordesPorCanny)
title('Bordes Canny');
subplot(2,2,3)
imshow(imagenBinaria)
title('Sin supression maxima');
subplot(2,2,4)
imagesc(arah2)
title('Direccion de la Gradiente');