lunes, 4 de febrero de 2013

Laboratorio 1

Laboratorio 1 - Escala de grises y umbrales 

Hola, para esta primer entrada del laboratorio de Visión Computacional se nos pidió realizar un programa que dada una imagen cualquiera, obtener una copia de la imagen a escala de grises, luego por medio de umbrales, asignar pixeles, blanco, negro y gris (el mismo color) a la imagen.
Bien, dicho esto, voy a proceder a explicarles el método que usé para convertir mi imagen a escala de grises (creo que todos usamos el mismo método). Primeramente, obtuve de cada uno de los pixeles los valores de RGB, luego realicé un promedio con esos 3 valores. Por ejemplo:
Pixel1 = (65, 30, 14), el promedio es (65 + 30 + 14) / 3 = 36.33.
Seguido de eso igualé los valores de RGB del pixel al promedio obtenido, es decir:   
NuevoPixel = (36, 36, 36)


Algo así:

for x in xrange(im.size[0]):
  for y in xrange(im.size[1]):
   pix = im.load()
   tupla = pix[x, y]
 
   a = tupla[0]
   b = tupla[1]
   c = tupla[2]
   
   prom = int((a+b+c)/3)
   newTupla = (prom,prom,prom)
   im.putpixel((x, y), newTupla)   

   print tupla, "--", a,",",b,",",c
 im.save('meh.jpg')


Luego por medio de la función putpixel formo la imagen con los nuevos valores de RGB de cada pixel.


La imagen anterior es la imagen original que uso para realizar esta práctica, cuando ejecuto mi programa primero me sale la imagen original, luego en terminal me pregunta lo que deseo hacer, me dice que presione 1 para realizar la función de escala de grises o que presione 2 para usar la función de umbrales.

Si elegimos la opción 1 se ejecutará la siguiente función (transformar):

def transformar():
 i = 0
 x = 0
 y = 0
 im = Image.open("bla.jpg")
 
 for x in xrange(im.size[0]):
  for y in xrange(im.size[1]):
   pix = im.load()
   tupla = pix[x, y]
 
   a = tupla[0]
   b = tupla[1]
   c = tupla[2]
   
   prom = int((a+b+c)/3)
   newTupla = (prom,prom,prom)
   im.putpixel((x, y), newTupla)   

   print tupla, "--", a,",",b,",",c
 im.save('meh.jpg')

Si elegimos la opción 2 se ejecutará la siguiente función (umbrales):

#Funcion umbrales
#Se accede a ella presionando 2
def umbrales():
 i = 0
 x = 0  
 y = 0
 umbInferior = 77
 umbSuperior = 177
 im = Image.open("bla.jpg")
 
 for x in xrange(im.size[0]):
  for y in xrange(im.size[1]):
   pix = im.load()
   tupla = pix[x, y]
 
   a = tupla[0]
   b = tupla[1]
   c = tupla[2]
   
   prom = int((a+b+c)/3)
   if prom < umbInferior:
    prom = 0
   elif prom >= umbSuperior:
    prom = 255
   newTupla = (prom,prom,prom)
   im.putpixel((x, y), newTupla)   

   print tupla, "--", a,",",b,",",c
 im.save('meh2.jpg')


Cuando ejecutamos la primera opción el resultado de la imagen es la siguiente:


La imagen a a escala de grises, luego cuando ejecutamos la segunda opción el resultado de la imagen es la siguiente: 

La imagen a blanco y negro con algunos pixeles en gris, los pixeles en gris son porque quedaron en medio de los umbrales superior e inferior que puse. Es decir, si el pixel resultaba menor al umbral inferior (85), lo pintaba en negro, si el pixel resultaba mayor al umbral superior (170) lo pintaba de blanco, y si quedaba entre los valores de los umbrales el pixel permanecia en el valor gris.

Jugando con los umbrales

Bien, después de esto realicé algunas modificaciones a los valores de umbrales y pixeles para visualizar los cambios de las imagenes resultantes, en la siguiente imagen apliqué lo contrario, es decir, si el valor del pixel era menor al umbral inferior, al nuevo pixel le daba el valor de 255, y viceversa, de esa manera esperaba el resultado contrario (cambiar negros por blancos y blancos por negros).
El resultado es el siguiente:



Luego cerré un poco más los valores de los umbrales para observar el efecto resultante, lo que yo esperaba (obvio) era menos valores de grises, y que se aumentaran los pixeles blancos y negros, esto debido a que ya habría menos cabida para los pixeles grises, ya que se cerraron más los umbrales.
El resultado es el siguiente:
El resultado fue el esperado, una imagen con un mayor número de pixeles negros y blancos que la umbralización normal (umbral inferior = 85, umbral superior 170).

Después de esto, abrí el rango de los umbrales, osea, le di más cabida a los pixeles grises, pasé de los valores 117 para los umbrales inferiores y 137 para los umbrales inferiores a un 77 y 177 para los umbrales inferiores y superiores respectivamente. 

Y este fue el resultado (obviamente con un mayor número de pixeles grises que la imagen anterior, quedando con menos pixeles negros y blancos):


Bueno, ese fue todo mi trabajo para esta entrada 1 del laboratorio, la liga a mi git con el trabajo  es la siguiente: https://github.com/eddypre/VisionTriana/blob/master/Laboratorio1

Ahí mismo también pueden encontrar las versiones que fui realizando (son 3). Y aprovecho para comentarles que en ese mismo pool subiré todos mis avances de proyecto de esta materia.

Cualquier duda o aclaración pueden dejarla en comentarios.

Saludos!


1 comentario:

  1. Los umbrales no deberían ser fijos en el código sino ser tomados como parámetros en algún momento. Ojo con la presentación; hay cambios raros de tipo y tamaño de letra de repente. Van 8 pts.

    ResponderEliminar