Detección de bordes y discontinuidades
Filtrado y detección de bordes Filtros pasobajo: Asemeja el nivel de gris del píxel con el entorno Reduce ruido Aumenta homogeneidad Se pierde detalle (bordes se difuminan) Filtro promedio : Filtro promedio ponderado :
Filtrado y detección de bordes (II) Filtros pasoalto: Enfatizan diferencias en el nivel de gris  Aumenta ruido Estimula los límites o bordes Gausiana Laplaciana de la gausiana
Gradiente Detección de bordes: Enfatizan los bordes que rodean al objeto Filtros pasoalto  Gradiente:  Variaciones del nivel de gris  en píxeles consecutivos x y f ( x , y ) f ( x , y +1) f ( x +1, y )
Gradiente (II) Magnitud del vector gradiente Dirección  del vector gradiente
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
Aplicación del Gradiente
Aplicación del Gradiente (II) V=edge(II,'roberts'); T  = 33% de max{|Gx|, |Gy|} Aplicación de Umbral
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));
Representación del gradiente (II) Magnitud del gradiente Dirección del gradiente
Máscaras de Roberts La suma de los componentes de las máscaras es cero:  Devuelve cero en áreas de intensidad constante
Máscaras de Roberts (II)
Máscaras de Roberts (III) %En espacio de trabajo [BW,umbral,g45,g135] = edge(I,'roberts',...) g45  = imfilter(I ,[1 0; 0 -1]/ 2,'replicate');  g135 = imfilter(I ,[0 1;-1  0]/ 2,'replicate'); ó >umbral
Máscaras de Roberts (IV) Verificar tipo de datos de la imagen
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
Máscaras de Prewitt (II) ¿Magnitud predominante? Diagonal izquierda Diagonal derecha Dirección predominante La equivalente a la magnitud predominante
Máscaras de Prewitt (III)
Máscaras de Prewitt (IV) Influencia del umbral
Máscaras de Sobel Reforzar el valor del píxel central Reduce la influencia del ruido en la detección  de discontinuidades Prewitt Sobel
Máscaras de Sobel (II) >> w=fspecial('sobel')
Máscaras de Kirsch 8 máscaras que representan 8 orientaciones
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
Máscaras de Kirsch (III)
Máscaras de Kirsch (IV)
Máscaras de Kirsch (V) ¿Magnitud predominante?
Máscaras de Robinson Una negada de la otra, menos costoso computacionalmente
Kirsch vs Robinson Comparación de máscaras a 45 o
Comparación entre máscaras Roberts Prewitt Sobel Kirsch Robinson Kirsch Robinson Roberts Prewitt Sobel Líneas verticales -45 o
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
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
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
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];
Primera vs segunda derivada (II) Imagen Fila Primera derivada Segunda derivada
Primera vs segunda derivada (III) Detectar bordes  primera derivada Aplicar  umbral   de intensidad  a la imagen filtrada
Primera vs segunda derivada (IV) Detectar bordes  segunda derivada Detección de los  cruces por cero a la imagen filtrada Cruce por cero
Primera vs segunda derivada (V) Influencia del ruido
Primera vs segunda derivada (VI) Primera derivada
Primera vs segunda derivada (VII) Segunda derivada Más susceptible al ruido Menos utilizada para detectar bordes
Primera vs segunda derivada (VIII) % Filtro de Sobel (primera derivada) >> III=edge(II,‘sobel'); % Filtro  de segunda derivada >>  h=[1 1 1; 1 -8 1; 1 1 1]; >>IV=edge(II, 'zerocross', h); III Ruido Doble borde No se detecta dirección IV
Primera vs segunda derivada (IX) Algunas conclusiones sobre derivadas La primera derivada devuelve bordes más gruesos La segunda derivada discrimina más adecuadamente a  líneas finas, puntos aislados y ruido La segunda derivada devuelve doble respuesta a un  cambio de intensidad (valor absoluto: doble borde) El cambio de signo de la segunda derivada indica si el cambio  de intensidad es de negro a blanco o viceversa
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)
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
Detección de líneas (II) +
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));
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)
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(:)));
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
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
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)));
Detección de bordes (IV) III IV V Vp=V>0.53*max(V(:)); IVp=IV>0.65*max(IV(:));
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);
Detección de bordes (VI) Resultado de la detección de bordes para diferentes umbrales
Detección de bordes (VII) Método de Marr-Hildreth Laplaciana de la gausiana
Detección de bordes (VIII) Laplaciana de la gausiana Cruces por cero
Detección de bordes (IX) Laplaciana de la gausiana >> w=fspecial('log',5,.7) w = 0.0034  0.0338  0.0697  0.0338  0.0034 0.0338  0.1800  0.0105  0.1800  0.0338 0.0697  0.0105  -1.3250  0.0105  0.0697 0.0338  0.1800  0.0105  0.1800  0.0338 0.0034  0.0338  0.0697  0.0338  0.0034 >> sum(w(:)) -6.0715e-018 La suma de los componentes de la máscara es cero  Es isotrópica (invariante a la rotación)
Detección de bordes (X) Detección de cruces por cero laplaciana de la gausiana >> -fspecial('log', 5,  .4 ) ans = -0.2475 -0.2475 -0.2479 -0.2475 -0.2475 -0.2475 -0.3545 -1.2336 -0.3545 -0.2475 -0.2479 -1.2336  10.3145  -1.2336 -0.2479 -0.2475 -0.3545 -1.2336 -0.3545 -0.2475 -0.2475 -0.2475 -0.2479 -0.2475 -0.2475 >> -fspecial('log', 5,  .6 ) ans = -0.0056 -0.0192 -0.0483 -0.0192 -0.0056 -0.0192 -0.2758 -0.2426 -0.2758 -0.0192 -0.0483 -0.2426  2.4429  -0.2426 -0.0483 -0.0192 -0.2758 -0.2426 -0.2758 -0.0192 -0.0056 -0.0192 -0.0483 -0.0192 -0.0056
Detección de bordes (XI) >> III=edge(II, 'zerocross', 0.3, fspecial('laplacian', 0.1 )); >> IV=edge(II, 'zerocross', 0.3, fspecial('laplacian', 0.9 )); Más ruidosa
Detección de bordes (XII) Método de Marr-Hildreth (otra propuesta) Filtrar la imagen con una máscara equivalente a un filtro gausiano Aplicar la máscara laplaciana Detectar los cruce por cero 1 1 1 1 -8 1 1 1 1
Detección de bordes (XIII) >>  w=[1 1 1; 1 -8 1; 1 1 1]; >>III=edge(II, 'zerocross', 0.5, w);
Detección de bordes (XIV) Diferencia de Gausianas La Laplaciana de la gausiana puede aproximarse  a diferencia de filtros gausianos Debe cumplirse:
Detección de bordes (XV) >> IV=imfilter(II,fspecial('gaussian',[3 3],.8)); >> V=imfilter(II,fspecial('gaussian',[3 3],.2)); >> VI=imsubtract(IV,V); >> VI=VI>0.13*max(VI(:));
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
Aplicación de Canny Kirsch ( T =0.95 M ) Canny
Máscaras de Frei-Chen Subespacio borde Subespacio línea Subespacio promedio
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
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
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
Obtención de coeficientes de la máscara (IV) Borde total = Suma de líneas en cada orientación Núcleo estimador
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
Obtención de coeficientes de la máscara (VI) Núcleo estimador Componentes derivativos
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)
Obtención de coeficientes de la máscara (VIII) Sustituir en algoritmo de  aprendizaje supervisado Núcleo estimador Adaptación de parámetros ( gradiente )
Obtención de coeficientes de la máscara (IX) Solución de sistema de ecuaciones lineales Núcleo estimador -2a-b -b b -2a-b 0 2a+b -b b 2a+b
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');
Transformada de Hough Representación de línea en forma normal Fuente
Transformada de Hough (II) Línea   Puntos con similar Rho y Theta
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
Transformada de Hough (IV) >>II=rgb2gray(I); >> III=im2bw(II,.45); >> [H,T,R] = hough(III); >> P = houghpeaks(H, 2 ); Fuente

Segmentación de imagenes

  • 1.
    Detección de bordesy discontinuidades
  • 2.
    Filtrado y detecciónde bordes Filtros pasobajo: Asemeja el nivel de gris del píxel con el entorno Reduce ruido Aumenta homogeneidad Se pierde detalle (bordes se difuminan) Filtro promedio : Filtro promedio ponderado :
  • 3.
    Filtrado y detecciónde bordes (II) Filtros pasoalto: Enfatizan diferencias en el nivel de gris Aumenta ruido Estimula los límites o bordes Gausiana Laplaciana de la gausiana
  • 4.
    Gradiente Detección debordes: Enfatizan los bordes que rodean al objeto Filtros pasoalto Gradiente: Variaciones del nivel de gris en píxeles consecutivos x y f ( x , y ) f ( x , y +1) f ( x +1, y )
  • 5.
    Gradiente (II) Magnituddel vector gradiente Dirección del vector gradiente
  • 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
  • 7.
  • 8.
    Aplicación del Gradiente(II) V=edge(II,'roberts'); T = 33% de max{|Gx|, |Gy|} Aplicación de Umbral
  • 9.
    Representación del gradienteReferencia 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));
  • 10.
    Representación del gradiente(II) Magnitud del gradiente Dirección del gradiente
  • 11.
    Máscaras de RobertsLa suma de los componentes de las máscaras es cero: Devuelve cero en áreas de intensidad constante
  • 12.
  • 13.
    Máscaras de Roberts(III) %En espacio de trabajo [BW,umbral,g45,g135] = edge(I,'roberts',...) g45 = imfilter(I ,[1 0; 0 -1]/ 2,'replicate'); g135 = imfilter(I ,[0 1;-1 0]/ 2,'replicate'); ó >umbral
  • 14.
    Máscaras de Roberts(IV) Verificar tipo de datos de la imagen
  • 15.
    Máscaras de PrewittExtensió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
  • 17.
  • 18.
    Máscaras de Prewitt(IV) Influencia del umbral
  • 19.
    Máscaras de SobelReforzar el valor del píxel central Reduce la influencia del ruido en la detección de discontinuidades Prewitt Sobel
  • 20.
    Máscaras de Sobel(II) >> w=fspecial('sobel')
  • 21.
    Máscaras de Kirsch8 máscaras que representan 8 orientaciones
  • 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
  • 23.
  • 24.
  • 25.
    Máscaras de Kirsch(V) ¿Magnitud predominante?
  • 26.
    Máscaras de RobinsonUna negada de la otra, menos costoso computacionalmente
  • 27.
    Kirsch vs RobinsonComparación de máscaras a 45 o
  • 28.
    Comparación entre máscarasRoberts Prewitt Sobel Kirsch Robinson Kirsch Robinson Roberts Prewitt Sobel Líneas verticales -45 o
  • 29.
    Gradiente basado enderivada 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 enderivada 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 enderivada 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 segundaderivada 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 segundaderivada (II) Imagen Fila Primera derivada Segunda derivada
  • 34.
    Primera vs segundaderivada (III) Detectar bordes primera derivada Aplicar umbral de intensidad a la imagen filtrada
  • 35.
    Primera vs segundaderivada (IV) Detectar bordes segunda derivada Detección de los cruces por cero a la imagen filtrada Cruce por cero
  • 36.
    Primera vs segundaderivada (V) Influencia del ruido
  • 37.
    Primera vs segundaderivada (VI) Primera derivada
  • 38.
    Primera vs segundaderivada (VII) Segunda derivada Más susceptible al ruido Menos utilizada para detectar bordes
  • 39.
    Primera vs segundaderivada (VIII) % Filtro de Sobel (primera derivada) >> III=edge(II,‘sobel'); % Filtro de segunda derivada >> h=[1 1 1; 1 -8 1; 1 1 1]; >>IV=edge(II, 'zerocross', h); III Ruido Doble borde No se detecta dirección IV
  • 40.
    Primera vs segundaderivada (IX) Algunas conclusiones sobre derivadas La primera derivada devuelve bordes más gruesos La segunda derivada discrimina más adecuadamente a líneas finas, puntos aislados y ruido La segunda derivada devuelve doble respuesta a un cambio de intensidad (valor absoluto: doble borde) El cambio de signo de la segunda derivada indica si el cambio de intensidad es de negro a blanco o viceversa
  • 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íneasEn 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
  • 43.
  • 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 bordesAplicació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
  • 53.
    Detección de bordes(VII) Método de Marr-Hildreth Laplaciana de la gausiana
  • 54.
    Detección de bordes(VIII) Laplaciana de la gausiana Cruces por cero
  • 55.
    Detección de bordes(IX) Laplaciana de la gausiana >> w=fspecial('log',5,.7) w = 0.0034 0.0338 0.0697 0.0338 0.0034 0.0338 0.1800 0.0105 0.1800 0.0338 0.0697 0.0105 -1.3250 0.0105 0.0697 0.0338 0.1800 0.0105 0.1800 0.0338 0.0034 0.0338 0.0697 0.0338 0.0034 >> sum(w(:)) -6.0715e-018 La suma de los componentes de la máscara es cero Es isotrópica (invariante a la rotación)
  • 56.
    Detección de bordes(X) Detección de cruces por cero laplaciana de la gausiana >> -fspecial('log', 5, .4 ) ans = -0.2475 -0.2475 -0.2479 -0.2475 -0.2475 -0.2475 -0.3545 -1.2336 -0.3545 -0.2475 -0.2479 -1.2336 10.3145 -1.2336 -0.2479 -0.2475 -0.3545 -1.2336 -0.3545 -0.2475 -0.2475 -0.2475 -0.2479 -0.2475 -0.2475 >> -fspecial('log', 5, .6 ) ans = -0.0056 -0.0192 -0.0483 -0.0192 -0.0056 -0.0192 -0.2758 -0.2426 -0.2758 -0.0192 -0.0483 -0.2426 2.4429 -0.2426 -0.0483 -0.0192 -0.2758 -0.2426 -0.2758 -0.0192 -0.0056 -0.0192 -0.0483 -0.0192 -0.0056
  • 57.
    Detección de bordes(XI) >> III=edge(II, 'zerocross', 0.3, fspecial('laplacian', 0.1 )); >> IV=edge(II, 'zerocross', 0.3, fspecial('laplacian', 0.9 )); Más ruidosa
  • 58.
    Detección de bordes(XII) Método de Marr-Hildreth (otra propuesta) Filtrar la imagen con una máscara equivalente a un filtro gausiano Aplicar la máscara laplaciana Detectar los cruce por cero 1 1 1 1 -8 1 1 1 1
  • 59.
    Detección de bordes(XIII) >> w=[1 1 1; 1 -8 1; 1 1 1]; >>III=edge(II, 'zerocross', 0.5, w);
  • 60.
    Detección de bordes(XIV) Diferencia de Gausianas La Laplaciana de la gausiana puede aproximarse a diferencia de filtros gausianos Debe cumplirse:
  • 61.
    Detección de bordes(XV) >> IV=imfilter(II,fspecial('gaussian',[3 3],.8)); >> V=imfilter(II,fspecial('gaussian',[3 3],.2)); >> VI=imsubtract(IV,V); >> VI=VI>0.13*max(VI(:));
  • 62.
    Método de Canny1.- 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
  • 63.
    Aplicación de CannyKirsch ( T =0.95 M ) Canny
  • 64.
    Máscaras de Frei-ChenSubespacio borde Subespacio línea Subespacio promedio
  • 65.
    Obtención de coeficientesde 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 coeficientesde 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 coeficientesde 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 coeficientesde la máscara (IV) Borde total = Suma de líneas en cada orientación Núcleo estimador
  • 69.
    Obtención de coeficientesde 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
  • 70.
    Obtención de coeficientesde la máscara (VI) Núcleo estimador Componentes derivativos
  • 71.
    Obtención de coeficientesde 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.
    Obtención de coeficientesde la máscara (VIII) Sustituir en algoritmo de aprendizaje supervisado Núcleo estimador Adaptación de parámetros ( gradiente )
  • 73.
    Obtención de coeficientesde la máscara (IX) Solución de sistema de ecuaciones lineales Núcleo estimador -2a-b -b b -2a-b 0 2a+b -b b 2a+b
  • 74.
    Obtención de coeficientesde 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');
  • 75.
    Transformada de HoughRepresentación de línea en forma normal Fuente
  • 76.
    Transformada de Hough(II) Línea Puntos con similar Rho y Theta
  • 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