jueves, 14 de febrero de 2013

[Lab VC] Actividad 1: Ruido y diferencia

Para la actividad 2 de laboratorio se programaron las rutinas necesarias para:

  • Generar ruido "sal y pimienta" (pixeles blancos y negros sobre la imagen)
    • Controlar la cantidad de ruido
    • Controlar la intensidad del ruido (que tan blancos o negros son los pixeles)
  • Limpiar, reducir el nivel de ruido

Como partes opcionales, programar las rutinas necesarias para:
  • Calcular la diferencia entre 2 imágenes
    • Normalizar y binarizar la imagen resultante

El ruido simplemente se genera mediante una rutina que recorre la imagen,  la cantidad de ruido es un valor entre cero y uno que representa una probabilidad, la probabilidad de que un pixel sea sustituido por ruido. Se utiliza la función random.random() para jugar las probabilidades de cambio.
Después se vuelve a jugar la probabilidad pero con un valor de 0.5,  donde esta probabilidad indica si un pixel de ruido será blanco o negro, es decir, pixeles blancos y negros tienen la misma probabilidad de salir.
Por último, una comparación final indica si el pixel se volverá completamente blanco, negro o a algún nivel de gris dependiendo de la intensidad seleccionada. La intensidad es un valor entre 1 y 10 que se multiplica por 13, así si se elige intensidad 10, el color de los pixeles negros será 130 (0+(10*13)) y los blancos de bajarán a 125 (255-(10*13)), lo que los deja en una escala de gris casi idéntica.
Tanto la cantidad y el ruido se controlan mediante un slider en la interfaz de Python.

Eliminar ruido es una rutina donde se recorre cada pixel de la imagen, por cada pixel se toman los 8 vecinos que lo rodean, se obtiene un promedio ya sea RGB o en escala de grises, da igual, después se toma el pixel actual y se compara qué tanta diferencia hay entre sus 3 colores, dicha diferencia es una variable llamada agresividad, que va de 1 a 10 multiplicado por 10, entonces buscara si la diferencia es mayor a 10, 20 o 30 dependiendo del nivel de agresividad deseado. Sin embargo, entre mayor sea el nivel, la agresividad es menor ya que en realidad representa el umbral de diferencia en la comparación, el cual crece. Se dejó parametrizado para poder buscar manualmente el nivel óptimo de limpieza.


Los pasos para calcular la diferencia entre 2 imágenes son:
  • Tomar la imagen original y aplicar filtro de escala de grises.
  • Tomar una copia de la imagen en escala de grises y aplicar filtro de difuminado.
  • Recorrer ambas imágenes (original en grises y original en grises + difuminado) y restar cada par de pixeles en las coordenadas correspondientes.
  • Aplicar el filtro de umbrales para normalizar y binarizar la imagen.
También se programó la rutina para aplicar máscaras mediante convolución discreta.


Resultados

Aplicación y limpieza de ruido

Nivel de ruido
-
1
3
5
Original
Agr. 1
Agr. 5
Agr. 10

Como se puede apreciar en la tabla de comparación; fila 1 muestra imágenes originales, filas siguientes  la aplicación de limpieza a distintos niveles y cada columna representa distintos niveles de ruido.
Como es de esperar, un filtro medio proporciona los mejores resultados, mientras que un valor bajo de diferencia ataca mucho mas la imagen, un nivel de agresividad alto aumenta el umbral de diferencia y muchos pixeles ruidosos no son removidos.
Aplicando varias veces la limpieza de ruido a un nivel medio reduce mucho más y mejor el ruido, sin embargo, comenzarán a notarse partes borrosas en la imágen.

Remover ruido con agresividad a nivel 5 aplicado 5 veces a una imagen con cantidad de ruido 3
Comienzan a notarse bordes irregulares.


Filtro de diferencia

Con un gif se pueden ver las diferentes fases del proceso:

Fases de aplicación del filtro de diferencia


La aplicación del filtro de diferencia es una forma bastante básica de hallar bordes en imágenes.


 

Detalle de las fases relevantes, a la derecha diferencia, a la izquierda normalización y binarización

Máscaras


También se programo la rutina para aplicar máscaras utilizando convolución discreta, les dejo la liga a la entrada de este mismo blog donde explico el método paso a paso con código incluído.



Interfaz



Se realizarón algunos cambios a la interfaz, ahora se incluye una ventana flotante para configurar los diferentes parametros:
  • Umbral
    • Mínimo y máximo
  • Ruido
    • Cantidad e intensidad
  • Remover ruido
    • Agresividad

Código



Ahí pueden encontrar información sobre la aplicación de filtros básicos, máscaras y convolución discreta, ahora incluyo sólo las rutinas de agregar y eliminar ruido, y filtro de diferencia






En la próxima entrega cambiaré de imágenes para no aburrirlos :)

1 comentario: