Modelos, Control y Sistema de Visión

Central     Modelos     Control     Visión     Aplicaciones     Mapa del sitio     Publicaciones     Sobre el autor      

Los filtros: Supresión del ruido y nitidez

 

  • Función imfilter
     

 

Es la función fundamental para aplicar un filtro lineal a una imagen, los parámetros fundamentales son:

% Relleno de píxeles

X: Constante que define a los píxeles de relleno

'replicate': Los píxeles de relleno son una copia del valor de los píxeles de la periferia de la imagen

'symmetric': Los píxeles de relleno son el resultado de aplicar un "espejo" tomando como referencia los píxeles del borde exterior.

 

% Orientación de la máscara

'corr': Correlación, la máscara se aplica tal y como es definida.

'conv': Convolución, se rota 180o la máscara que ha sido definida y posteriormente se aplica al filtro.

 

% Resultado del filtro

'full': El resultado es la imagen más los píxeles de relleno

'same': El resultado es el tamaño original de la imagen 

 

Método de relleno de píxeles

Para ilustrar el efecto de los diferentes métodos de relleno sobre el filtrado de la imagen se define una máscara que no alterará la imagen original:

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

 

y se aplicará sobre la siguiente matriz que representa a una imagen

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

 

Las matrices que representan a las imágenes resultantes se muestran a continuación:

%Relleno de una constante
252525252525252525
252525 25 25 252525 25 
2525  123 2 25 25
2525 -1-2 -3 -2-1 2525 
2525  1  2  3  225 25 
2525 -1 -2-3 -2 -1 25 25 
2525  1   2 225 25 
2525 25 25  2525 25 25 25 
2525 25 25  2525 25 25 25 
>> imfilter(f,w,25,'full')
 
% Relleno basado en la réplica de píxeles
111232111
111232111
11 123 2 11
-1-1-1-2 -3 -2-1 -1-1
11 1  2  3  211
-1-1-1 -2-3 -2 -1 -1-1
1 1   2 21
111 2 32111
1112 32111
>> imfilter(f,w,'replicate','full')
 
% Relleno basado en el "espejo" de los píxeles del entorno
-2-1-1-2-3-2-1-1-2
211232112
21 123 2 12
-2-1-1-2 -3 -2-1 -1-2
21 1  2  3  212
-2-1-1 -2-3 -2 -1 -1-2
2 1   2 322
211 232112
-2-1-1-2-3-2-1-1-2
>>imfilter(f,w,'symmetric','full')
 
Imagen resultante incluyendo relleno
% Incluye píxeles de relleno
 
000000000
00000000
0 123 2 00
00-1-2 -3 -2-1 00
00 1  2  3  200
0-1 -2-3 -2 -1 0
0 1   2 200
0000 0000
000000000
>> imfilter(f,w,0,'full')
 
% No incluye píxeles de relleno
 12321
-1-2  -3-2  -1
12 31
-1-2 -3 -2 -1 
121
>> imfilter(f,w,0,'same')
 
Comparación entre la convolución y la correlación
Ahora la imagen se representa por:
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

y la máscara por
w =
1 2 3
4 5 6
7 8 9
% Aplicación de la correlación (implícita)
 00000
09 87 0
06 540
0310
0000
>> imfilter(f,w,'corr')
 
% Aplicación de la convolución
 00000
01 23 0
04 560
0790
0000

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

 

Nótese que el resultado de la convolución es la misma que la correlación, pero rotada 180o. Ello es debido que el proceso de convolución es el mismo que el de la correlación, pero aplicando una rotación previa a la máscara.

 

  • Imágenes ruidosas

 

El ruido es un deterioro de la imagen que puede producirse debido a: los píxeles perdidos en un sensor CCD, cuando se comprime o transmite la imagen, existe inadecuada iluminación de la escena o la sensibilidad de las cámaras al infrarrojo, entre otros.

 

A efectos de experimentos, se puede incorporar ruído a una imagen

% Ejemplo de incorporación de 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)

 

% Otros tipos de ruido
III=imnoise(I,'poisson');
IV=imnoise(I,'salt & pepper');              % Saturación de carga de un píxel por exceso o defecto
V=imnoise(I,'speckle');

Los resultados de aplicar diferentes tipos de ruído a una imagen se muestra a continuación

 

 

Enlace_fuente (Imagen original)

II = imnoise(road,'gaussian',0,15^2);

III=imnoise(I,'poisson');

IV=imnoise(I,'salt & pepper');

V=imnoise(I,'speckle');

 

  • Reducción de ruido con filtrado no lineal (mediana)

 

En la imagen que se muestra a continuación se destaca el detalle del ruido. Como se puede apreciar, este es un cambio brusco en los niveles de gris en determinada región de la imagen. Para detectar bordes, es este cambio de nivel el que deberá identificarse. Considerando lo anterior, la supresión de ruido es una tarea cuyo objetivo es suavizar las variaciones bruscas de niveles de gris sin que ello difumine los bordes, base para la detección de contornos y la extracción de características de la imagen.

 

 

Los filtros no lineales se aplican para la reducción de ruido, en la medida en que devuelven un valor que depende de las magnitudes de los píxeles de la vecindad.


Si se toma como ejemplo la mediana, y los píxeles a los que se le pretende determinar la mediana son {23, 34, 167, 42,36, 178, 167, 152, 181}, si se ordenan de menor a mayor resulta {23, 34, 36, 42, 152, 167, 167, 178, 181}. El valor del píxel central es el quinto {152}, que es la mediana. Lo anterior se comprueba a través del valor devuelto en el píxel central como resultado de aplicar la siguiente función en Matlab

a =
23   34  167
42   36  178
167 152 181

>> medfilt2(a)
ans =
0   34   0
34 152 36
0   42   0

Para obtener la mediana se utiliza la función:
>> medfilt2(f, [m, n], ‘symmetric’);
donde [m, n] representa el tamaño de la máscara que se toma como referencia para seleccionar los píxeles de la vecindad donde se buscará la mediana que sustituirá el valor del píxel de la imagen original. Este es el parámetro crítico que permitirá reducir el ruído sin difuminar los detalles de la imagen.

Como ejemplo, si se ejecuta la siguiente secuencia de programa, donde se aplica la mediana con máscaras de diferente tamaño y se aplica el mismo filtro de Sobel a ambas:

 

I=imread('ruidoborde.jpg');

II=medfilt2(I, [3, 3], 'symmetric');    % Mediana de tamaño [3, 3]
III=medfilt2(I, [5, 5], 'symmetric');  
% Mediana de tamaño [5, 5]

% Detección de bordes horizontales de Sobel
w=fspecial('sobel');

w =
 1   2   1
 0   0   0
-1 -2  -1
IV=imfilter(II, w, 'symmetric');
V=imfilter(III, w, 'symmetric');

 

resulta las siguientes imágenes

 

 

 

donde se puede apreciar claramente que con el aumento del tamaño de la máscara se ha reducido el ruído, a costa de la pérdida de información de los bordes en la imagen.

 

  • Reducción de ruido con otros métodos de filtrado

 

Se muestra a continuación la variación de un píxel (central) dependiendo del método de filtrado no lineal utilizado.

Sea la matriz que representa la imagen

a =
23   34  167
42   36  178
167 152 181

 

El valor del píxel central es 36

% Resultado de aplicar el "promedio"

>> w=fspecial('average');
>> b=uint8(imfilter(a, w, 'symmetric'))
b =
31   78   125
76   109 142
121 140  158

 

% Resultado de aplicar la "media armónica"

>> c=uint8(3*3./imfilter(1./a, ones(3, 3), 'symmetric'))
c =
29  42  74
43  58  92
80  96 121

 

% Programa para obtener el "punto medio"
>> d1=ordfilt2(a, 1, ones(3, 3), 'symmetric')   %Mínimo
d1 =
23 23 34
23 23 34
36 36 36
>> d2=ordfilt2(a, 3*3, ones(3, 3), 'symmetric') %Máximo
d2 =
42   178 178
167 181 181
167 181 181

% Punto medio
>> d=uint8(1/2*(d2+d1))
d =
33   101 106
95   102 108
102 109 109

Nótese la gran variación entre los niveles de gris en el píxel central si se comparan entre sí los métodos anteriores de filtrado. La anterior comparación puede ser útil para escoger cuál de ellos es mejor para una imagen particular. Por ejemplo, en la imagen anterior, son predominantes los grises por lo que se rechazaría la aplicación del "mínimo" y la "media armónica", que devuelven valores próximos al negro.

 

  • Comparación entre diferentes métodos de reducción de ruido

 

Para comparar los diferentes métodos de reducción de ruido se aplicarán diferentes filtros de un mismo tamaño [3, 3] a una imagen ruidosa y se aplicará el método de Sobel de detección de bordes vertical para comparar el efecto que tiene en difuminar los bordes de la imagen

>>I=imread('contornos.tif'); % Imagen de imagenprocessingplace.com
% Se determinan los bordes verticales
>> II=edge(I, 'sobel', 'vertical'); imshow(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)

% 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)

% 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)

 

 

Imagen original

II=edge(I, 'sobel', 'vertical');

III=imnoise(I,'salt & pepper',0.005);

V (mediana)

VII (filtro promedio)

IX (media armónica)

XI (punto medio)

 

Como se puede apreciar, la mejor capacidad de filtrar el ruído manteniendo los bordes verticales para esta aplicación es en el siguiente orden: mediana, promedio, punto medio y media armónica.

 

  • Mejora de la nitidez con el filtro laplaciano

 

La aplicación fundamental del filtro laplaciano es aumentar la nitidez (destacando los detalles) de la imagen, al afinar las líneas de transición de niveles de gris.

 

Como se ha expuesto en filtros, el valor central de la máscara de los filtros laplacianos es negativo (4 a 8 veces superior) que los parámetros del entorno. Esto crea el problema de que la imagen quede muy oscura después de aplicar el filtro al aproximar los valores negativos a cero. Para atender este problema se suele aumentar el tipo de la imagen y sustraer a la imagen original la imagen resultante.

 

% Aplicación normal del filtro laplaciano

>> w=fspecial('laplacian',0)
w =
0  1  0
1 -4  1
0  1  0

>> II=imfilter(I,w);

 

% Aplicación del filtro laplaciano a través de la sustracción de imágenes

>> w=fspecial('laplacian',0)
>> III=im2double(I)-imfilter(im2double(I), w);

 

% Otra máscara para aplicar el filtro

>> w=fspecial('laplacian',.5).*3
w =
1  1  1
1 -8 1
1  1  1

>> IV=im2double(I)-imfilter(im2double(I), w);

 

 

Image original (I)

II

III

 

IV