PROCESAMIENTO DE IMÁGENES EN MATLAB MANEJO DE FILTROS Forero Frasser, Carlos1; Rodríguez Barrero, Jhonattan 2; Gordillo
Views 117 Downloads 0 File size 3MB
PROCESAMIENTO DE IMÁGENES EN MATLAB MANEJO DE FILTROS Forero Frasser, Carlos1; Rodríguez Barrero, Jhonattan 2; Gordillo Porras, Nicolas3. 1. [email protected] 2. [email protected] 3. [email protected]
Abstract: this paper is about how MATLAB is useful to processing images, MATLAB offers different
II.
OBJETIVOS
General:
commands that the user could use to manipulate images through filters, spatial filters and frequential
una imagen digital usando MATLAB.
filters. Processing techniques using filters allow processing pixel by pixel by region or processing,
Aplicar distintos métodos de procesamiento a
Específicos:
which is very versatile for the user. These techniques are a powerful tool to connect the Digital Processing
Conocer y aplicar los diferentes algoritmos
Image World with applications in the real life, where
de filtros espaciales y filtros frecuenciales
it is required to eliminate noise and improve the
para imágenes por medio de MATLAB.
quality of an image.
Aprender a diferenciar el uso de distintos filtros dependiendo de la aplicación para el
I.
INTRODUCCIÓN
procesamiento de la imagen.
En este informe se desarrollarán procedimientos útiles para procesar imágenes por medio de filtros
III.
DESARROLLO Y ANÁLISIS
tanto el dominio del espacio como en el de la frecuencia
utilizando
ampliamente
m-files
y
mostrando una breve introducción por medio de Simulink. Se incluirán filtros lineales como, el filtro promedio aritmético y el filtro promedio ponderado, filtros no lineales como el filtro de máximo y el filtro de mediana y filtros de frecuencia. Se utilizaran algunos comandos como imfilter, ordfilt2, fftshift, entre otros.
IMPLEMENTACION DE EJEMPLOS A continuación se desarrollaran y analizaran los ejemplos propuestos en la guía para dar una introducción al procesamiento de imágenes por medio de filtros 1. Filtros en el dominio espacial 1.1. Filtros de reducción de ruido 1.1.1.
Procesamiento de imágenes digitales.
Filtros lineales
Página 1
1.1.1.1. Filtro de promedio aritmético
Se pierden algunos detalles y efectivamente se
Los filtros lineales utilizan como base la operación
produce un efecto de suavizado en la imagen debido
convolución entre una máscara con coeficientes
a que el filtro opera de tal manera que en la imagen
determinados y la imagen a procesar.
procesada sus pixeles serán el resultado de un promedio entre sus vecinos cercanos, donde la
I=imread('Figura_F1.jpg'); h=ones(5,5)/25; I2=imfilter(I,h); imshow(I), title('Imagen Original'); figure; imshow(I2), title('Imagen Filtrada')
cantidad de estos dependen del tamaño de la máscara, por tanto entre mayor sea la máscara mayor será el número de vecinos a ese pixel que aportaran a su nuevo valor en la imagen filtrada.
Con el anterior código cargamos una imagen a color
Además debido al tamaño de la imagen no se nota
en Matlab (I), hacemos una máscara 5x5 con
muy claramente el borde negro que apareció de
coeficientes iguales a 1/25 (h) y aplicamos el filtro
repente en la imagen filtrada y que es debido a que los
(I2).
pixeles de borde no tiene vecinos completos es decir, al aplicar la máscara cuadrada no encontrará pixeles
Imagen original
en las coordenadas que exceden la imagen y por tanto no se podrá hacer el promedio, sin embargo por defecto se asignan a estos pixeles un valor de 0, es decir negro. Esto se puede corregir con la siguiente adición al comando: I2=imfilter(I,h, 'replicate',);
De esta forma en el momento de hacer el promedio se toman los valores de los pixeles que se encuentran en Imagen Filtrada
el límite de la imagen y se los de a los pixeles de la máscara que caen fuera de la imagen.
MATLAB también puede crear las máscaras para
filtros
predefinidos
que
no
necesariamente se encuentran dentro de la categoría de filtros de reducción de ruido, algunos cumplen otro propósito. Por medio de la función fspecial. Las máscaras predefinidas son:
Procesamiento de imágenes digitales.
Página 2
'average'
averaging filter
Notamos que este filtro de promedio circular produce
'disk'
circular averaging filter
un efecto aún más notorio de suavizado, por supuesto
'gaussian'
Gaussian lowpass filter
'laplacian'
filter
approximating
conservando menos detalles. the
2-D
1.1.1.2. Filtro de promedio ponderado
Laplacian operator 'log'
Laplacian of Gaussian filter
I=imread('Figura_F2.jpg');
'motion'
motion filter
IG=rgb2gray(I);
'prewitt'
Prewitt
horizontal
edge-
emphasizing filter
h=[1 2 1;2 4 2;1 2 1]; I2=filter2(h,IG); imshow(I), title('Imagen Original');
'sobel'
Sobel horizontal edge-emphasizing
filter
I2=uint8(I2); figure; imshow(I2), title('Imagen Filtrada')
Ya que 'average' corresponde al filtro de promedio aritmético utilizaremos para el ejemplo 'disk' que
Imagen Original
corresponde al filtro de media circular, este comando devuelve un filtro de promedio circular dentro de la matriz cuadrada de lado 2*r + 1, donde el radio por defecto es 5. I=imread('Figura_F1.jpg'); h=fspecial('disk',6); I2=imfilter(I,h, 'replicate',); imshow(I2), title('Imagen Filtrada')
El comando filter2 efectivamente necesita de algunas consideraciones especiales a lo hora de usarlo, como por ejemplo convertir su tipo de variable de salida a
Procesamiento de imágenes digitales.
Página 3
entero de 8 bits para poder visualizar correctamente la
1.1.2.1. Filtro de mínimo
imagen filtrada y tener cuidado porque solo maneja imagen en escala de grises.
Primero debemos añadir ruido a nuestra imagen a filtrar, con el comando imnoise, y debemos tener en
Imagen Filtrada
cuenta que debemos trabajar con la imagen a escala de grises.
I=imread('Figura_F2.jpg'); IG=rgb2gray(I); In=imnoise(IG); I2=ordfilt2(In,1,ones(3,3)); imshow(IG), grises');
title('Imagen
a
escala
de
figure; imshow(I2), title('Imagen Filtrada')
El comando ordfilt2 permite trabajar con diversos ordenes de filtro que van desde 1 hasta MxN (tamaño de la máscara). Si seleccionamos 1, el filtro será de mínimo. Imagen Original
La conservación de los detalles respecto al filtro de promedio aritmético es mucho mejor, debido a que toma en cuenta los pesos de los pixeles más cercanos, independientemente del tamaño de la máscara.
1.1.2.
Filtros No Lineales
Los filtros no lineales, también se basan en operaciones con los pixeles vecinos, por medio del deslizamiento de una máscara sobre la imagen, pero a diferencia de los filtros lineales, las operaciones realizadas entre los pixeles de la máscara no son lineales.
Procesamiento de imágenes digitales.
Página 4
Imagen Filtrada
I=imread('Figura_F2.jpg'); IG=rgb2gray(I); In=imnoise(IG); I2=ordfilt2(In,9,ones(3,3)); imshow(I2), title('Imagen Filtrada')
Seleccionamos 9 en el comando ordfilt2 para garantizar que el filtro sea de máximo, ¿Por qué 9? Porque corresponde al tamaño de la máscara. Lo que nos garantiza que el filtro eliminara todos los valores de ruido ‘0’ es decir negro, obtendremos una imagen con solo puntos blancos. Este filtro elimina el ruido de tipo pimienta.
1.1.2.3. Filtro de mediana
El filtro de mínima elimina el ruido tipo sal.
Tomamos como orden del filtro un valor que corresponde a la mediana entre 1 y MxN (Tamaño de
1.1.2.2. Filtro de máximo Imagen Filtrada
la máscara), de esta forma filtramos tanto valores bajos como altos del ruido es, decir este filtro elimina el ruido tipo sal y pimienta.
Procesamiento de imágenes digitales.
Página 5
2. Filtros en el dominio de la frecuencia
Imagen resultante de aplicar la transformada de Fourier
La convolución espacial entre dos funciones, es equivalente a la multiplicación de estas en la transformada de Fourier. Así que los filtros anteriormente vistos, pueden ser aplicados desde el dominio frecuencial de la misma manera, pero con la ventaja que en este dominio, su análisis puede ser más fácil. Cabe aclara que las frecuencias altas corresponden a
h=fspecial('average');
cambio bruscos entre valores de pixeles de la imagen
freqz2(h);
y las frecuencias bajas a valores homogéneos entre sí.
Imagen 3D de la respuesta en frecuencia del filtro h
Por lo general las frecuencias altas se encuentran en los bordes o alto contraste dentro de la imagen. Anteriormente observamos como un filtro de promedio aritmético suavizaba los bordes dentro de una imagen, si hacemos una analogía en el mundo frecuencial se podría decir que filtro las frecuencias altas, es decir se trata de un filtro pasa-bajas.
2.1. Filtro Pasa-bajas Imagen Original
El comando freqz2 muestra la respuesta en frecuencia del filtro que le sea seleccionado, en este caso es un filtro pasa-bajas, en la imagen los valores más altos en el filtro son las frecuencias bajas, cercanas al centro, así que al multiplicar la transformada de la imagen por la transformada del filtro de promedio aritmético, dará como resultado una imagen con frecuencias más bajas.
Procesamiento de imágenes digitales.
Página 6
resf=fft2(f).*fft2(h,30,30); rest=ifft2(resf);
Imagen Con ruido Gaussiano
res=real(rest); imshow(res);
Como resultado obtenemos una imagen cuyas frecuencias altas han sido filtradas. Se distingue el “suavizado” en sus bordes.
EJERCICIOS PROPUESTOS
Imagen Filtrada (Filtro de promedio aritmético)
Cargue una imagen en niveles de gris y añada un ruido gaussiano moderado. A=imread('Lenna.jpg'); A=rgb2gray(A); A=imnoise(A, 'gaussian'); imshow(A);
Implemente y aplique a la imagen anterior un filtro de promedio aritmético 3x3. A=imread('Lenna.jpg'); A=rgb2gray(A); A=imnoise(A, 'gaussian'); B=imfilter(A, ones(3, 3)/9);
Implemente y aplique a la imagen anterior un filtro de promedio ponderado 3x3, con la
imshow(A); figure; imshow(B);
Procesamiento de imágenes digitales.
siguiente mascara:,maska =[4 1 0; 4 1 0; 4 1
Página 7
0];
mask=mask/15;
¿Qué
diferencias
A=imread('Lenna.jpg');
encuentra entre los resultados de aplicar los
A=rgb2gray(A);
dos filtros anteriores?
A=imnoise(A, 'gaussian'); B=imfilter(A, ones(7,7)/49);
A=imread('Lenna.jpg');
imshow(A)
A=rgb2gray(A);
figure; imshow(B);
A=imnoise(A, 'gaussian'); B=imfilter(A, [4 1 0; 4 1 0; 4 1 0]/15); imshow(A) figure; imshow(B);
Reste cada imagen filtrada con la original, observe el resultado y concluya.
Con el filtro promedio ponderado se conservan mejor los detalles, aunque la imagen se ve más suavizada que la imagen con filtro aritmético, debido a que no todos los pixeles vecinos al pixel a transformar tienen el mismo peso.
Implemente y aplique a la imagen anterior un filtro de promedio aritmético 7x7
Procesamiento de imágenes digitales.
Página 8
Imagen resultante de restar la imagen original con la imagen filtrada con un filtro de promedio aritmético 3x3. Levemente se puede notar el contorno de la mujer, esto debido a que en el filtro fueron “suavizados” sus bordes, al hacer la resta se notará un poco respecto al resto de la imagen.
Imagen resultante de restar la imagen original con la imagen filtrada con un filtro de promedio aritmético 7x7. Debido a que la conservación de los detalles perdura más a medida que se aumenta la máscara y el valor nuevo de cada pixel en la imagen filtrada es más acorde a sus pixeles cercanos, el borde se ve más marcado al realizar la resta, al ser este el más Imagen resultante de restar la imagen original con la
afectado por el filtro.
imagen filtrada con un filtro de promedio ponderado con una máscara [4 1 0; 4 1 0; 4 1 0]/15. Se puede
Comparando
los
histogramas
de
las
notar el contorno de la mujer mucho más realzado
imágenes filtradas anteriormente, analice y
que en la imagen anterior, esto debido a que en el
saque conclusiones.
filtro fueron “suavizados” con más peso, es decir con una máscara cuyos valores difieren de acuerdo a su vecindad de pixel, al hacer la resta se notarán con
A=imread('Lenna.jpg'); A=rgb2gray(A); imhist(A);
más claridad los bordes respecto al resto de la imagen.
Procesamiento de imágenes digitales.
Página 9
Histograma de la imagen original
imagen a escala de grises, hacia una distribución normal. A=imread('Lenna.jpg'); A=rgb2gray(A); A1=imnoise(A, 'gaussian'); B=imfilter(A1, ones(3, 3)/9); imhist(B);
Histograma de la imagen filtrada
A=imread('Lenna.jpg'); A=rgb2gray(A); A1=imnoise(A, 'gaussian'); imhist(A1);
Histograma de la imagen con ruido Gaussiano
Amplia el rango de pixeles y trata de homogenizarlos siguiendo la distribución Gaussiana. Sacrificando cantidad de pixeles para logar mayor uniformidad en la escala de grises.
A=imread('Lenna.jpg'); A=rgb2gray(A); A=imnoise(A, 'gaussian');
Este tipo de ruido tras aumentar la cantidad de pixeles
B=imfilter(A, [4 1 0; 4 1 0; 4 1 0]/15);
negros y blancos hace tender el histograma de la
imhist(B);
Procesamiento de imágenes digitales.
Página 10
En un principio se dijo que la conservación de los detalles y el tamaño de la máscara en un filtro de promedio
aritmético
eran
proporcionales,
si
comparamos este histograma con el de la imagen original se podrá notar que se asemeja más que cualquiera de los filtros anteriores y esto se debe a que se utilizó una máscara de 7x7.
Cargue una imagen en niveles de gris y añada un ruido sal y pimienta moderado.
Se puede concluir que se pierden aún más los detalles
A=imread('Kratos.jpg');
de la imagen original, y esto se ve reflejado en que es
A=rgb2gray(A);
más notoria la distribución normal en su histograma.
A=imnoise(A, 'salt & pepper');
A=imread('Lenna.jpg'); A=rgb2gray(A);
figure; imshow(A);
A=imnoise(A, 'gaussian'); B=imfilter(A, ones(7,7)/49); imhist(B);
Implemente y aplique a la imagen anterior un filtro de mínimo 3x3. A=imread('Kratos.jpg');
Procesamiento de imágenes digitales.
Página 11
A=rgb2gray(A); A=imnoise(A, 'salt & pepper'); figure; subplot(1,2,1); imshow(A); subplot(1,2,2); B=ordfilt2(A, 1, ones(3, 3)); B=uint8(B);
Como se observa elimina el ruido tipo pimienta de la
imshow(B);
imagen pero al haber ruido sal en esta, este tipo de filtro aumenta el ruido sal empeorando la calidad de la misma notablemente. Este filtro es óptimo si la imagen solo tuviera ruido tipo pimienta.
Implemente y aplique a la imagen anterior un filtro de mediana 3x3. A=imread('Kratos.jpg'); A=rgb2gray(A);
Se observa que el ruido tipo sal desaparece de la imagen pero el tipo pimienta sigue igual.
A=imnoise(A, 'salt & pepper'); figure; subplot(1,2,1);
Implemente y aplique a la imagen anterior un filtro de máximo 3x3.
imshow(A); subplot(1,2,2); B=ordfilt2(A, 5, ones(3, 3));
A=imread('Kratos.jpg');
B=uint8(B);
A=rgb2gray(A);
imshow(B);
A=imnoise(A, 'salt & pepper'); figure; subplot(1,2,1); imshow(A); subplot(1,2,2); B=ordfilt2(A, 9, ones(3, 3)); B=uint8(B); imshow(B);
Procesamiento de imágenes digitales.
Página 12
El filtro de mediana es el mejor para eliminar los
A=imread('Figura_F5.jpg');
ruidos extremos como los son el tipo sal y pimienta,
A=rgb2gray(A);
debido a que no toma en cuenta ni el valor máximo ni el mínimo sino el valor medio de la vecindad.
A=imnoise(A, 'salt & pepper'); figure; B=ordfilt2(A, 1, ones(3, 3));
Implemente y aplique a la imagen anterior un filtro de mediana 5x5
B=uint8(B); subplot(1,2,2); imhist(B); title('Histograma 3*3 minimo');
A=imread('Figura_F5.jpg');
subplot(1,2,1);
A=rgb2gray(A);
B=A-B;
A=imnoise(A, 'salt & pepper');
imshow(B); title('Resta 3*3 minimo');
figure;
figure;
subplot(1,2,1);
C=ordfilt2(A, 9, ones(3, 3));
imshow(A);
C=uint8(C);
subplot(1,2,2);
subplot(1,2,2); imhist(C);
B=ordfilt2(A, 13, ones(5, 5));
title('Histograma 3*3 maximo');
B=uint8(B);
subplot(1,2,1);
imshow(B);
C=C-A; imshow(C); title('Resta 3*3 maximo'); figure; D=ordfilt2(A, 5, ones(3, 3)); D=uint8(D); subplot(1,2,2); imhist(D); title('Histograma 3*3 media'); subplot(1,2,1); D=A-D;
El resultado es bastante similar al filtro de mediana de 3x3, sin embargo no se observan grandes diferencias visualmente con respecto a este, excepto una leve variación en la conservación de detalles.
ejercicios anteriores, por medio de sus y
restando
las
figure; E=ordfilt2(A, 13, ones(5, 5)); E=uint8(E); subplot(1,2,2);
Compare y concluya con respecto a los
histogramas,
imshow(D);title('Resta 3*3 media');
imágenes
filtradas con sus imágenes originales.
Procesamiento de imágenes digitales.
imhist(E); title('Histograma 5*5 media'); subplot(1,2,1); E=A-E; imshow(E); title('Resta 5*5 media');
Página 13
En las 2 primeras imágenes se puede observar que los filtros mínimo y máximo no filtran todo el ruido añadido a la imagen e inclusive logran aumentar el efecto ya sea de la sal o la pimienta en esta. Además se puede observar que sus histogramas no tienen tantos componentes en gamas de grises intermedios sino que tienen una gran cantidad ya sea en 0 o en 255. En las otras dos imágenes se observa que el histograma tiene un pico en la gama de grises oscura, son suavizadas y no tiene casi componentes en 0 y 255, esto se debe a que este filtro es especialmente efectivo a la hora de eliminar el ruido sal y pimienta. Es importante resaltar que no existe una gran diferencia en los histogramas de los filtros de media, haciendo esto que se pudiera decir que son prácticamente iguales. Cree un filtro pasa altas y aplíquelo a una imagen cualquiera, diséñelo desde el dominio frecuencial y aplíquelo desde el dominio espacial. Nota: Utilice las funciones filter2 y ftrans2 si es necesario.
Procesamiento de imágenes digitales.
Página 14
Un filtro pasa-altas, elimina las frecuencias bajas, en imágenes estas frecuencias corresponden a aquellos cambios leves o nulos entre pixeles, por tanto al aplicar este filtro deben mantenerse los contornos de la figura, debido que allí se presentan las frecuencias altas. mask=[1 2 1;1 -10 1;1 2 1]/20; freqz2(mask);
Como era de esperarse se mantienen las frecuencias altas que corresponden al contorno en este caso del rectángulo interior.
Ahora utilizamos una imagen diferente Imagen original
Utilizando la imagen del ejemplo para el filtro pasabajos, obtenemos: resf=fft2(f).*fft2(h,30,30); rest=ifft2(resf);
Imagen a escala de grises
res=real(rest); imshow(res);
Procesamiento de imágenes digitales.
Página 15
Ahora utilizando la misma mascara aplicamos el filtro
Para un filtro pasa-altas se debe especificar ‘high’ en
pasa-bajas a la imagen a escala de grises, debido a que
el comando fir1.
trabajar la imagen a color genera un conflicto entre dimensiones de la matriz al hacer la convolución entre la transformada de Fourier de la imagen y la del filtro.
A=imread('Figura_F6.png'); A=rgb2gray(A); h1=fir1(5,0.05,'high'); h2= ftrans2(h1);
mask=[1 2 1;1 -10 1;1 2 1]/20; freqz2(mask);
freqz2(h2);
resf=fft2(f).*fft2(h,30,30); rest=ifft2(resf); res=real(rest); imshow(res);
resf=fft2(A).*fft2(h2,size(A,1),size(A,2));
Los cambios bruscos entre pixeles, se definen como las frecuencias altas así que al multiplicar la
rest=ifft2(resf); res=real(rest); imshow(res);
transformada de la imagen por la transformada del filtro con la máscara indicada, dará como resultado una imagen con las frecuencias más altas.
¿Qué pasa si queremos generar una máscara apropiada sin necesidad de que el usuario nos la proporcione? Para esto utilizaremos el comando fir1 que sirve para el diseño de filtros de forma arbitraria por el método de muestreo de frecuencia y el comando ftrans2 que sirve para transformar esos coeficientes dados por fir1 en una matriz.
Procesamiento de imágenes digitales.
Página 16
La imagen resultante conserva las frecuencias altas a
Imagen 2
las cuales les asignó un valor de pixel ‘0’ (negro) mientras que a las bajas les asignó un valor de 255 (blanco). Totalmente opuesto al caso anterior. Analice en el dominio de la frecuencia las dos imágenes
en
degradado
horizontal
y
diagonal, como las imágenes que se muestran a continuación. ¿Qué diferencias tienen? Que significan las rayas verticales que aparecen en transformada de la Imagen 1(diagonal)? Imagen 1
Al realizar la transforma de Fourier de la imagen obtenemos:
Al realizar la transforma de Fourier de la imagen obtenemos:
Procesamiento de imágenes digitales.
Página 17
SIMULINK
Ajuste de contraste
Ajustamos los parámetros del bloque Contrast Adjustement -Adjust pixels values from: User-defined range. Range: [0 200] -Adjust pixels values to: User Defined range. Range: [0 255]
Ajustamos los parámetros del bloque Contrast Adjustement -Adjust pixels values from: User-defined range. Range: [0 100] -Adjust pixels values to: User Defined range. Range: [0 255]
Es interesante analizar como el contorno de la imagen se mantiene tan solo ajustando el contraste.
Procesamiento de imágenes digitales.
Página 18
Imagen original
Esta imagen resultante es similar a la obtenida al
Histograma de la imagen a color
hacer un procedimiento un poco más complejo con la aplicación de filtros en el dominio espacial en m-files. Por supuesto los resultados difieren en los pixeles que son totalmente blancos o totalmente negros ya que no se ven afectados por el cambio de contraste.
Visualización del histograma
El valor de los ejes esta automático razón por la cual se puede apreciar que no se alcanza a llegar a la cantidad de pixeles máximos de la imagen.
Procesamiento de imágenes digitales.
Página 19
Histograma de la imagen a escala de grises
Imagen filtrada
Los detllaes de este histograma difieren bastante al obtenido por m-files, debido en parte al número de muestras que se toman para visualizarlo, además del tamaño de sus ejes.
Eliminar ruido Sal y Pimienta de una imagen
El bloque Median Filter contiene parámetros como: -Tamaño de la mascara -Tipo de relleno para pixeles indefinidos -Valor del pixel de relleno
Procesamiento de imágenes digitales.
Página 20
las zonas donde lo hubo debido al cambio en su contorno.
V.
REFERENCIAS
Guía de procesamiento de imágenes en Matlab
Notas de clase
Opción de ayuda de MATLAB
Al variar cada uno de estos parámetros se obtienen resultados similares entre i, con pequeñas variaciones en la conservación de detalles de la imagen original.
IV.
CONCLUSIONES
El método de reducción de ruido es una herramienta poderosa para poder tener una idea confiable de una imagen a procesar.
Respecto a conservación o eliminación de contorno los filtros en el dominio de la frecuencia
poseen
ventajas
como
simplicidad y fácil manejo respecto a los filtros en el dominio espacial. La detección óptima de contornos puede ser una alternativa a considerar a la hora de analizar el movimiento o corrimiento de una imagen, ya que se notarían específicamente
Procesamiento de imágenes digitales.
Página 21