martes, 19 de febrero de 2013

Tarea 2

Tarea 2 - Detección de Figuras

Hola, la siguiente actividad de la clase de visión computacional consiste en implementar una subrutina del algoritmo BFS, para después detectar las distintas figuras presentes en una imagen, así como los centros de masa.
El requisito para realizar esta actividad es tener una imagen con los bordes detectados, y también tiene que estar binarizada (es lo correspondiente a la tarea 1, antes entregada).

Mediante el algoritmo BFS encontramos las distintas figuras que componen la imagen, esto recorriendo los pixeles totales de la imagen, el algoritmo parte de un nodo raiz y luego se van recorriendo los nodos vecinos, introduciendo en una cola.

Como ya tenemos la imagen con bordes y binarizada el algoritmo va a estar delimitado por los rangos que corresponden a las lineas blancas (los bordes), al ir recorriendo los pixeles de una imagen lo voy pintando con un color random, dejando siempre el fondo (parte de mayor porcentaje de la imagen) en color gris (requerido en la tarea).
Este mismo proceso es para detectar todos los objetos o figuras de la imagen. Así que en cada pixel negro de la imagen se buscará la figura, siempre respetando los contornos o los bordes de cada figura.

A continuación la subrutina bfs():

#Implelementacion de bfs ***************************************************
#***************************************************************************

def bfs(im, origen, color):
 n = 0 
 pixel = im.load()
 width, height = im.size
 col = []
 xsum = []
 ysum = []
 col.append(origen)
 original = pixel[origen]
 largo = len(col) 
 
 while largo > 0:
        (x, y) = col.pop(0)
        actual = pixel[x, y]
        if actual == original or actual == color:
                for dx in [-1, 0, 1]:
           for dy in [-1, 0, 1]:
       i, j = (x + dx, y + dy)
       if i >= 0 and i < width and j >= 0 and j < height:
          contenido = pixel[i, j]
          if contenido == original:
             pixel[i, j] = color
             xsum.append(i)
             ysum.append(j)
             n += 1
             col.append((i, j))
 #im.save('bla01.jpg')
 return n, xsum, ysum # el regreso para la funcion formas
 
#Para clasificar los objetos**********************************************
#*****************************************************************************
#*************************************************************************


Un video muy bueno que ayuda a programar el BFS

 

Ahora para pintar objetos, centros de masa y porcentajes:
#Para clasificar los objetos**********************************************
#*****************************************************************************
#*************************************************************************

def formas():

 im = Image.open("meh5.jpg") #Imagen con bordes y binarizada
 width, height = im.size
 total = width * height
 porcentajes = []
 centro = []
 corr = 0 ##Solo para corroborar porcentajes
 conteo = 0
 pixel = im.load()
 temp = []
 colorsR = [] #Para guardar colores R
 colorsG = [] #Para guardar colores G
 colorsB = [] #Para guardar colores B
 conteoColores = 0
 for i in range(width):   #Recorriendo imagen
      for j in range(height):  #Recorriendo imagen
         if pixel[i, j] == (0, 0, 0): #Ir pintando pixeles (negros obviamente)
    r, g, b = random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)  #Asignando pixeles random
    
    n, x, y = bfs(im,(i,j),(r,g,b))    
    ptemp = float(n)/float(total) * 100.0 #Obteniendo porcentajes
    if ptemp > 0.1:
       centro.append((sum(x) / len(x), sum(y) / len(y)))   #Localizando centros
       porcentajes.append([ptemp, (r, g, b)])
       conteo += 1
           else:
              temp.append((x, y))
 fondo = porcentajes.index(max(porcentajes))
 color = porcentajes[fondo][1]
 for i in range(width):
      for j in range(height):
         if pixel[i, j] == color:
           pixel[i, j] = (150, 150, 150)
 
   for i in range(len(centro)):
      if i == fondo:
          pixel[centro[i]] = (255, 0, 0) #Para poner centros de masa
   #Aqui va lo de las tags, proximamente en Tkinter o Pygame
      else:
         pixel[centro[i]] = (0, 0, 0) 

 im.save('bla02.jpg') #Imagen definitiva
   conteo = 0
   for ptemp in porcentajes:
      print "Porcentaje de figura %s: %.2f"%(conteo, ptemp[0])
      conteo = conteo+ 1
  corr = ptemp[0] + corr 
 #print "Corroborando porcentaje: ", corr

# FIN ********************************************************************


Resultados obtenidos:

Para realizar las pruebas tuve que poner imágenes en las que su contorno estuviera bien definido, ya que con algunas pruebas simplemente no era posible detectar las figuras que componian la imagen.

1) Prueba 1

(Hacer click sobre la imagen para ampliar)



Procesos  de conversión en GIF:

  

2) Prueba 2

(Hacer click sobre la imagen para ampliar



Procesos de conversión en GIF:


3) Prueba 3

(Hacer click sobre la imagen para ampliar




Procesos de conversión en GIF:


Para obtener GIF's, por si les interesa: http://andalinux.wordpress.com/2008/09/24/crear-gif-animados-en-ubuntu-linux/

Mi liga de git: https://github.com/eddypre/VisionTriana

Cualquier duda o aclaración pueden ponerla en comentarios. 

Saludos a todos!

No hay comentarios:

Publicar un comentario