January 29, 2013

Laboratorio 1. Escala de grises, umbrales y filtros

Este código se encuentra en mi repositorio Github para esta clase: https://github.com/JonathanAlvarado/VisionComputacional/blob/master/grises.py

Esta actividad consistió en realizar un programa, el cual al proporcionarle una imagen convertirla a escala de grises, también determinar umbrales para que los pixeles menores y mayores a esos rangos fueran cambiados a blancos y negros; y por último aplicar filtros a la imagen para que se distorsione.

El algoritmo que utilicé para convertir la imagen a escala de grises consiste en obtener cada uno de los pixeles de la imagen en valores RGB utilizando la función load () de la librería PIL de Python; después de obtener los valores lo que hice fue obtener un promedio de los tres y asignar ese promedio al nuevo pixel, y con la función putpixel() guardar el nuevo pixel;  por ejemplo:

pixel = (100,50,90)
Entonces: r = 100, g = 50, b = 90

promedio = (r+g+b)/3
NuevoPixel = (promedio, promedio, promedio)

Esta es la parte de la función en python que realiza lo anterior:

pixeles = im.load()

    for x in range(ancho):
 for y in range(alto):                                       
            promedio = sum(pixeles[x,y])/3                                                   
            gris = (promedio,promedio,promedio)
            im.putpixel((x,y),gris)

    im.save('gris.png')

Para la parte de los umbrales realicé una función muy similar, sólo que realiza comparaciones con los umbrales para determinar si sobrepasa alguno de los umbrales.

pixeles = im.load()

    for x in range(ancho):
        for y in range(alto):
            promedio = sum(pixeles[x,y])/3

            if promedio < umbralNegro:
  gris = (0, 0, 0)                                      
            elif promedio > umbralBlanco:
  gris = (255, 255, 255)
            else:
                gris = (promedio,promedio,promedio)

            im.putpixel((x,y),gris)
    im.save('umbrales.png')

Para la distorsión de la imagen lo que realicé fue tomar un pixel y sus vecinos (arriba,abajo,izquierda y derecha) sumarlos y obtener un promedio de sus valores.

    for x in range(ancho):
        for y in range(alto):
            pix = []
            pix.append(list(imPixeles[x, y]))

            if x > 0:
                pix.append(list(imPixeles[x-1, y]))
            if y > 0:
                pix.append(list(imPixeles[x, y-1]))
            if x < ancho-1:
                pix.append(list(imPixeles[x+1, y]))
            if y < alto-1:
                pix.append(list(imPixeles[x, y+1]))

            filtro = [sum(i) for i in zip(*pix)]
            imPixeles[x,y] = filtro[0]/3, filtro[1]/3, filtro[2]/3
    im.save('filtro.png')

El programa muestra en la ventana los cambios realizados y además guarda la imagen en la carpeta donde se encuentra el script del programa.

La imagen que utilicé como prueba es la siguiente:


Al utilizar el programa en terminal se muestra las teclas que puedes presionar para utilizar las funciones y al usar la función de grises la imagen se ve de la siguiente manera:

Al utilizar el programa y usar la función de umbrales con valores de 90 y 180 la imagen se ve de la siguiente manera:

Distorsión de la imagen:





Jugando con los umbrales

Umbrales de 20 y 150

Umbrales de 20 y 100

Umbrales de 99 y 100


Programa

Para utilizar este programa en terminal hay que proporcionarle el nombre de la imagen junto con su extensión en caso de que se encuentre en la misma carpeta o sino proporcionarle toda la ruta. Después en terminal se muestran las opciones que hay:
Presiona

Barra espaciadora -> para cambiar la imagen a escala de grises
Tecla L -> para jugar con los umbrales
Tecla f -> para aplicar filtro


Saludos!
Repositorio donde estaré subiendo más avances y más códigos: https://github.com/JonathanAlvarado/VisionComputacional

1 comment: