PUBLICIDAD


Filtros en imágenes - Visión artificial


Introducción

Cuando queremos procesar una imagen, habrá ocasiones en las que nos toparemos con alguna que tiene mucho ruido. La realidad es que todas las imágenes tienen cierto grado de ruido, ¿Por qué? Porque la acción de convertir una imagen óptica a una señal eléctrica continua que posteriormente es muestreada siempre nos generará un ruido en la imagen digital. En este artículo les mostraremos como aplicar algunos filtros básicos en MATLAB para tratar de disminuir el ruido en una imagen.

¿Qué es el ruido en una imagen?

Información no deseada en una imagen que causa una contaminación. Podemos notarla en una imagen como pixeles aislados con un nivel de gris distinto a los pixeles que lo rodeen (también llamados “Vecinos”). Podemos identificar dos puntos clave que causan ruido en una imagen: La fuente que genera la imagen (Cámara, sensores ópticos) y el medio en que se transmite la señal eléctrica generada.

Tipos de ruido

Ruido “Gaussiano”: Podemos identificarlo como ligeras variaciones en una imagen. El pixel toma el valor deseado pero se le agrega una cantidad de error, conocido como “variable aleatoria gaussiana”. Este error normalmente es generado por perturbaciones al momento de transmitir las señales electicas o errores de ganancias en la cámara.

Filtros en imágenes - 1


Ruido “Sal y pimienta” (Impulsional): Podemos identificarlo como una gran variación en el pixel a su valor ideal, es decir, no tiene una relación alguna con el valor deseado ni con sus pixeles vecindarios. El valor del pixel es únicamente el valor del ruido, y regularmente este valor está en los extremos altos o bajos, generando por lo tanto puntos blancos y negros (de ahí el nombre “Sal y pimienta”). Este ruido es generado cuando el valor del pixel tomado por el sensor es mínimo, pierde la señal y no logra captarlo o cuando el sensor se satura, regularmente causado por trabajar con la cámara en altas temperaturas. A continuación un ejemplo de una imagen con ruido “Sal y pimienta”.

Filtros en imágenes - 2

Operaciones de suavizado

Este tipo de operaciones tiene como objetivo disminuir el ruido que haya en una imagen por errores en los distintos pasos del procesamiento de esta. Hay varios tipos de filtros que pueden aplicarse para eliminar el ruido, a continuación analizaremos algunos.


Filtrado de una imagen: Consiste en un proceso de modificación de una imagen, regularmente para mejorarla eliminando ruidos o elementos no deseados. Esta analiza los pixeles que hay en un vecindario, y dependiendo el algoritmo y la acción deseada (Atenuar, eliminar o resaltar), este definirá el valor de los pixeles del vecindario.


Filtro “Media”: Este nos ayuda a suavizar la imagen disminuyendo la variación que hay entre los pixeles de un vecindario. Consiste en revisar pixel por pixel y se calcula el valor de la media de los pixeles vecinos, el resultado obtenido será el nuevo valor del pixel analizado. A continuación un ejemplo de cómo se aplicaría la convolución con una máscara de 3x3 utilizando el filtro de la media.

Filtros en imágenes - 3

La sintaxis para crear el filtro de la media 3x3 en MATLAB es la siguiente:

Código:

Nombre_filtro=fspecial('average'); 

Si quisiéramos crear un filtro 9x9 de media la sintaxis seria la siguiente:

Código:

Nombre_filtro=fspecial('average',[9,9]); 

Y para aplicarle el filtro a la imagen, la sintaxis en MATLAB seria la siguiente:

Código:

Nueva_imagen=imfilter(Imagen_con_ruido,Nombre_filtro);

Donde:


Más adelante les mostraremos un ejercicio para que quede más claro su uso.


Filtro “Mediana”: Este filtro es recomendado cuando tenemos ruido tipo “Sal y pimienta”, consiste en calcular la mediana utilizando el conjunto de pixeles vecinos al pixel que queremos a analizar. Por lo tanto, si tenemos un pixel muy distinto al del entorno (como ocurre con el ruido “Sal y pimienta”), este tomará el valor de la mediana con respecto a sus pixeles vecinos. Por ejemplo, si tenemos la siguiente vecindad de pixeles:

Filtros en imágenes - 4

Vecindad = {2 , 17 , 17 , 17 , 18 , 18 , 19 , 19 , 19}
Mediana = 18


El pixel que antes tenía el valor de “2” ahora valdrá “18”. Como pueden ver, el valor de 2 es muy bajo con respecto al de sus vecinos, lo que indica que probablemente es ruido, por lo tanto, este quedaría eliminado al tomar un valor muy parecido al del vecindario, en este caso “18”.

La sintaxis para aplicar este filtro en MATLAB es algo distinta a la de la media. En la de la media primero creábamos un filtro y luego lo aplicábamos en la imagen. En este ambos procesos se hacen con una sola línea de código, sería la siguiente:

Código:

Nueva_imagen=medfilt2(Imagen_con_ruido);

Donde:


Filtro “Gaussiano”: Este filtro, como su nombre lo indica, es mejor utilizarlo cuando se presenta el ruido gaussiano. Tiene la capacidad de suavizar la imagen, eliminando el ruido, pero como consecuencia también provoca un efecto de borrosidad y pérdida de nitidez. Al igual que el filtro de la media, se utiliza una máscara basada en la siguiente función gaussiana:

Filtros en imágenes - 5

Un ejemplo de mascara para un filtro gaussiano es el siguiente:

Filtros en imágenes - 6

La sintaxis para crear el filtro gaussiano en MATLAB es la siguiente:

Código:

Nombre_filtro=fspecial('gaussian'); 

Y para aplicarle el filtro a la imagen, la sintaxis en MATLAB seria la siguiente:

Código:

Nueva_imagen=imfilter(Imagen_con_ruido,Nombre_filtro);

Donde:


Agregar ruido: Podemos agregarle ruido a una imagen en MATLAB. El ruido que se le puede introducir es variado por ejemplo gaussiano, sal y pimienta, etc. La sintaxis para agregar ruido es la siguiente:

Código:

Nueva_imagen = imnoise(imagen_original,'tipo_ruido',densidad);

Más adelante les mostraremos un ejercicio para que quede más claro su uso.


Publicidad


Ejercicio

Introducir ruido “Sal y pimienta” y “Gaussiano” a una imagen y tratar de eliminarlo o disminuirlo mediante filtros de media, gaussianos y mediana.

Diagrama de flujo

Filtros en imágenes - 7

Codificación

Ejercicio 1: Introducir ruido “Sal y pimienta” a imagen y tratar de eliminarlo mediante un filtro de la media 3x3 y 9x9.

Código:

%Ejercicio 1 - Filtros - Solución Ingenieril
original= imread('cameraman.tif'); %Se lee y guarda la imagen en "original"
ruido=imnoise(original,'salt & pepper',0.05); %Se le aplica ruido Sal y Pimienta con una densidad de 0.05 y lo guardamos en "ruido"
 
media3x3=fspecial('average'); %Se crea filtro de media 3x3 y lo guardamos en "media3x3"
media9x9=fspecial('average',[9,9]); %Se crea filtro de media 9x9 y lo guardamos en "media9x9"
 
im_filtrada_3x3=imfilter(ruido,media3x3); %Se le aplica el filtro media3x3 a la imagen con ruido
im_filtrada_9x9=imfilter(ruido,media9x9); %Se aplica el filtro media9x9 a imagen con ruido
 
%Representaciones de las imágenes
subplot(2,2,1), subimage(original), title('Imagen original');
subplot(2,2,2), subimage(ruido), title('Imagen con ruido');
subplot(2,2,3), subimage(im_filtrada_3x3), title('Filtro de media 3x3');
subplot(2,2,4), subimage(im_filtrada_9x9), title('Filtro de media 9x9');


Ejercicio 2: Introducir ruido Gaussiano a imagen y tratar de eliminarlo mediante filtros de la media y filtro gaussiano.

Código:

%Ejercicio 2 - Filtros - Solución Ingenieril
original=imread('cameraman.tif'); %Leemos imagen y la guardamos en original
ruido=imnoise(original,'gaussian'); %Le insertamos ruido gaussiano y lo guardamos en ruido
 
gauss=fspecial('gaussian'); %Creamos filtro gaussiano y lo guardamos en gauss
media=fspecial('average'); %Creamos filtro de la media y lo guardamos en media
 
filtrado_gauss=imfilter(ruido,gauss); %Aplicamos filtro gaussiano gauss a la imagen con ruido guardándolo en "filtrado_gauss"
filtrado_media=imfilter(ruido,media); %Aplicamos filtro de la media a la imagen con ruido guardándolo en "filtrado_media"
 
%Representaciones de las imágenes
subplot(2,2,1), subimage(original), title('Imagen original');
subplot(2,2,2), subimage(ruido), title('Imagen con ruido gaussiano');
subplot(2,2,3), subimage(filtrado_gauss), title('Filtro gaussiano');
subplot(2,2,4), subimage(filtrado_media), title('Filtro de media 3x3');


Ejercicio 3: Crear distintos tipos de ruidos y probar con distintos tipos de filtros.

Código:

%Ejercicio 3 - Filtros - Solución Ingenieril
original=imread('cameraman.tif'); %Leemos imagen y la guardamos en original
ruido_gauss= imnoise(original,'gaussian'); %Creamos ruido gaussiano
ruido_sp= imnoise(original,'salt & pepper',0.1); %Creamos ruido Sal y pimienta
 
media= fspecial('average'); %Creamos filtro de media
filtrado_media1=imfilter(ruido_gauss,media); %Aplicamos filtro de media a la imagen con ruido gaussiano
filtrado_media2=imfilter(ruido_sp,media); %Aplicamos filtro de media a la imagen con ruido Sal y pimienta
 
filtrado_mediana1=medfilt2(ruido_gauss); %Aplicamos filtro de mediana a la imagen con ruido gaussiano
filtrado_mediana2=medfilt2(ruido_sp);%Aplicamos filtro de mediana a la imagen con ruido Sal y pimienta
 
%Representaciones de las imágenes
subplot(2,3,1), subimage(ruido_gauss), title('Imagen con ruido gaussiano');
subplot(2,3,4), subimage(ruido_sp), title('Imagen con ruido Sal y pimienta');
subplot(2,3,2), subimage(filtrado_media1), title('Filtro media');
subplot(2,3,5), subimage(filtrado_media2), title('Filtro media');
subplot(2,3,3), subimage(filtrado_mediana1), title('Filtro mediana');
subplot(2,3,6), subimage(filtrado_mediana2), title('Filtro mediana');

Resultados

Ejercicio 1

Filtros en imágenes - 8

Ejercicio 2

Filtros en imágenes - 9

Ejercicio 3

Filtros en imágenes - 10

Conclusión

Cuando procesemos imágenes habrá muchas ocasiones en las que tendremos ruido que puede afectar o confundir a nuestro programa de visión artificial. Para esas ocasiones necesitamos pasar la imagen por filtros para intentar reducir el ruido. En este artículo analizamos los ruidos más comunes que se presentan en las imágenes, y mostramos como aplicar filtros para reducir/suavizar ese ruido.






Agregar comentario
1500
¿Cual es el siguiente número: 2,4,6, ..?
Comentarios
(0)
No hay comentarios todavía ¡Sé el primero en comentar!

©2017-2021 Solución Ingenieril. Todos los derechos reservados