Você está na página 1de 76

Filtros espaciales

Imagen Original Resultado del Filtro

Aplicación del filtro unsharp masking


Vecindades
Operaciones sobre vecindades:
Son aquellas que se realizan sobre bloques definidos
dentro de la imagen, en vez de procesar toda la imagen
Operaciones basadas
en vecindades
Las operaciones se realizan de la siguiente forma:

1.- Se selecciona el píxel a procesar.


2.- Se selecciona el entorno del píxel.
3.- Se aplica una función que depende del valor
de los píxeles del entorno seleccionado
4.- Se altera el píxel de la imagen de salida equivalente
al píxel de la imagen de entrada, por el valor
devuelto por la función.
5.- Repetir de 1 a 4 por cada píxel de la imagen de
entrada.
Operaciones basadas
en vecindades (II)
Ejemplo: Máximo de una vecindad de 3x3
Imagen de entrada (I) Imagen de salida (I1)
6 14 10 10 4 3 16 17 20 20 20 6
11 16 17 20 6 3 20 20 20 20 20 6
11 20 15 10 5 4 20 20 20 20 20 6
13 16 6 2 2 2 20 20 20 15 10 5
11 16 7 3 4 2 16 16 16 7 4 4
6 4 4 2 3 2 16 16 16 7 4 4

Lo cual se realizaría con el siguiente programa Matlab


>> f=inline('max(x(:))'); % Define función máxima
>> I1=nlfilter(I,[3, 3],f); % Devuelve máximo
Operaciones basadas
en vecindades (III)
Ejemplo: Mínimo de una vecindad de 3x3
Imagen de entrada (I) Imagen de salida (I1)
6 14 10 10 4 3 0 0 0 0 0 0
11 16 17 20 6 3 0 6 10 4 3 0
11 20 15 10 5 4 0 6 2 2 2 0
13 16 6 2 2 2 0 6 2 2 2 0
11 16 7 3 4 2 0 4 2 2 2 0

6 4 4 2 3 2 0 0 0 0 0 0

Lo cual se realizaría con el siguiente programa Matlab


>> f=inline('min(x(:))');
>> I1=nlfilter(I,[3, 3],f);
Operaciones basadas
en vecindades (IV)
El problema del contorno
Imagen de entrada Imagen de salida
6 14 10 10 4 3 0 0 0 0 0 0
11 16 17 20 6 3 0 6 10 4 3 0
11 20 15 10 5 4 0 6 2 2 2 0
13 16 6 2 2 2 0 6 2 2 2 0
11 16 7 3 4 2 0 4 2 2 2 0
6 4 4 2 3 2 0 0 0 0 0 0

1 2 3
1 2 3 4 5
1 n ... 1
2 ... 2

3 ... 3
.
.
m ...
Operaciones basadas
en vecindades (V)
Solución: Relleno de píxeles
Imagen de salida
Imagen de entrada 1 2 3
1 ...
1 2 3 4 5
1 n ... 2 ...
1 2 3 4 5
2 ... 3 1 n ...
3 ... 2 ...
.
. 3 ...
. .
m ...
. .
m ...

Rellenar contorno sin alterar la imagen original:


máscara=
Función: imfilter (‘La_imagen.jpg’, máscara, relleno, salida) [0 0 0 0 0
00000
‘same’: Mismo tamaño imagen original 00100
‘full’: Tamaño resultante con relleno (mayor) 00000
0 0 0 0 0]
Operaciones basadas
en vecindades (VI)
Relleno de una constante

f=
1 2 3 2 1
-1 -2 -3 -2 -1
1 2 3 2 1
-1 -2 -3 -2 -1
1 2 3 2 1
w=
[0 0 0 0 0
00000
00100
00000 >> imfilter(f,w,25,'full')
0 0 0 0 0]
Operaciones basadas
en vecindades (VII)
Relleno basado en réplica

f=
1 2 3 2 1
-1 -2 -3 -2 -1
1 2 3 2 1
-1 -2 -3 -2 -1
1 2 3 2 1
w=
[0 0 0 0 0
00000
00100
00000 >> imfilter(f,w,’replicate' ,'full')
0 0 0 0 0]
Operaciones basadas
en vecindades (VIII)
Relleno basado en espejo

f=
1 2 3 2 1
-1 -2 -3 -2 -1
1 2 3 2 1
-1 -2 -3 -2 -1
1 2 3 2 1
w=
[0 0 0 0 0
00000
00100
00000 >> imfilter(f,w,’ symmetric ‘,'full')
0 0 0 0 0]
Operaciones basadas
en vecindades (IX)
Tamaño de la
imagen destino
f=
1 2 3 2 1
-1 -2 -3 -2 -1
1 2 3 2 1
-1 -2 -3 -2 -1
1 2 3 2 1 >> imfilter(f,w,0,’ full')
w=
[0 0 0 0 0
00000
00100
00000
0 0 0 0 0]
>> imfilter(f,w,0,’ same')
Filtros espaciales
Responden a la siguiente ecuación:
a b
g ( x, y)    w ( s, t ) f ( x  s, y  t )
s a t b
donde:
f(x+s, y+t): Valor de los píxeles del bloque seleccionado
w(s, t): Coeficientes que se aplicarán al bloque (máscara)

Siendo la matriz del bloque:


m(filas) = 2a + 1
n(columnas) = 2b + 1
Filtros espaciales (II)
Concepto:
Son las operaciones que se realizan
directamente sobre los píxeles. Se
define una matriz de coeficientes del
filtro (o máscara, de tamaño mxn) los
cuales constituirán pesos ponderados por
los que se multiplicarán los valores
originales de los píxeles.
Filtros espaciales (III)
Valores de los píxeles del bloque
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)
Valores de los píxeles de los coeficientes (máscara)
w(-1, -1) w(-1, 0) w(-1, 1)
w(0, -1) w(0, 0) w(0, 1)
w(1, -1) w(1, 0) w(1, 1)

a b
g ( x, y)    w ( s, t ) f ( x  s, y  t )
s a t b
Filtros espaciales (IV)
Ejemplo:
Valor de los píxeles
17 24 1 8 15 Máscara (o filtro)
23 5 7 14 16 8 1 6
4 6 13 20 22 3 5 7
10 12 19 21 3 4 9 2
11 18 25 2 9

a b
g ( x, y)    w ( s, t ) f ( x  s, y  t )
s a t b

g(2,4)=1(8)+8(1)+15(6)+7(3)+14(5)+16(7)+13(4)+20(9)+22(2)=585
Filtros espaciales (V)
Pasos para la aplicación del filtro lineal:
1.- Definir la máscara
2.- Definir tipo de relleno
3.- Aplicar la ecuación:
a b
g ( x, y)    w ( s, t ) f ( x  s, y  t )
s a t b

4.- Definir tamaño de la imagen de


salida
Filtros espaciales (VI)

Ejemplos de filtros

Filtro promedio:

Filtro promedio ponderado:


Filtros espaciales (VII)
Ejemplos de máscaras de filtro promedio ponderado
(incluye denominador)

1 1 1 1 2 1 
w  1 2 1
1 
w  2 4 2
1 
10 16
1 1 1 1 2 1 
Forma general

1 c 1 
1  2 
w 2 
c c c
c  2  
1 c 1 
Filtros espaciales (VIII)
Ejemplo (usando Matlab):
% Imagen original
>> I=imread('tire.tif');

% Se define una matriz de pesos de valores iguales,


% a lo que se le denomina filtro promedio
>> w=ones(5,5)/25;
Original Resultado
% Se aplica el filtro
>> I2=imfilter(I,w); >> I(1:5,1:5) >> I2(1:5,1:5)
ans = ans =
6 14 10 10 4 5 6 7 6 5
11 16 17 20 6 6 8 9 7 5
11 20 15 10 5 8 9 10 9 6
13 16 6 2 2 7 8 9 8 5
11 16 7 3 4 6 6 7 6 4
Filtros espaciales (IX)

Original
Filtros espaciales (X)
Original
>> imhist(I) >> imhist(I2)

900
800
800
700
700
600
600
500
500

400
400

300 300

200 200

100 100

0 0

0 50 100 150 200 250 0 50 100 150 200 250


Filtros espaciales (XI)
Formas de aplicar la máscara
Método de correlación: Se aplica la máscara tal y como se define

Método de convolución: Se rota la máscara 180 grados alrededor


del píxel central, antes de aplicar el filtro

Imagen
f= Máscara
00000 w=
00000 123
00100 456
00000 789
00000

>> imfilter(f,w,'corr') >> imfilter(f,w,'conv')


Imágenes ruidosas
Ruido: Es un deterioro de la imagen que puede
producirse debido a:
1.- Píxeles perdidos en un sensor CCD
2.- Cuando se comprime o transmite la imagen
3.- Inadecuada iluminación de la escena
4.- Escáner de documentos
5.- Sensibilidad inadecuada de las cámaras, etc.

g ( x, y)  f ( x, y)   ( x, y)

Ruído
Imágenes ruidosas (II)
Escáner de una letra con y sin ruído

>>[R,Q] = size(G);
>>G_ruidosa = G + randn(R,Q)*0.2

G=01110100011000010000100111000101110

G_ruidosa = 0.1337 0.9859 1.0447 1.0773 -0.5392 1.0712 0.0547 0.0860


-0.0817 0.9028 0.6783 0.0299 0.3474 -0.0147 0.1335 1.2666 0.0991
0.3885 -0.2928 0.1002 1.0181 -0.0948 0.0390 0.8881 0.9455 0.8147
0.0208 0.4779 0.1484 1.2493 -0.2367 0.9407 1.0204 1.0842 -0.2981
Imágenes ruidosas (III)
% Ruido gausiano
>> s = 15; % Desviación estándar
>> s = s/255; % Se normaliza a [0,1]
>> II = imnoise(road,'gaussian',0,s^2);
% media 0, varianza (15^2)
Imágenes ruidosas (IV)
III=imnoise(I,'poisson');
Imágenes ruidosas (V)
IV=imnoise(I,'salt & pepper');
Imágenes ruidosas (VI)
V=imnoise(I,'speckle');
Supresión de ruido
con filtro promedio
>> w=ones(3,3)/9;
IV=imnoise(I,'salt & pepper'); >> I2=imfilter(I,w);
Filtro Laplaciano

Este tipo de filtro se basa en un operador


derivativo, por lo que acentúa las zonas que
tienen gran discontinuidad en la imagen,
destacando detalles finos, bordes y
discontinuidades

f ( x)
 f ( x  1)  f ( x)
x
Filtro Laplaciano (II)
f ( x)
Si se cumple:  f ( x  1)  f ( x)
x

 2 f ( x)
Entonces:  f ( x  1)  f ( x  1)  2 f ( x)
x 2

Si la función depende de dos variables

 2
f ( x , y )  2
f ( x, y )
 f ( x, y ) 
2

x 2
y 2
Filtro Laplaciano (III)
Función dependiente de dos variables
 2
f ( x , y )  2
f ( x, y )
 f ( x, y ) 
2

x 2
y 2
La derivada de segundo orden con respecto a al variable x:
 2 f ( x, y)
 f ( x  1, y)  f ( x  1, y)  2 f ( x, y)
x 2

De forma similar, con respecto a y:

 2 f ( x, y )
 f ( x, y  1)  f ( x, y  1)  2 f ( x, y )
y 2

Finalmente:
 2 f ( x, y)  f ( x  1, y)  f ( x  1, y)  2 f ( x, y)  f ( x, y  1)  f ( x, y  1)  2 f ( x, y)
Filtro Laplaciano (IV)
El Laplaciano queda definido por:
 2 f ( x, y)  f ( x  1, y)  f ( x  1, y)  f ( x, y  1)  f ( x, y  1)  4 f ( x, y)

La anterior expresión es equivalente a aplicar una


máscara definida por:

w=
a b
0
1
1
-4
0
1
g ( x, y)    w ( s, t ) f ( x  s, y  t )
s a t b
0 1 0
Filtro Laplaciano (V)
% Imagen original
>> I=imread('moon.tif' );
% Se define una matriz de pesos
>> w=[0, 1, 0; 1, -4, 1; 0, 1, 0];
% Se aplica el filtro
>> I2=imfilter(I,w);

Alternativa:
>> I=imread('moon.tif');
>> w=fspecial('laplacian',0);
>> I2=imfilter(I,w,'replicate');
Filtro Laplaciano (VI)

Imágenes: www.imageprecessingplace.com
Filtro Laplaciano (VII)
 2 f ( x, y)  f ( x  1, y)  f ( x  1, y)  f ( x, y  1)  f ( x, y  1)  4 f ( x, y)

Si se desea considerar las variaciones con respecto a la diagonal

w= w=
0 1 0
1 -4 1 1 1 1
0 1 0 1 -8 1
-4 1 1 1
+1 También se utiliza el negado de las anteriores máscaras

w= w=
-1 -1 -1 0 -1 0
-1 8 -1 -1 4 -1
-1 -1 -1 0 -1 0
Filtros Laplacianos alternativos
Se emplea en pocas ocasiones en la práctica

Excesivamente sensible a la presencia de ruido


Da lugar a bordes dobles y no permite determinar
direcciones

Se utiliza para realzar una imagen

Sumar o restar el Laplaciano de la imagen dependiendo


del signo del coeficiente central de la máscara utilizada

Coeficiente central de la máscara negativo


Coeficiente central de la máscara positivo
Filtros Laplacianos alternativos (II)
Resultado de sustraer el Laplaciano
(una única máscara)

Incluye
diagonal
Filtro Gaussiano
La máscara o filtro que responde a:
 ( x 2  y 2 ) / 4 2
e
w( x, y )  a b

 e
s  a s b
 ( s 2  t 2 ) / 4 2

Siendo la matriz del bloque:


m(filas) = 2a + 1
n(columnas) = 2b + 1
ó
Filtro Gaussiano (II)

Influencia del parámetro 


Filtro Gaussiano (III)
Máscara a partir de función no lineal
Filtro que se aplica es lineal
0.25
%Define máscara
>> fspecial('gaussian',3,0.5)
0.2
ans =
0.0113 0.0838 0.0113
0.15
0.0838 0.6193 0.0838
0.0113 0.0838 0.0113
0.1

0.05
% Máscara y filtro
>> w=fspecial(‘gaussian',3,0.5);
0
-3 -2 -1 0 1 2 3 >> I2=imfilter(I,w,'replicate');

0.0478 0.1163 0.0478 a b


0.1163
0.0478
0.2829
0.1163
0.1163
0.0478
g ( x, y)    w ( s, t ) f ( x  s, y  t )
s a t b
Laplaciana de la gausiana
Laplaciana de la gausiana (II)
>> w=fspecial('log',5,0.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.31 1.2336 0.2479
0.2475 0.3545 1.2336 0.3545 0.2475
0.2475 0.2475 0.2479 0.2475 0.2475
>>surf(w) >>surf(-w)

5 15

0 10

-5 5

-10 0

-15 -5
5 5
4 5 4 5
3 4 3 4
3 3
2 2 2 2
t 1 1 t 1 1
s s
Laplaciana de la gausiana (III)
Mejorando detalles del tipo de filtros
>> w=fspecial('log',5,0.4)
>> [x, y]=meshgrid(-2:1:2)
>> [xi, yi]=meshgrid(-2:.05:2);
>> zi = interp2(x,y,z,xi,yi);
>> surf(xi,yi,zi)

-5

-10

-15
5
4 5
3 4
3
2 2
t 1 1
s
Máscaras con fspecial
Disco

>> w = fspecial('disk',4)

Promedio

>> w = fspecial('average',5)
w=
0.0400 0.0400 0.0400 0.0400 0.0400
0.0400 0.0400 0.0400 0.0400 0.0400
0.0400 0.0400 0.0400 0.0400 0.0400
0.0400 0.0400 0.0400 0.0400 0.0400
0.0400 0.0400 0.0400 0.0400 0.0400
>> 1/25
ans =
0.0400
Ejemplo: Promedio
>> w=fspecial('average');
Imagen Original Resultado del Filtro
Máscaras con fspecial (II)
Gausiana Laplaciana de la gausiana
>>z = fspecial('gaussian',5,0.7) >> z = fspecial('log',5,0.7)
Ejemplo: Filtro Gaussiano

>> w=fspecial('gaussian');

Imagen Original Resultado del Filtro


Máscaras con fspecial (III)
Laplaciana Mejora de contraste
>>z = z = fspecial('laplacian',0.3) >> z = fspecial('unsharp',0.3)

>> fspecial('laplacian',0) >> fspecial('unsharp',0)


0 1 0 0 -1 0
1 -4 1 -1 5 -1
0 1 0 0 -1 0
Filtro para acentuar contraste
>> w=fspecial('unsharp');
Imagen Original Resultado del Filtro
Máscaras con fspecial (IV)
Acentuar transiciones horizontales y verticales
Prewit: Acentuar transiciones horizontales
Máscara: w =
[1 1 1
0 0 0
-1 -1 -1]

Sobel: Acentuar transiciones horizontales

Máscara: w =
[1 2 1
0 0 0
-1 -2 -1]
Acentuar transiciones verticales: Transpuesta de la matriz
Ejemplo: Filtro Prewit

>> w=fspecial('prewitt');
Imagen Original Resultado del Filtro
Ejemplo: Filtro Sobel
>> w=fspecial('sobel');
>> hp=transp(w); % Acentúa vertical
Imagen Original Resultado del Filtro
Filtros no lineales
Filtro lineal
a b
g ( x, y)    w ( s, t ) f ( x  s, y  t )
s a t b
Filtro no lineal
Valor de los píxeles
Bloque de píxeles
17 24 1 8 15
1 1 1
23 5 7 14 16
1 1 1
4 6 13 20 22 1 1 1
10 12 19 21 3
11 18 25 2 9 >>B = nlfilter(A, [m n], función_nl)

Aplicación Supresión de ruido


Ejemplo de aplicación
de filtro no lineal
Sea: -Sxy La región de la imagen
-(x,y) Centro de la región
- f’(x,y) La salida del filtro (escalar)
Filtro de Media aritmética

ˆf ( x, y )  1
 g ( s, t )
mn ( s ,t )S xy
A= B=
A = imread(‘imagen.jpg'); 1 2 3 1.3333 2.3333 1.7778
fun = @(x) mean(x(:)); 4 5 6 3.0000 5.0000 3.6667
B = nlfilter(A,[3 3],fun); 7 8 9 2.6667 4.3333 3.1111
Filtros no lineales (II)
Ejemplo de Filtro de Media aritmética
Imagen original Media aritmética
Filtros no lineales (III)
Filtro de Media geométrica
1
  mn
fˆ ( x, y )    g ( s, t )
( s ,t )S xy 

Filtro de Media armónica


mn
fˆ ( x, y ) 
1

( s ,t )S xy g ( s, t )
Función spfilt:
Gonzáles, R.; Woods, R.; Eddins, S.: Digital Image Processing Using Matlab. 2004
Filtros no lineales (IV)
Ejemplo de Filtro de Media geométrica
(I2=spfilt(I, 'gmean', 3, 3);)
Imagen original Media geométrica
Filtros no lineales (V)
Ejemplo de Filtro de Media armónica
>> I2=uint8(3*3./imfilter(1./I, ones(3, 3), 'symmetric'))
Media harmónico
Imagen original
Filtros no lineales (VI)
Filtro de Media Contra-armónica
 g ( s ,
( s ,t )S xy
t ) Q 1

fˆ ( x, y ) 
 g ( s ,
( s ,t )S xy
t ) Q

Filtro de Punto medio


ˆf ( x, y)  1 max{ g ( s, t )}  min{ g ( s, t )}
2
Filtro de máximo (aclara) Filtro de mínimo (oscurece)
fˆ ( x, y)  max{ g (s, t )} fˆ ( x, y)  min{ g (s, t )}
Filtros no lineales (VII)
Ejemplo de Filtro de Media Contra-armónica
(I2=spfilt(I, 'chmean‘,3, 3);)
Imagen original Media contraharmónico
Filtros no lineales (VIII)
Ejemplo de Filtro de Punto medio
>> d1=ordfilt2(I, 1, ones(3, 3), 'symmetric'); % Mínimo
>> d2=ordfilt2(I, 3*3, ones(3, 3), 'symmetric'); % Máximo
>> I1=uint8(1/2*(d2+d1));
Imagen original Punto medio
Filtros no lineales (IX)
Filtro Mediana
1.- Se ordenan
Valor de los píxeles
1 7 8 13 15 16 20 22 40
17 24 1 8 15
23 5 7 40 16
2.- Se selecciona el central
4 6 13 20 22
10 12 19 21 3 17 24 1 8 15
11 18 25 2 9 23 5 7 15 16
4 6 13 20 22
Número par de píxeles
La media de los dos 10 12 19 21 3
píxeles centrales 11 18 25 2 9
¿Cuál filtro utilizar?
Verificar como se difuminan los bordes después de aplicar el filtro
>>I=imread('contornos.tif');
% Se determinan los bordes verticales
>> II=edge(I, 'sobel', 'vertical'); imshow(II)
¿Cuál filtro utilizar? (II)
% Se aplica ruido a la imagen
>> III=imnoise(I,'salt & pepper',0.005);
% Se aplica el filtro mediana y se detectan bordes verticales
>> IV=medfilt2(III);
>> V=edge(IV, 'sobel', 'vertical'); imshow(V)
¿Cuál filtro utilizar? (III)
% Se aplica el filtro promedio y se detectan bordes verticales
>>w=fspecial('average');
>>VI=uint8(imfilter(III, w, 'symmetric'));
>> VII=edge(VI, 'sobel', 'vertical'); imshow(VII)
% Se aplica el filtro media armónica y se detectan bordes verticales
>> VIII=uint8(3*3./imfilter(1./III, ones(3, 3), 'symmetric'));
>>IX=edge(VIII, 'sobel', 'vertical'); imshow(IX)
Resultado
% Se aplica el filtro punto medio
%y se detectan bordes verticales
>> d1=ordfilt2(III, 1, ones(3, 3), 'symmetric');
Calidad por siguiente orden:
>> d2=ordfilt2(III, 3*3, ones(3, 3), 'symmetric'); Mediana
>> X=uint8(1/2*(d2+d1)); Promedio
>>XI=edge(X, 'sobel', 'vertical'); imshow(XI)
Punto medio
Media armónica

Frente a ruido:
Sal y Pimienta
Filtros usando Simulink
Filtro mediana

Fijar parámetros de simulación


Filtros usando Simulink (II)
Filtros usando Simulink (III)

Se define “fspecial’
Filtros usando Simulink (IV)
Filtros usando Simulink (V)

Video de una cámara conectada ó archivo.avi: Ver vipedge, sustituir por 2-D FIR Filter
Realzado aplicando
Unsharp Masking
Pasos
1.- Desenfocar la imagen original (filtro promedio, etc..)
2.- Sustraer a la imagen original la imagen desenfocada
(se obtiene la máscara)
3.- Adicionar a la imagen original la máscara

h=fspecial('average',5);
II=imfilter(I,h);
III=imsubtract(I,II);
IV=imadd(I,III);
Realzado aplicando
Unsharp Masking (II)
>> w = fspecial('laplacian',0) w=
>> III = im2double(I) - imfilter(im2double(I), w); 0 1 0
1 -4 1
0 1 0
Realzado aplicando
Filtrado Highboost
Pasos
1.- Desenfocar la imagen original (filtro promedio, etc..)
f f
2.- Sustraer a la imagen original la imagen desenfocada
(se obtiene la máscara)
g masc ( x, y)  f  f
3.- Adicionar a la imagen original la máscara
g ( x, y)  f  k * g masc ( x, y)

k = 1 Unsharp masking K > 1 Filtrado Highboost


Unsharp Masking vs
Filtrado Highboost
h=fspecial('average',5);
II=imfilter(I,h);
III=imsubtract(I,II).*3;
IV=imadd(I,III);

k=1 k=3

Você também pode gostar