martes, 5 de marzo de 2013

Tarea #4. Detección de circulos

Para esta semana realizariamos lo que es la detección de circulos, para esto se utilizarón circulos con el mismo radio y ya conociendo el radio será introducido mediante la terminal para uso posterior.

Primero para poder detectar los circulos necesitaba encontrar lo que son los posibles centros en cada uno de ellos esto se logro encontrar teniendo xc y yc como se muestra en el código.

Para llegar a esto tengo lo antes utilizado para detectar bordes como es convolución donde utilizabamos el gradiente gx y gy para poder obtener la magnitud 



Después obtenemos lo siguiente
cosθ=gx/g sinθ=gy/g

 

Para identificar el centro utilizamos dos ecuaciones: 

xc= x-radioCosθ
yc=y-radioSinθ
Aquí podemos ver dos centros para cada pixel al tomar el radio ya introducido anteriormente aun no da buen resultado :(

Código
Esto aun no esta terminado por el momento, me falta aun que localizara los centros dentro de todos los circulos, marcar los contornos  de diferentes colores y lo correspondiente a laboratorio. 
import sys, pygame
import Image
from sys import argv
from math import sqrt, sin, cos, fabs
import numpy
from time import*
import math
def main():
pygame.init() # Inicializa pygame
screen = pygame.display.set_mode((400, 400))
pygame.display.set_caption('Imagenes')
#imagen1 = conv(imagen)
imagen = conv()
img = pygame.image.load(imagen)
screen = pygame.display.get_surface()
while True: # Ciclo para las acciones en la ventana
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
screen.blit(img, (0,0))
pygame.display.update()
def conv():
ima1 = Image.open("vane2.png")
imagen = ima1.load()
radio = int(argv[1])
ancho,alto = ima1.size
frec = numpy.empty((ancho, alto)) #frecuecia en centros
#angulo = 0.0
mat_x = ([-1,0,1],[-2,0,2],[-1,0,1])
mat_y = ([1,2,1],[0,0,0],[-1,-2,-1])
#conv = numpy.empty((ancho, alto))
for i in range(ancho):
#gx.append([])
#gy.append([])
for j in range(alto):
sumx=0.0
sumy = 0.0
for m in range(len(mat_x[0])):
for h in range(len(mat_y[0])):
try:
mul_x= mat_x[m][h] * imagen[i+m, j+h][0]
mul_y= mat_y[m][h] * imagen[i+m, j+h][0]
except:
mul_x=0
mul_y=0
sumx=mul_x+sumx
sumy=mul_y+sumy
gx = pow(sumx,2)
gy = pow(sumy,2)
grad = int(math.sqrt(gx + gy))
#circulo
if fabs(grad) > 0:
costheta = (float(sumx / grad))
sintheta = (float(sumy / grad))
xc = int(round(i - radio * costheta))
yc = int(round(j - radio * sintheta))
if xc >= 0 and xc < ancho and yc >= 0 and yc < alto:
frec[xc][yc] += 1
#imagen[xc,yc] = (0,255,0)
#centros de circulos codigo Dra
maximo = 0
suma = 0.0
print "sumando"
for i in range(alto):
for j in range(ancho):
v = frec[j][i]
suma += v
if v > maximo:
maximo = v
promedio = suma / (ancho * alto)
umbral = maximo-promedio
#agregalox = []
#agregaloy = []
for i in range(alto):
for j in range(ancho):
v = frec[j][i]
if v > umbral:
print 'Posible centro en (%d, %d). ' % (i, j)
#agregalox.append(y)
#agregaloy.append(x)
imagen[i,j] = (255,0,0)
print frec
nueva = 'circulo.png'
otra = ima1.save(nueva)
return gx, gy, nueva
#def circulos()
#ima3=
if __name__ == "__main__":
main()
view raw circulocen.py hosted with ❤ by GitHub




1 comentario:

  1. No deben votar los que no son borde. No incluyas la votación adentro de la convolución; cuida la modularidad. 2 pts por el avance.

    ResponderEliminar