Modelos, Control y Sistema de Visión

Central     Modelos     Control     Visión     Aplicaciones     Mapa del sitio     Publicaciones     Sobre el autor      
Hardware     Imágenes     Transformaciones     Histograma     Filtros     Gradiente     Morfología      
Los filtros espaciales y frecuenciales
 

                                                    Presentación  

 

El filtrado es un tipo de operación que altera el valor de un píxel en función de los valores de los píxeles que le rodean, es por ello que a este tipo de procesamiento de la imagen también se le denomina procesamiento basado en la vecindad u operación de vecindad. El término “espacial” se utiliza para distinguir que la alteración del píxel se realiza dependiendo de los valores de los píxeles del entorno sin realizar ninguna modificación previa de sus valores, lo cual no ocurre con el filtrado frecuencial, que requiere de la aplicación de la transformada de Fourier.

Si la función utilizada para alterar el valor del píxel depende de forma lineal de los píxeles del entorno entonces se aplica un filtrado espacial lineal. En cualquier otro caso, se aplicaría un filtrado espacial no lineal.

 
 
Filtrado espacial lineal

Para aplicar un filtro a la imagen se necesario definir una matriz que contendrá los coeficientes del filtro, lo que a su vez define los píxeles del entorno que serán utilizados como argumento del filtro lineal que alterará el valor del píxel. A esta matriz se le denomina máscara y tiene una dimensión [m, n].
 
 
Es evidente que el uso de máscaras basadas en matrices impares es más común, puesto que tienen un único punto central. En el caso que la matriz no sea cuadrada se puede suponer que el píxel central sea el que se orienta a la región inferior izquierda. Por ejemplo, una matriz de orden [3,4] tendría su centro en [2,2]; mientras que una matriz de orden [4,3] tendrá su centro en [3, 2].

El filtrado espacial se basa en aplicar la siguiente ecuación
 
                                                             (1)
 
donde se cumple que: m = 2a + 1 y n = 2b + 1. La variable w(s,t) representa a los términos de la matriz de máscara de tamaño [m, n] y f(x+s,y+t) el valor de los píxeles de la vecindad definida por la máscara. Cuando s=0,t=0 entonces se identifica al píxel w(0,0) que es el centro de la máscara y al píxel de la imagen f(x,y), que será el píxel a alterar utilizando m x n píxeles de su entorno.
 
Supóngase que se define la siguiente máscara:
w =
8 1 6
3 5 7
4 9 2
La misma tiene m=3 filas (a = (3-1)/2 = 1) y n=3 columnas (b = (3-1)/2 = 1). Las variables equivalentes se representan en la siguiente matriz
 

 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)

 816
3 5 7
4 92

 

Que se aplicará para realizar el filtrado sobre la imagen de tipo uint16 representada por la siguiente matriz:

f =
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

 

Si se le aplica el filtro al píxel f(3,2), entonces la vecindad del píxel queda representada por:


 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)

 2357
4 6 13
101219
 
Al aplicar la ecuación (1) resulta:
 
(2)
 
Lo que equivale a:

g(3,2) = 8*23+1*5+6*7+3*4+5*6+7*13+4*10+9*12+2*19 = 184+5+42+12+30+91+40+108+38
         = 550
 
Como resultado de aplicar el filtro se sustituiría el valor del píxel f(3,2)=6 por g(3,2)=550.
 
El filtrado lineal enfrenta el problema de cómo tratar la vecindad de los píxeles que constituyen el contorno de la imagen. Por ejemplo, cuando se pretende aplicar la máscara w(s,t) al píxel f(1,1) resulta que existen valores de f(x+s, y+t) de (1) que se desconocen, tal y como muestra la siguiente figura
 
 
Para resolver el problema anterior se adicionan píxeles de relleno a la matriz que representa a la imagen, de forma tal que existan píxeles definidos cuando el término que representa al valor inferior derecho de la máscara se coloca sobre el píxel f(1,1) de la imagen. Por ejemplo en el caso de la figura anterior sería:
 
                  
 
donde los cuadros en blanco representan los píxeles de relleno que se han incorporado para poder aplicar la máscara en la zona superior e izquierda de la imagen.

El algoritmo de filtrado lineal está formado por los siguientes pasos:
1.- Definir la máscara.
2.- Aplicar los píxeles de relleno.
3.- Aplicar la ecuación (1) a todos los píxeles (x,y) utilizando la máscara definida en el paso 1.

   

En el filtrado lineal existen dos conceptos estrechamente relacionados: correlación y convolución. La primera se basa en utilizar la máscara como se ha explicado previamente. La convolución, por su parte, se basa en rotar 180o la máscara antes de aplicar la ecuación (1). Un ejemplo de rotación de una máscara se muestra a continuación

 

 246
357
102030
Máscara original
 302010
7 5 3
642
Máscara rotada 180o

 

Máscaras generales para aplicar filtros lineales

Se describen a continuación algunas máscaras de uso común para aplicar filtros lineales a una imagen


Filtro promedio
Es el promedio de los píxeles (formado por la matriz de tamaño mxn) que rodean al pixel f(x, y) de la imagen, responde a (de (1)):

 

                                                               (3)

 

Por lo que la máscara estaría formada por una matriz de orden mxn donde todos sus valores serían 1/mxn. Por ejemplo, una máscara de orden [3, 3] sería:

>> w=fspecial('average',3)
w =
0.1111 0.1111 0.1111
0.1111 0.1111 0.1111
0.1111 0.1111 0.1111

Nótese que cada elemento es 1/9.

 

Existe una variación de este tipo de filtro que se le denomina filtro promedio ponderado, donde los píxeles se multiplican por coeficientes diferentes al 1, ello es:

 

                                                                        (3.1)

 

Es común dar más peso al parámetro que acompaña al píxel central para que este tenga más influencia en el cálculo del promedio. Lo anterior se realiza debido a que ello permite reducir el difuminado en el proceso de suavizado. A continuación se muestra un ejemplo de máscara en la que el denominador de (3.1) es 16. 

 

1 21
2 4 2
121

 

Una foma más general de este tipo de máscara es la que se representa a continuación

 

1 c1
c c2 c
1c1

 

donde el denominador de (3.1), que representa la suma de los elementos que conforman la máscara, es [c+2]2.

Este tipo de filtros se los considera filtros pasobajo, siendo positivos todos los elementos que conforman la máscara.

 

Filtro Laplaciano

Se basa en crear una máscara que destaque los píxeles (a través del aumento de su nivel de gris) cuya variación, con respecto a su vecindad, es significativa. A este tipo de filtro se le denomina sharpening, que puede traducirse como enfoque de la imagen, ya que destaca los detalles finos, bordes y otras discontinuidades de la misma a través de la aplicación de un filtro pasoalto.

Si existiese una imagen formada por una matriz de una única fila, se podría calcular la variación de un píxel con respecto a su vecino aplicando el diferencial discreto de primer orden, ello es:

 

                                                                                         (4)

Si se aplica el diferencial de segundo orden, resulta:

 

         (5)

El Laplaciano se define como el diferencial de segundo orden con respecto a dos variables. Ello es:

 

                                                                                 (6)

Los términos derivativos se calculan como una extensión de (5):

 

                                                          (7)

 

                                                          (8)

Si se sustituyen (7) y (8) en (6) resulta:

 

                (9)

 

Lo que es equivalente a una máscara de la forma:

 

 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)

 010
1 -4 1
0 10

 

que se puede representar en Matlab a través de:

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

 

Nótese en la ecuación (9) que la suma de dos variables (un término) representa a la horizontal referido al píxel central, mientras otro término representa a la vertical. Si se desea incorporar la variación de los píxeles diagonales con respecto al central, se deben incorporar dos nuevos términos a (9), lo que provocaría que ahora la variable a sustraer es 8f(x,y).

 

La anterior consideración es la base para una máscara alternativa que permite aplicar el filtrado laplaciano utilizando la información que contienen todos los píxeles de la vecindad:

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

 

Basado en lo anterior, se puede definir una forma más general de aplicar el filtro laplaciano, utilizando la siguiente 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/(1+a)(1-a)/(1+a)a/(1+a)
(1-a)/(1+a) -4/(1+a) (1-a)/(1+a)
a/(1+a) (1-a)/(1+a)a/(1+a)

 

que es en lo que se basa la función fspecial('laplacian',a) anteriormente utilizada.

 

Otra variante en las máscaras laplacianas son la inversión del signo de los elementos que conforman la misma, como pueden ser

 

 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)

 0-10
-1 4 -1
0-10

 

 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)

 -1-1-1
-1 8 -1
-1-1-1

 

Otra alternativa a la aplicación de la máscara laplaciana (9), para preservar la información del entorno de la imagen, es sumar o restar a la imagen original la imagen resultante de aplicar el filtro laplaciano en función de si el píxel central de la máscara aplicada es positivo (se suma) o negativo (se resta), ello es:

 

                                                                                (9.1)

Lo anterior puede simplificarse en un único proceso. Si se sustituye (9) en la primera expresión de (9.1) resulta:

 

                                                       (9.2)

Lo cual equivale a:

 

                                                     (9.3)

 

Las máscaras equivalentes a la anterior expresión (incluyendo, adicionalmente, los píxeles de la diagonal) se muestran a continuación

 

 0-10
-1 5-1
0-10
-1-1-1
-1 9-1
-1-1-1

 

Es importante destacar que el filtro laplaciano, al basarse en el diferencial de los píxeles de la vecindad, destaca las variaciones en las tonalidades de gris, mientras que atenúa la semejanza entre estos niveles.

 

Filtro gausiano

Responde a la siguiente ecuación:

 

                                                                                                     (10)

 

donde el término sigma influye en el tamaño de la máscara, tal y como se aprecia en la siguiente figura

 

 


[x,y] = meshgrid(-4:.1:4);
ro=.75;
g=(exp(-(x.^2+y.^2)/(2*(ro.^2))))/(2*pi*(ro.^2));
mesh(x,y,g);

 

Nóquese que a pesar de que el filtro responde a una máscara basada en la ecuación no lineal (10), el filtro sigue siendo lineal, puesto que se aplica a partir de la expresión (1), donde los términos w(s,t) se obtienen como se ilustra a continuación

 

 

 

Para obtener una máscara de orden [3, 3] correspondiente a un filtro gausiano se utiliza la siguiente función

>> fspecial('gaussian',3,0.5)

ans =
0.0113 0.0838 0.0113
0.0838 0.6193 0.0838
0.0113 0.0838 0.0113

 

Filtro laplaciana de la gausiana

Es el resultado de aplicar la segunda derivada (el laplaciano) sobre la ecuación que define al filtro gausiano. Responde a la siguiente ecuación:

 

                                                                              (11)

 

La siguiente figura muestra una representación de este tipo de filtro  

 

 


[x,y] = meshgrid(-3:.1:3);
xx=[-3:.1:3];
ro=.5;
g=(1./(pi.*(ro.^4))).*(1-(x.^2+y.^2)/(2.*ro^2)).*(exp(-(x.^2+y.^2)/(2*(ro.^2))));
mesh(x,y,g);

 

El método para obtener la máscara w(s,t) es similar al filtro gausiano. En Matlab se obtiene a través de la función

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

 

que en este caso es la representación de (11) pero con signo negativo.

 

Filtrado espacial no lineal

 

Cuando se aplica un filtro no lineal se sustituye el píxel central por el resultado de aplicar una función no lineal que depende de los píxeles de la vecindad. Su aplicación fundamental es para suprimir ruido de la imagen, haciendo que los puntos con niveles de gris distintos sean más parecidos a los de su vecindario. Algunos filtros no lineales son:

 

Media geométrica:

                                                                                (12)

 

Media armónica:

                                                                                             (13)

 

Media contrarmónica:

                                                                                       (14)

 

donde Q es el orden del filtro

 

Max:

                                                                                    (15)

 

Min:

                                                                                    (16)

 

Punto medio:

                                                   (17)

 

Mediana:

La mediana, m, de un conjunto de valores es aquella en la que la mitad de los valores en el conjunto son menores o iguales que m, y la otra mitad es mayor o igual a m. Esta se calcula, para determinada vecindad, ordenando numéricamente el valor de los píxeles y sustituyendo el píxel objeto de filtrado por el valor central de los píxeles ordenados. Si el número de píxeles es impar, se calcula el promedio de los dos centrales.

 

El filtro mediana es una importante alternativa para la reducción del ruído, sin difuminar la imagen, como ocurre con el filtro promedio.

 

Algunas funciones de Matlab que se utilizan para implementar los filtros no lineales son: ordfilt2 y medfilt2.

 

Existen otros tipos de filtros lineales, pero al tener estrecha relación con operaciones como la detectección de bordes, serán tratados en otro apartado.

 

Filtros en el dominio de la frecuencia

                                                Presentación

% PROGRAMA PARA EL FILTRADO EN EL DOMINIO DE LA FRECUENCIA

%Recalcula la magnitud que tendrá F(u) y H(u)

%(el relleno será de ceros)

PQ=paddedsize(size(f)); % f, imagen

% Se obtiene la transformada

F=fft2(f, PQ(1), PQ(2));

% Porciento del ancho de la imagen en D0

DO=0.05*PQ(2);

% Se define el filtro

H=hpfilter('gaussian', PQ(1), PQ(2), DO);

% Se enfatiza

H=0.5+2*H;

% Se multiplica la transformada por el filtro

G=H.*F;

% Se obtiene parte real de la Transformada inversa

g=real(ifft2(G));

% Se restituye tamaño original de la imagen

g=g(1:size(f,1), 1:size(f,2));

% Se ajusta la escala de grises

gg=gscale(g);

% Se ecualiza el histograma (opcional)

g=histeq(gg);

imshow(f)

figure

imshow(g)

Referencias:

 

Gonzalez, R.; Woods, R.; Eddins, S.: Digital Image Processing using Matlab. Prentice Hall. 2004.