Imagen_Filtrado_Espacial
-
Upload
manuel-navarro -
Category
Documents
-
view
616 -
download
0
Transcript of Imagen_Filtrado_Espacial
Filtros espacialesImagen 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)
6 14 10 10 4 3
11 16 17 20 6 3
11 20 15 10 5 4
13 16 6 2 2 2
11 16 7 3 4 2
6 4 4 2 3 2
Ejemplo: Máximo de una vecindad de 3x3
Imagen de entrada (I) Imagen de salida (I1)
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
16 17 20 20 20 6
20 20 20 20 20 6
20 20 20 20 20 6
20 20 20 15 10 5
16 16 16 7 4 4
16 16 16 7 4 4
Operaciones basadas
en vecindades (III)
6 14 10 10 4 3
11 16 17 20 6 3
11 20 15 10 5 4
13 16 6 2 2 2
11 16 7 3 4 2
6 4 4 2 3 2
Ejemplo: Mínimo de una vecindad de 3x3
Imagen de entrada (I) Imagen de salida (I1)
Lo cual se realizaría con el siguiente programa Matlab>> f=inline('min(x(:))');
>> I1=nlfilter(I,[3, 3],f);
0 0 0 0 0 0
0 6 10 4 3 0
0 6 2 2 2 0
0 6 2 2 2 0
0 4 2 2 2 0
0 0 0 0 0 0
Operaciones basadas
en vecindades (IV)
6 14 10 10 4 3
11 16 17 20 6 3
11 20 15 10 5 4
13 16 6 2 2 2
11 16 7 3 4 2
6 4 4 2 3 2
El problema del contorno
Imagen de entrada Imagen de salida
0 0 0 0 0 0
0 6 10 4 3 0
0 6 2 2 2 0
0 6 2 2 2 0
0 4 2 2 2 0
0 0 0 0 0 0
1
2
3
1 2 3
.
.
. . .
1 2 3 4 5 n1
2
3
m
. . .
. . .
. . .
Operaciones basadas
en vecindades (V)
Solución: Relleno de píxeles
.
.
. . .
1 2 3 4 5 n1
2
3
m
. . .
. . .
. . .
.
.
.
.
. . .
1 2 3 4 5 n1
2
3
m
. . .
. . .
. . .
1
2
3
1 2 3
. . .
. . .
Imagen de entradaImagen de salida
Función: imfilter (‘La_imagen.jpg’, máscara, relleno, salida)
Rellenar contorno sin alterar la imagen original:máscara=
[0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0]
‘same’: Mismo tamaño imagen original
‘full’: Tamaño resultante con relleno (mayor)
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
>> imfilter(f,w,25,'full')
w =
[0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
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
>> imfilter(f,w,’replicate' ,'full')
w =
[0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
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
>> imfilter(f,w,’ symmetric ‘,'full')
w =
[0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
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
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0]
>> imfilter(f,w,0,’ same')
Responden a la siguiente ecuación:
Filtros espaciales
a
as
b
bt
tysxftswyxg ),(),(),(
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
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 (II)
Filtros espaciales (III)
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 del bloque
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)
Valores de los píxeles de los coeficientes (máscara)
a
as
b
bt
tysxftswyxg ),(),(),(
Ejemplo:
Valor de los píxeles
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
Filtros espaciales (IV)
Máscara (o filtro)8 1 6
3 5 7
4 9 2
g(2,4)=1(8)+8(1)+15(6)+7(3)+14(5)+16(7)+13(4)+20(9)+22(2)=585
a
as
b
bt
tysxftswyxg ),(),(),(
Pasos para la aplicación del filtro lineal:
1.- Definir la máscara2.- Definir tipo de relleno3.- Aplicar la ecuación:
4.- Definir tamaño de la imagen de
salida
Filtros espaciales (V)
a
as
b
bt
tysxftswyxg ),(),(),(
Filtros espaciales (VI)
Filtro promedio:
Filtro promedio ponderado:
Ejemplos de filtros
Filtros espaciales (VII)
Forma general
Ejemplos de máscaras de filtro promedio ponderado
(incluye denominador)
111
121
111
10
1w
121
242
121
16
1w
11
11
2
1 2
2
c
ccc
c
cw
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;
% Se aplica el filtro
>> I2=imfilter(I,w);
Filtros espaciales (VIII)
>> I(1:5,1:5)
ans =
6 14 10 10 4
11 16 17 20 6
11 20 15 10 5
13 16 6 2 2
11 16 7 3 4
>> I2(1:5,1:5)
ans =
5 6 7 6 5
6 8 9 7 5
8 9 10 9 6
7 8 9 8 5
6 6 7 6 4
Original Resultado
Filtros espaciales (IX)
Original
Filtros espaciales (X)
Original
0 50 100 150 200 250
0
100
200
300
400
500
600
700
800
900
>> imhist(I)
0 50 100 150 200 250
0
100
200
300
400
500
600
700
800
>> imhist(I2)
Filtros espaciales (XI)
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
Formas de aplicar la máscara
f =
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
w =
1 2 3
4 5 6
7 8 9
>> imfilter(f,w,'corr') >> imfilter(f,w,'conv')
Imagen
Máscara
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.
Imágenes ruidosas
),(),(),( yxyxfyxg
Ruído
Escáner de una letra con y sin ruído
Imágenes ruidosas (II)
G = 0 1 1 1 0 1 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 1 0 0 0 1 0 1 1 1 0
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
>>[R,Q] = size(G);
>>G_ruidosa = G + randn(R,Q)*0.2
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
IV=imnoise(I,'salt & pepper');
>> w=ones(3,3)/9;
>> 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
)()1()(
xfxfx
xf
Filtro Laplaciano (II)
Si se cumple: )()1()(
xfxfx
xf
Entonces: )(2)1()1()(
2
2
xfxfxfx
xf
2
2
2
22 ),(),(
),(y
yxf
x
yxfyxf
Si la función depende de dos variables
Filtro Laplaciano (III)
2
2
2
22 ),(),(
),(y
yxf
x
yxfyxf
Función dependiente de dos variables
La derivada de segundo orden con respecto a al variable x:
),(2),1(),1(),(
2
2
yxfyxfyxfx
yxf
De forma similar, con respecto a y:
),(2)1,()1,(),(
2
2
yxfyxfyxfy
yxf
),(2)1,()1,(),(2),1(),1(),(2 yxfyxfyxfyxfyxfyxfyxf
Finalmente:
Filtro Laplaciano (IV)
El Laplaciano queda definido por:
),(4)1,()1,(),1(),1(),(2 yxfyxfyxfyxfyxfyxf
La anterior expresión es equivalente a aplicar una
máscara definida por:
w =
0 1 0
1 -4 1
0 1 0
a
as
b
bt
tysxftswyxg ),(),(),(
% 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);
Filtro Laplaciano (V)
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)
),(4)1,()1,(),1(),1(),(2 yxfyxfyxfyxfyxfyxf
w =
0 1 0
1 -4 1
0 1 0
w =
1 1 1
1 -8 1
1 1 1
Si se desea considerar las variaciones con respecto a la diagonal
+1
-4
w =
-1 -1 -1
-1 8 -1
-1 -1 -1
También se utiliza el negado de las anteriores máscaras
w =
0 -1 0
-1 4 -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
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
Se utiliza para realzar una imagen
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:
a
as
b
bs
ts
yx
e
eyxw
222
222
4/)(
4/)(
),(
ó
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
a
as
b
bt
tysxftswyxg ),(),(),(0.0478 0.1163 0.0478
0.1163 0.2829 0.1163
0.0478 0.1163 0.0478
-3 -2 -1 0 1 2 30
0.05
0.1
0.15
0.2
0.25
%Define máscara
>> fspecial('gaussian',3,0.5)
ans =
0.0113 0.0838 0.0113
0.0838 0.6193 0.0838
0.0113 0.0838 0.0113
% Máscara y filtro
>> w=fspecial(‘gaussian',3,0.5);
>> I2=imfilter(I,w,'replicate');
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)
1
2
3
4
5
1
2
3
4
5-15
-10
-5
0
5
st 1
2
3
4
5
1
2
3
4
5-5
0
5
10
15
st
Laplaciana de la gausiana (III)
1
2
3
4
5
1
2
3
4
5-15
-10
-5
0
5
st
>> 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)
Mejorando detalles del tipo de filtros
Máscaras con fspecial
>> 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
Disco
Ejemplo: Promedio
>> w=fspecial('average');
Imagen Original Resultado del Filtro
Máscaras con fspecial (II)
>> z = fspecial('log',5,0.7)
Gausiana
>>z = fspecial('gaussian',5,0.7)
Laplaciana de la gausiana
Ejemplo: Filtro Gaussiano
>> w=fspecial('gaussian');
Imagen Original Resultado del Filtro
Máscaras con fspecial (III)
>> z = fspecial('unsharp',0.3)
Laplaciana
>>z = z = fspecial('laplacian',0.3)
Mejora de contraste
>> fspecial('laplacian',0)
0 1 0
1 -4 1
0 1 0
>> fspecial('unsharp',0)
0 -1 0
-1 5 -1
0 -1 0
Filtro para acentuar contraste
>> w=fspecial('unsharp');Imagen Original Resultado del Filtro
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
Máscaras con fspecial (IV)
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
a
as
b
bt
tysxftswyxg ),(),(),(
Filtro lineal
Filtro no linealValor de los píxeles
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
Bloque de píxeles
1 1 11 1 11 1 1
>>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
xySts
tsgmn
yxf),(
),(1
),(ˆ
A = imread(‘imagen.jpg');fun = @(x) mean(x(:));B = nlfilter(A,[3 3],fun);
A =1 2 34 5 67 8 9
B =1.3333 2.3333 1.77783.0000 5.0000 3.66672.6667 4.3333 3.1111
Ejemplo de Filtro de Media aritméticaImagen original Media aritmética
Filtros no lineales (II)
Filtro de Media geométrica
mn
Sts xy
tsgyxf
1
),(
),(),(ˆ
Filtro de Media armónica
xySts tsg
mnyxf
),( ),(
1),(ˆ
Función spfilt: Gonzáles, R.; Woods, R.; Eddins, S.: Digital Image Processing Using Matlab. 2004
Filtros no lineales (III)
Ejemplo de Filtro de Media geométrica (I2=spfilt(I, 'gmean', 3, 3);)
Media geométricaImagen original
Filtros no lineales (IV)
Ejemplo de Filtro de Media armónica>> I2=uint8(3*3./imfilter(1./I, ones(3, 3), 'symmetric'))
Media harmónicoImagen original
Filtros no lineales (V)
Filtro de Media Contra-armónica
Filtro de Punto medio
xy
xy
Sts
Q
Sts
Q
tsg
tsg
yxf
),(
),(
1
),(
),(
),(ˆ
)},(min{)},(max{2
1),(ˆ tsgtsgyxf
Filtros no lineales (VI)
Filtro de máximo (aclara) Filtro de mínimo (oscurece)
)},(max{),(ˆ tsgyxf )},(min{),(ˆ tsgyxf
Ejemplo de Filtro de Media Contra-armónica(I2=spfilt(I, 'chmean‘,3, 3);)
Imagen original Media contraharmónico
Filtros no lineales (VII)
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 (VIII)
Filtro Mediana
Filtros no lineales (IX)
Valor de los píxeles
17 24 1 8 15
23 5 7 40 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
1.- Se ordenan
1 7 8 13 15 16 20 22 40
2.- Se selecciona el central
17 24 1 8 15
23 5 7 15 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
Número par de píxeles
La media de los dos
píxeles centrales
¿Cuál filtro utilizar?
>>I=imread('contornos.tif'); % Se determinan los bordes verticales>> II=edge(I, 'sobel', 'vertical'); imshow(II)
Verificar como se difuminan los bordes después de aplicar el filtro
¿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');>> d2=ordfilt2(III, 3*3, ones(3, 3), 'symmetric');>> X=uint8(1/2*(d2+d1));>>XI=edge(X, 'sobel', 'vertical'); imshow(XI)
Calidad por siguiente orden:MedianaPromedioPunto medioMedia 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
Pasos1.- 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);
>> w = fspecial('laplacian',0)
>> III = im2double(I) - imfilter(im2double(I), w);w =
0 1 0
1 -4 1
0 1 0
Realzado aplicando
Unsharp Masking (II)
Realzado aplicando
Filtrado HighboostPasos
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
ff
ffyxgmasc ),(
),(*),( yxgkfyxg masc
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