jueves, 7 de marzo de 2013

Laboratorio 5

Laboratorio 5 - Detección de círculos (radios distintos)

Hola, esta entrada corresponde a la actividad de laboratorio 5 de la materia de Visión computacional y consiste en la detección de círculos (como la tarea 4), pero esta vez con radios distintos para cada círculo.

Bueno, debido a que esta práctica es similar a la tarea 4 de la misma materia solo tuve que realizar unas pocas modificaciones al código que ya había realizado. La implementación consiste en obtener las coordenadas de los bordes para luego determinar los puntos más lejanos (entre cada círculo obviamente); mediante los puntos antes mencionados obtenemos el diámetro de cada círculo, sabiendo de antemano que la mitad de ese diámetro es el radio.

Al conocer el radio, luego repetimos los métodos usados en la práctica anterior para pintar las circunferencias y etiquetar con un ID a cada círculo:

El código que hace todo lo anteriormente explicado es el siguiente:
 

if __name__ =="__main__":
  
    #transformar()
    #filtrada()
    #conv()
    #umbrales()

    #********************************************************************* 

    miImagen = Image.open("meh.jpeg")
    dr = ImageDraw.Draw(miImagen)
    p = miImagen.load()
    x, y = miImagen.size
    
    for i in range(x):
      for j in range(y): 
       #print p[i, j]  
       #time.sleep(1)
       if p[i,j] == (255,255,255):
        #print "afserfsefr"
        n, bordes = bfs(miImagen, (i,j), (255,0,0))
        menor, mayor, radio = Diametro(bordes)
        print "menor: ", menor[0], " + mayor: ", mayor[0]
        inicio(miImagen, radio)

    miImagen.show()    


def Diametro(bordes):
 menor = min(bordes)
 mayor = max(bordes)
 diametro = mayor[0] - menor[0]
 radio = int(ceil(diametro / 2.0))
 print radio
 return menor, mayor, radio 


def inicio(im, radio): #Ahora es variable
    #im = Image.open("meh4.png")
    mx = [[-1, -1, -1], [2, 2, 2], [-1, -1, -1]]
    my = [[-1, 2, -1], [-1, 2, -1], [-1, 2, -1]]
    imx = convolucion(im, mx)
    imy = convolucion(im, my)
     
    frecuencia = centros(imx, imy, im, radio)
     
    maximo = 0
    suma = 0.0
    for i in frecuencia.keys():
      suma += frecuencia[i]
      if frecuencia[i] > maximo:
          maximo = frecuencia[i] 
    promedio = suma/len(frecuencia)
    umbral = maximo-promedio

    for i in frecuencia.keys():
       if frecuencia[i] < umbral:
           frecuencia.pop(i)
  
    circulos(im,frecuencia,radio)


El pintado de circunferencia así como la etiqueta de los círculos ya lo habíamos visto y lo pueden encontrar en la entrada anterior.

Esto fue lo "nuevo" para esta entrada,  tuve bastantes problemas con bfs para obtener las coordenadas requeridas.

Uno de los intentos fallidos:



La idea es buena pero  la actividad no la pude terminar por falta de tiempo. Intentaré corregirlo y completarlo lo más pronto posible.

Cualquier duda o aclaración pueden dejarla en comentarios.

Saludos a todos!

1 comentario: