Filtros de Suavizado

Hola a todos ^^

Aquí les traigo un trabajo que hice acerca de filtros de suavizado con ayuda del software maltab para la asignatura de Procesamiento Digital de Imágenes. La imagen utilizada fue Lenna!!

Bueno sin más interrupciones aquí se los dejo, espero sus comentarios !!!

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.[1]

Para comprobar los filtros de suavizado se seleccionó una imagen, en este caso "Lenna" la cual observamos a continuación a color del lado izquierdo y en escala de grises al lado derecho:









Esta última imagen se obtuvo con la función rgb2gray, utilizando las siguientes líneas de comando.

lena_gris=rgb2gray(lena);

imshow(lena_gris);

Luego de esto se le añadió a esta imagen ruido de dos clases, “Sal y Pimienta” y “Gaussiano” con el fin de realizar un filtrado de promedio y un filtrado de promedio ponderado utilizando un kernel gaussiano, cada uno de estos con 2 clases de máscaras diferentes. Estos ruidos los trabajaremos por separado a continuación:

Ruido de Sal y Pimienta

Para obtener la imagen con el ruido de sal y pimienta se utilizó la función imnoise, como se muestra a continuación en las líneas de código:

salpi = imnoise(lena_gris,'salt & pepper',0.15);

imshow(salpi);

psnrsalpi=PSNR(lena_gris,salpi);

La imagen distorsionada debido a este ruido se muestra a seguir:

Como podemos ver si hubo una distorsión bastante pronunciada sobre la imagen, este ruido se añade con el último parámetro de la función imnoise, el cual en este caso se usó de 0.15 siendo su mínimo valor 0 y su máximo valor 1 distorsionando 100% la imagen con el ruido de sal y pimienta.

Como se puede observar en el código se halló el psnr entre la imagen distorsionada y la original el cual fue de 31.0995

Cabe señalar que todos los filtrados se hicieron con la función fspecial, que en el caso del filtro de promedio sólo había que especificar de cuanto se quería que fuese la máscara, en este caso se utilizaron 2. Una de 4x4 y otra de 7x7.

Para comenzar con el filtrado de la imagen en este tipo de ruido se utilizó la función imfilter en donde los parámetros son el filtro y la imagen dañada que se desea filtrar.

En cada caso se hizo un análisis de la PSNR con una función previamente establecida, teniendo en cuenta la imagen original, con la imagen filtrada. Cabe señalar, que entre mayor sea éste valor mejor será el filtrado de la imagen. Teniendo esto en cuenta se procede a mostrar cada uno de los resultados obtenidos al aplicar cada uno de los filtros en la imagen de Lena con ruido de sal y pimienta.

En la imagen de la izquierda la máscara fue de 4x4 y al filtrarla, se obtuvo un psnr de 52.9580 mientras que en la derecha fue de 7x7 con un valor de psnr de 55.6161 como podemos ver la segunda imagen es mucho mejor que la primera ya que su valor de psnr es mayor, esto nos indica que la máscara de 7x7 hace mejor el trabajo de filtrado de ruido.









A continuación los códigos de ambas imágenes respectivamente:

filprom1 = fspecial('average', [4 4]);

mesh(filprom1);

imfilt1=imfilter(salpi,filprom1,'replicate');

imshow(imfilt1);

psnr1=PSNR(lena_gris,imfilt1);


filprom2 = fspecial('average', [7 7]);

mesh(filprom2);

imfilt2=imfilter(salpi,filprom2,'replicate');

imshow(imfilt2);

psnr2=PSNR(lena_gris,imfilt2);

En el caso del filtro gaussiano, se utilizó la misma función fspecial, pero esta vez se le agregó un parámetro, la varianza. Dicha varianza permite establecer el tamaño de la máscara que se adecua mejor para hacer un filtrado óptimo. En éste caso se utilizó varianza de 5 y 10 cuyas máscaras fueron de 31x31 y de 61x61 respectivamente. Cabe señalar que para la escogencia del tamaño de éstas máscaras se siguió un patrón que permite que el filtro sea mucho más óptimo. El cual se basa en la formula de σ*6+1. A continuación se muestran los dos filtros mencionados anteriormente.







Utilizando el mismo método anterior se hallaron las psnr de cada una de las imágenes y sus valores fueron 53.3276 para la máscara de 31x31 y de 53.2343 para la máscara de 61x61. Por lo que se puede deducir que el primer caso fue más óptimo que el segundo. A continuación las imágenes.









Los códigos utilizados para obtener estas imágenes se encuentran a continuación respectivamente:

filgaus1=fspecial('gaussian',[31 31],5);

mesh(filgaus1);

imfilt3=imfilter(salpi,filgaus1,'replicate');

imshow(imfilt3);

psnr3=PSNR(lena_gris,imfilt3);


filgaus2=fspecial('gaussian',[61 61],10);

mesh(filgaus2);

imfilt4=imfilter(salpi,filgaus2,'replicate');

imshow(imfilt4);

psnr4=PSNR(lena_gris,imfilt4);

Como conclusión ante el ruido de sal y pimienta se puede ver que es mucho mejor utilizar un filtro de promedio ya que éste nos brinda una mayor psnr además que la imagen obtenida es mucho más nítida.

Ruido Gaussiano

Para añadir esta clase de ruido a la imagen se utilizó de igual forma la función imnoise, simplemente que cambiaron los parámetros de ésta, como vemos a continuación en el código:

gau = imnoise(lena_gris,'gaussian',0,0.05);

imshow(gau);

psnrgau=PSNR(lena_gris,gau);

Como se puede ver, se halló el psnr entre la imagen distorsionada y la original y este fue de 31.7154.

La imagen distorsionada por el ruido gaussiano se muestra a continuación.


Al igual que en el caso del ruido de sal y pimienta, en este caso se aplicaron filtros de promedio y filtro de promedio ponderado utilizando un kernel gaussiano. En el primer caso se utilizaron dos máscaras una de 6x6 y otra de 7x7 con el fin de filtrar la imagen y luego calcular su psnr. En el caso de la máscara de 6x6 el psnr fue de 57.4173 y en el caso de la máscara de 7x7 fue de 57.9369.

A continuaciñon se pueden ver las imágenes en sus posiciones respectivas después de filtrarlas como se mencionó anteriormente.









El código utilizado para la obtención de las imágenes anteriores se encuentra a continuación:

filprom3=fspecial('average',[6 6]);

mesh(filprom3);

imfilt5=imfilter(gau,filprom3,'replicate');

imshow(imfilt5);

psnr5=PSNR(lena_gris,imfilt5);


filprom4=fspecial('average',[7 7]);

mesh(filprom4);

imfilt6=imfilter(gau,filprom4,'replicate');

imshow(imfilt6);

psnr6=PSNR(lena_gris,imfilt6);


En el caso del filtro de promedio ponderado utilizando un kernel gaussiano se siguó la misma fórmula mencionada en el caso del ruido de sal y pimienta, sin embargo en este caso se utilizaron varianzas igual a 2 y 3 lo cual produjo máscaras de 13x13 y 19x19. A continuación se encuentran los filtros utilizados respectivamente.







Las imágenes obtenidas respectivamente luego de aplicarles la función del filtro son las siguientes:









Finalmente se puede concluir que para el ruido gaussiano nuevamente el filtrado de promedio es mucho más óptimo que utilizando kernel gaussiano, ya que en este último la imagen se ve menos nítida como se mencionó anteriormente. A continuación se muestra el código de lo mencionado anteriormente.

filgaus3=fspecial('gaussian',[13 13],2);

mesh(filgaus3);

imfilt7=imfilter(salpi,filgaus3,'replicate');

imshow(imfilt7);

psnr7=PSNR(lena_gris,imfilt7);


filgaus4=fspecial('gaussian',[19 19],3);

mesh(filgaus4);

imfilt8=imfilter(salpi,filgaus4,'replicate');

imshow(imfilt8);

psnr8=PSNR(lena_gris,imfilt8);


De todas las imágenes anteriormente filtradas el mejor resultado se obtuvo en el que el psnr tuvo el mayor valor es decir de 57.9369 y por tanto la mejor calidad de imagen.


Referencias

[1] http://omarsanchez.net/filtroespa.aspx


Read Users' Comments (1)comentarios

1 Response to "Filtros de Suavizado"

  1. pipe says:
    15 de marzo de 2010, 1:11

    Exelente....

    Te quedo muy bueno el trabajo...

    Pipe

Publicar un comentario

Chistes para ingenieros

ir arriba