6. Gradiente (III) % Determina gx y gy function [gx,gy]=gradiente(I) hx=[-1 0;1 0]; hy=hx'; %filtro gx=imfilter(I,hx,'replicate','conv'); gy=imfilter(I,hy,'replicate','conv'); %end % Obtiene la magnitud del gradiente II=abs(gx)+abs(gy); %Obtiene la dirección del gradiente VI=atan(double(gy)/double(gx)); Magnitud del vector gradiente Dirección del vector gradiente
8. Aplicación del Gradiente (II) V=edge(II,'roberts'); T = 33% de max{|Gx|, |Gy|} Aplicación de Umbral
9. Representación del gradiente Referencia del programa MATLAB clear;close all; I=imread('rice.png'); fim=mat2gray(I); %Magnitud del gradiente figure('name','Magnitud del Gradiente'); [gx,gy]=gradiente(fim); imshow(abs(gx)+abs(gy)); %Dibuja gradiente en región [gx,gy]=gradiente(fim); figure('name','Gradiente'); imshow(fim(1:50,1:50),'InitialMagnification','fit'); hold on; quiver(gx(1:50,1:50),gy(1:50,1:50));
15. Máscaras de Prewitt Extensión a máscaras de tamaño 3x3 Píxel a alterar en centro de la vecindad [BW,umbral,gv,gh] = edge(I,'prewitt') >> gh=fspecial('prewitt') >> gv=gh' gh = 1 1 1 0 0 0 -1 -1 -1 gv = 1 0 -1 1 0 -1 1 0 -1 % Se aplican filtros III=imfilter(II,gh); IV=imfilter(II,gv); % Obtiene el gradiente V=abs(III)+abs(IV); Equivalencia
16. Máscaras de Prewitt (II) ¿Magnitud predominante? Diagonal izquierda Diagonal derecha Dirección predominante La equivalente a la magnitud predominante
22. Máscaras de Kirsch (II) % Define máscaras de Kirsch k(:,:,1) = [-3 -3 5; -3 0 5; -3 -3 5]; k(:,:,2) = [-3 5 5; -3 0 5; -3 -3 -3]; for i=3:8 k(:,:,i) = rot90(k(:,:,i-2)); end % Aplica los 8 filtros (x: imagen) for i=1:8 resultado(:,:,i) = imfilter(I,k(:,:,i),‘replicate’); end % Selecciona el máximo de cada filtro II= max(abs(resultado),[],3); %Aplica umbral e=II>.5*max(II(:)); %50% Resultado del filtro II e
28. Comparación entre máscaras Roberts Prewitt Sobel Kirsch Robinson Kirsch Robinson Roberts Prewitt Sobel Líneas verticales -45 o
29. Gradiente basado en derivada de segundo orden Función que define la máscara Segunda derivada en los puntos x +1 e y +1 Segunda derivada en los puntos x e y Operador Laplaciano
30. Gradiente basado en derivada de segundo orden (II) Máscaras equivalentes 0 1 0 1 -4 1 0 1 0 1 1 1 1 -8 1 1 1 1 0 -1 0 -1 4 -1 0 -1 0 -1 -1 -1 -1 8 -1 -1 -1 -1
31. Gradiente basado en derivada de segundo orden (III) Operaciones de imagen filtrada sobre original para mejora de nitidez Si centro de máscara negativo Si centro de máscara positivo Lo anterior equivale a aplicar la siguiente máscara 1 1 1 1 -8 1 1 1 1
32. Primera vs segunda derivada a=[0:1/255:1]; for i=1:400 b(i,1:256)=a(1,:); end aa=zeros(400,72); bb=ones(400,72)*255; ent=[aa b bb];
33. Primera vs segunda derivada (II) Imagen Fila Primera derivada Segunda derivada
34. Primera vs segunda derivada (III) Detectar bordes primera derivada Aplicar umbral de intensidad a la imagen filtrada
35. Primera vs segunda derivada (IV) Detectar bordes segunda derivada Detección de los cruces por cero a la imagen filtrada Cruce por cero
38. Primera vs segunda derivada (VII) Segunda derivada Más susceptible al ruido Menos utilizada para detectar bordes
39.
40.
41. Detección de puntos >> I=imread('discont2.jpg'); >> w=[-1, -1, -1; -1, 8, -1; -1, -1, -1] >> ww=-w >> II=imfilter(I,w); >> III=imfilter(I,ww); w = -1 -1 -1 -1 8 -1 -1 -1 -1 Se aplica el Laplaciano (segunda derivada)
42. Detección de líneas En una dirección específica % Se definen las máscaras w(:,:,1)=[-1, -1, -1; 2, 2, 2; -1, -1, -1]; % 0 o w(:,:,3)=rot90(w(:,:,1)); % 90 o w(:,:,2)=[-1, -1, 2; -1, 2, -1; 2, -1, -1]; % 45 o w(:,:,4)=rot90(w(:,:,2)); % -45 o % Se calcula la media for i=1:4 II(:,:,i) = imfilter(I,w(:,:,i),'symmetric','same'); maxima_intensidad(1,i)=mean2(II(:,:,i)) figure;imshow(II(:,:,i)); end La mayor media indica orientación predominante de las líneas
44. Detección de líneas (III) En cualquier dirección Efecto de doble línea como resultado de aplicar el Laplaciano w=fspecial('laplacian', 0) III=imfilter(II,w));
45. Detección de líneas (IV) En cualquier dirección Solución I: Mantiene la doble línea w=fspecial('laplacian',0) III=imfilter(II,w); IV=abs(III)
46. Detección de líneas (V) En cualquier dirección Solución II: Seleccionar una línea w=fspecial('laplacian', 0) III=imfilter(II,w); V=III>0.23*(max(III(:)));
47. Detección de bordes Aplicación del gradiente Roberts z 1 z 2 Z 3 z 4 z 5 z 6 z 7 Z 8 z 9
48. Detección de bordes (II) Aplicación del gradiente (Prewitt) Sobel z 1 z 2 Z 3 z 4 z 5 z 6 z 7 Z 8 z 9
49. Detección de bordes (III) Combinación de píxeles de diferentes bordes % Filtrado utilizando máscaras de Roberts >> II45 = imfilter(I,[1 0; 0 -1],'symmetric'); >> II45p = imfilter(I,[-1 0; 0 1],'symmetric'); >> II135 = imfilter(I,[0 1;-1 0],'symmetric'); >> II135p = imfilter(I,[0 -1;1 0],'symmetric'); % Combinación de imágenes filtradas >>III=imlincomb(1,II45,1,II45p,1,II135,1,II135p); % Máximo entre gradientes >>grad_hv=abs(II45)+abs(135); >>grad_di=abs(II45p)+abs(II135p); >>IV=max(grad_hv, grad_di); % Máximo entre todos >>V=max(max(abs(II45),abs(135)), max(abs(II135),abs(II135p)));
50. Detección de bordes (IV) III IV V Vp=V>0.53*max(V(:)); IVp=IV>0.65*max(IV(:));
51. Detección de bordes (V) Combinación y selección por umbral % Se define el umbral umbral=0.3; % Se definen las máscaras (Sobel) w(:,:,1)=fspecial('sobel'); w(:,:,3)=rot90(w(:,:,1)); w(:,:,2)=[-2, -1, 0; -1, 0, 1; 0, 1, 2]; w(:,:,4)=rot90(w(:,:,2)); % Se aplica Sobel en las cuatro orientaciones, con umbral for i=1:4 II(:,:,i) = imfilter(double(I),w(:,:,i),'symmetric','same'); II(:,:,i) = II(:,:,i) >= umbral.*max(abs(II(:))); figure;imshow(II(:,:,i)); end % Imagen resultante II=imlincomb(1,II(:,:,1), 1,II(:,:,2), 1,II(:,:,3), 1,II(:,:,4)); figure; imshow(II);
52. Detección de bordes (VI) Resultado de la detección de bordes para diferentes umbrales
62. Método de Canny 1.- Suavizar la imagen con filtro gausiano 2.- Obtener el módulo y dirección del gradiente basado en dos máscaras de Sobel, Prewitt o Roberts Punto de borde: Existe máximo local en dirección del gradiente 3.- Supresión no maximal: Bordes débiles Bordes fuertes 4.- Se incorporan los píxeles débiles 8 conectados a los píxeles fuertes
65. Obtención de coeficientes de la máscara Prewitt Sobel a = [0.5; 1.5] = 0.5+(1./(1+exp(-pa))); b = [0.5; 2.5] = 0.5+2*(1./(1+exp(-pb))); Neurona -a 0 a -b 0 b -a 0 a
66. Obtención de coeficientes de la máscara (II) f(x-1, y-1) f(x-1, y) f(x-1, y+1) f(x, y-1) f(x, y) f(x, y+1) f(x+1, y-1) f(x+1, y) f(x+1, y+1) -a 0 a -b 0 b -a 0 a x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9
67. Obtención de coeficientes de la máscara (III) -a 0 a -b 0 b -a 0 a -a -b -a 0 0 0 a b a -b -a 0 -a 0 a 0 a b 0 a b -a 0 a -b -a 0 x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9
68. Obtención de coeficientes de la máscara (IV) Borde total = Suma de líneas en cada orientación Núcleo estimador
69. Obtención de coeficientes de la máscara (V) Núcleo estimador Coeficientes de la máscara resultante -2a-b -b b -2a-b 0 2a+b -b b 2a+b
71. Obtención de coeficientes de la máscara (VII) Matriz de entrada-salida El número de filas será semejante al número de píxeles La imagen original y la que contiene bordes tendrán la misma dimensión x 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 f(x-1, y-1) f(x-1, y) f(x-1, y+1) f(x, y-1) f(x, y) f(x, y+1) f(x+1, y-1) f(x+1, y) f(x+1, y+1)
72.
73.
74. Obtención de coeficientes de la máscara (X) mm = -1.9216 -0.5584 0.5584 -1.9216 0 1.9216 -0.5584 0.5584 1.9216 >>IV=imfilter(II, mm, 'symmetric');
77. Transformada de Hough (III) Determina la transformada de Hough >>[Hough,Theta,Rho] = hough(a); Determina picos en la transformada >> P = houghpeaks(H,1) >> RT=[Rho(1,P(1,1)),Theta(1,P(1,2))] Valores de Rho y Theta Línea definida en
78. Transformada de Hough (IV) >>II=rgb2gray(I); >> III=im2bw(II,.45); >> [H,T,R] = hough(III); >> P = houghpeaks(H, 2 ); Fuente