sábado, 2 de febrero de 2013

Laboratorio 1: Grayscale, Binarización y Blur

Repositorio de Github: https://github.com/synnick/viscomp


Para las pruebas se utilizó la siguiente imagen:

Grayscale

El método que utilicé para convertir la imagen a grayscale fue sencillo. Basto con recorrer cada pixel de la imagen original utilizando una matriz con todos los pixeles (librería PIL de Python). Para cada pixel, se localizaba el mayor valor R, G o B. Dicho valor, ya sea se colocaba 3 veces en el mismo pixel en otra imagen de salida para proporcionar una escala de gris, o una sola vez dependiendo del formato de la imagen de salida. Por ejemplo:

Pixel_Original = (200, 100, 5)
Mayor(Pixel_Original) = 200
Pixel_Nuevo = (200, 200, 200)   ó  Pixel_Nuevo = (200)

Esto convierte una imagen a color RGB a una escala de grises. También es posible utilizar un promedio de los 3 valores RGB, o el menor. Los resultados son visiblemente similares, aunque se puede notar que utilizando el valor mayor, la escala de grises es un poco más brillantes(por elegir mayor, elegimos proximidad a blanco). De igual manera, al utilizar el menor valor la imagen se observaría más oscura. Por esto es deseable elegir un promedio entre los 3 para obtener un valor más estable. He aquí las comparaciones:


Filtro Mayor

Filtro Menor

Filtro Promedio


Como se puede ver, el filtro promedio nos arroja un intermedio como se podría esperar, y por lo tanto sería el más deseable de los tres.

Código:

Binarización

La binarización de una imagen es el proceso de convertir los valores de cada pixel a 0 o 1(0 o 255). Para hacer esto normalmente se utiliza un valor umbral con el cual comparamos para saber si cambiar el pixel a 0 o 255. Por esto mismo usualmente las herramientas como OpenCV solicitan que la imagen esté previamente en escala de grises, para simplemente comparar el valor de gris con el umbral y convertirlo a binario. En este caso, el programa automáticamente convierte a escala de grises y de ahí binariza la imagen dependiendo de cada valor de gris. El funcionamiento es el siguiente:

Pixel_Original = 174
Umbral = 127
Pixel_Original >= Umbral por lo tanto  Pixel_Nuevo = 255

ó


Pixel_Original = 33
Umbral = 127
Pixel_Original < Umbral por lo tanto  Pixel_Nuevo = 0


Las imagenes resultantes utilizando diferentes umbrales pueden observarse a continuación:

Umbral 220


Umbral 127

Umbral 50
Código

Blur

Blur es un método para dar un aspecto borroso a la imagen, utilizando las medias o promedios de los elementos vecinos a un pixel, comúnmente el pixel mismo y sus vecinos inferior, superior, izquierdo y derecho. Por ejemplo:

Pixel_Actual = (200, 10, 100), Pixel_Superior = (200, 20, 100),  Pixel_Inferior = (230, 15, 110), Pixel_Derecho = (130, 20, 120), Pixel_Izquierdo = (150, 30, 110)

--Promediamos valores R, G, y B por separado de todos los pixeles --

Pixel_Actual = (Prom(R), Prom(G), Prom(b))

Pixel_Actual = (182, 19, 108)

En caso de que no exista algún pixel vecino(por ejemplo si el pixel actual es el pixel en las coordenadas 0,0 solo tendría vecino derecho e inferior) se omite el cálculo de los demás y simplemente se promedia con el número de vecinos existentes.

Es posible aplicar el mismo filtro más de una vez para hacer cada vez mas borrosa la imagen hasta dejarla irreconocible. Las imagenes al aplicar un número determinado de filtros se pueden ver a continuación:

5 veces


10 veces


20 veces

Código




Herramienta "interactiva"

Con el  uso de Tkinter, me di a la tarea de hacer una pequeña herramienta donde se pudieran probar todos éstos filtros sobre una imagen. La función es simple, carga la imagen en una ventana donde se encuentran botones para aplicar los diferentes filtros a una imagen, con posibilidad de combinarlos. Además todas las modificaciones se hacen sobre un archivo separado, por lo cual es posible volver a la imagen original presionando reset. La herramienta se ve así:


2 comentarios: