Date post: | 15-Jun-2015 |
Category: |
Documents |
Upload: | omar-sanchez |
View: | 15,565 times |
Download: | 2 times |
Detección de bordes y discontinuidades
Filtrado y detección de bordes
Filtros pasobajo:Asemeja el nivel de gris del píxel con el entornoReduce ruidoAumenta homogeneidadSe 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 ruidoEstimula los límites o bordes
Gausiana Laplaciana de la gausiana
Gradiente
Detección de bordes:Enfatizan los bordes que rodean al objetoFiltros pasoalto
Gradiente: Variaciones del nivel de gris en píxeles consecutivos
f(x,y) f(x,y+1)
f(x+1,y)
x
y
Gradiente (II)
Magnitud del vector gradiente
Dirección del vectorgradiente00 4590),( yx
2
2
y
x
G
G
22),( yxM
01 45)1(tan),( yx
0135
Gradiente (III)
% Determina gx y gyfunction [gx,gy]=gradiente(I)hx=[-1 0;1 0];hy=hx';%filtrogx=imfilter(I,hx,'replicate','conv');gy=imfilter(I,hy,'replicate','conv');%end
% Obtiene la magnitud del gradienteII=abs(gx)+abs(gy);%Obtiene la dirección del gradienteVI=atan(double(gy)/double(gx));
Magnitud del vector gradiente Dirección del vector gradiente
Aplicación del Gradiente
yG
xG
yx GG
yxM
,
Aplicación del Gradiente (II)
V=edge(II,'roberts');
T = 33% de max{|Gx|, |Gy|}
N
x
M
y
yxMMN
T1 1
2),(1
Aplicación de Umbral
Representación del gradiente
Referencia del programa MATLAB
clear;close all;I=imread('rice.png');fim=mat2gray(I);%Magnitud del gradientefigure('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 3x3Pí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 filtrosIII=imfilter(II,gh);IV=imfilter(II,gv);% Obtiene el gradienteV=abs(III)+abs(IV);
Equivalencia
Máscaras de Prewitt (II)
¿Magnitud predominante?
Diagonal izquierda Diagonal derecha
DIVH MMMMyxM ,,,max),(
Dirección predominanteLa 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 centralReduce 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 Kirschk(:,:,1) = [-3 -3 5; -3 0 5; -3 -3 5];k(:,:,2) = [-3 5 5; -3 0 5; -3 -3 -3];for i=3:8k(:,:,i) = rot90(k(:,:,i-2));end
% Aplica los 8 filtros (x: imagen)for i=1:8resultado(:,:,i) = imfilter(I,k(:,:,i),‘replicate’);end
% Selecciona el máximo de cada filtroII= max(abs(resultado),[],3);
%Aplica umbrale=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)
1800 ,max),( MMyxG V
22545 ,max),( MMyxG D
27090 ,max),( MMyxG H
315135 ,max),( MMyxG I
¿Magnitud predominante?
Máscaras de Robinson
Una negada de la otra, menos costoso computacionalmente
Kirsch vs Robinson
-1
-0.5
0
0.5
1
-1-0.5
00.5
1-3
-2
-1
0
1
2
3
4
5
-1-0.5
00.5
1
-1-0.5
00.5
1-2
-1.5
-1
-0.5
0
0.5
1
1.5
2
Comparación de máscaras a 45o
Comparación entre máscaras
Roberts
Prewitt
Sobel
Kirsch
Robinson
Kirsch
Robinson
Roberts
Prewitt
Sobel
Líneas verticales -45o
Gradiente basado en derivada de segundo orden
2
2
2
22 ),(),(
),(y
yxf
x
yxfyxf
),(4)1,()1,(),1(),1(),(2 yxfyxfyxfyxfyxfyxf
Función que define la máscara
)()1( xfxfx
f
)()1()1()2(2
2
xfxfxfxfx
f
Segunda derivada en los puntos x+1 e y+1
Segunda derivada en los puntos x e y
)(2)1()1(2
2
xfxfxfx
f
)()1( yfyfy
f
)()1()1()2(2
2
yfyfyfyfy
f
)(2)1()1(2
2
yfyfyfy
f
Operador Laplaciano
Gradiente basado en derivada de segundo orden (II)
),(4)1,()1,(),1(),1(),(2 yxfyxfyxfyxfyxfyxf
0 1 0
1 -4 1
0 1 0
Máscaras equivalentes
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
1 1 1
1 -8 1
1 1 1
Lo anterior equivale a aplicar la siguiente máscara
Primera vs segunda derivada
a=[0:1/255:1];for i=1:400 b(i,1:256)=a(1,:);endaa=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
RuidoDoble bordeNo 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)
formaotrade
TyxRSiyxg
0
),(1),(
Detección de líneas
En una dirección específica
% Se definen las máscarasw(:,:,1)=[-1, -1, -1; 2, 2, 2; -1, -1, -1]; % 0o
w(:,:,3)=rot90(w(:,:,1)); % 90o
w(:,:,2)=[-1, -1, 2; -1, 2, -1; 2, -1, -1]; % 45o
w(:,:,4)=rot90(w(:,:,2)); % -45o
% Se calcula la mediafor i=1:4II(:,:,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 gradientez1 z2 Z3
z4 z5 z6
z7 Z8 z9
58 zzx
fGx
56 zzy
fGy
59 zzx
fGx
68 zzy
fGy
Roberts
1M
2M
21 ,max MMM final
Detección de bordes (II)
Aplicación del gradiente (Prewitt)z1 z2 Z3
z4 z5 z6
z7 Z8 z9
321987 zzzzzzx
fGx
741963 zzzzzzy
fGy
Sobel
321987 22 zzzzzzx
fGx
741963 22 zzzzzzy
fGy
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 umbralumbral=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 umbralfor i=1:4II(:,:,i) = imfilter(double(I),w(:,:,i),'symmetric','same');II(:,:,i) = II(:,:,i) >= umbral.*max(abs(II(:)));figure;imshow(II(:,:,i));end% Imagen resultanteII=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
2
22
2),( yx
eyxG 2
2
2
22 ),(),(
),(y
yxG
x
yxGyxG
2
22
2
2
),(
yx
ex
x
yxG
2
22
2
24
2
2
2 1),(
yx
ex
x
yxG
2
22
2
2
),(
yx
ey
y
yxG
2
22
2
24
2
2
2 1),(
yx
ey
y
yxG
2
22
2
4
222
2
2
2
22 2),(),(
),(
yx
eyx
y
yxG
x
yxGyxG
Laplaciana de la gausiana
Detección de bordes (VIII)
2
22
2
4
222
2
2
2
22 2),(),(
),(
yx
eyx
y
yxG
x
yxGyxG
Laplaciana de la gausiana
7.0),(2 yxG
Cruces por cero
22
Detección de bordes (IX)
Laplaciana de la gausiana7.0),(2 yxG
22
>> 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
2
22
2),( yx
eyxG
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
22
22
21
22
2
22
2
21 2
1
2
1),(
yxyx
eeyxDoG
21
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
2
22
2, yx
eyxw
21 ),( TyxMT 2),( TyxM
Aplicación de Canny
Kirsch (T=0.95M) 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 a
-b 0 b
-a 0 a
a = [0.5; 1.5] = 0.5+(1./(1+exp(-pa)));
b = [0.5; 2.5] = 0.5+2*(1./(1+exp(-pb)));
Neurona
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
as
b
bt
tysxftswyxg ),(),(),(
-a 0 a
-b 0 b
-a 0 a
x1 x2 x3
x4 x5 x6
x7 x8 x9
Obtención de coeficientes de la máscara (II)
-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
x1 x2 x3
x4 x5 x6
x7 x8 x9
Obtención de coeficientes de la máscara (III)
Borde total = Suma de líneas en cada orientación
Núcleo estimador
Obtención de coeficientes de la máscara (IV)
Núcleo estimador
Obtención de coeficientes de la máscara (V)
Coeficientes de la máscara resultante
-2a-b -b b
-2a-b 0 2a+b
-b b 2a+b
Núcleo estimador
Componentes derivativos
Obtención de coeficientes de la máscara (VI)
Matriz de entrada-salida
Obtención de coeficientes de la máscara (VII)
x1 x2 x3
x4 x5 x6
x7 x8 x9
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)
El número de filas será semejante al número de píxelesLa imagen original y la que contiene bordes tendrán la misma dimensión
Sustituir en algoritmo de aprendizaje supervisado
Obtención de coeficientes de la máscara (VIII)
Núcleo estimador
Adaptación de parámetros (gradiente)
Solución de sistema de ecuaciones lineales
Obtención de coeficientes de la máscara (IX)
Núcleo estimador
bat bxaxyxg ),(
)(2 4169 xxxxxa
)( 73192846 xxxxxxxxxb
b
aXG GXXX TT
b
a 1
-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 normalFuente
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
sensen
cos xy
Transformada de Hough (IV)
>>II=rgb2gray(I);>> III=im2bw(II,.45);>> [H,T,R] = hough(III);>> P = houghpeaks(H,2);
Fuente