miércoles, 6 de marzo de 2013

Laboratorio 5

Para esta entrega, tendremos que detectar circulos pero ahora el parametro del radio no está predefinido.

Al igual que la tarea de detección de circulos con un mismo radio, emplearemos estas ecuaciones:








Código:

#!/usr/bin/python
from PIL import Image, ImageDraw, ImageFont
import sys, time, random, math
def centrocirculo(picx, picy, image, salto = 10, bias=10.0):
frecuencia = dict()
circulomat = dict()
for i in range(image.size[0]):
for j in range(image.size[1]):
(Rx, Gx, Bx) = picx[i,j]
(Ry, Gy, By) = picy[i,j]
gx = float(Rx+Gx+Bx)/3
gy = float(Ry+Gy+By)/3
gradiente = math.sqrt(math.pow(gx, 2) + math.pow(gy, 2))
if gradiente < -1*bias or gradiente > bias:
cost = (gx/gradiente)
sint = (gy/gradiente)
theta = math.atan2(gy, gx)
r = 60
centro = (int( i - r * math.cos(theta+math.radians(90.0))), int( j - r * math.sin(theta+math.radians(90.0))))
centro = ((centro[0]/salto)*salto, (centro[1]/salto)*salto)
circulomat[i,j] = centro
if not centro in frecuencia:
frecuencia[centro] = 1
else:
frecuencia[centro] += 1
else:
circulomat[i, j] = None
return circulomat, frecuencia
def amarillo():
return (255, random.randint(100,255), random.randint(0, 50))
def draw_lines(image, frecuencia, circulomat):
pic = image.load()
font = ImageFont.truetype("/usr/share/fonts/truetype/freefont/FreeSansBold.ttf", 18)
draw = ImageDraw.Draw(image)
cont = 1
colores = dict()
for i in frecuencia.keys():
colores[i] = amarillo()
r = 2
draw.ellipse((i[0]-r, i[1]-r, i[0]+r, i[1]+r), fill=(0, 255, 0))
draw.text((i[0]+r+3, i[1]), ('C'+str(cont)), fill=(0, 255, 0), font=font)
print 'C'+str(cont)
cont += 1
for i in range(image.size[0]):
for j in range(image.size[1]):
if circulomat[i, j] in frecuencia:
try:
pic[i,j] = colores[circulomat[i, j]]
except:
pass
return image
def deteccioncirculo(image_name, output="output.png"):
f = Filtros()
imagex = f.aplicar_mascara(image_name, ["sobelx"], [1.0/10.0], cmd="i")
imagey = f.aplicar_mascara(image_name, ["sobely"], [1.0/10.0], cmd="i")
image = Image.open(image_name)
salto = 30
circulomat, frecuencia = centrocirculo(imagex, imagey, image, salto = salto, bias=10.0)
for i in frecuencia.keys():
if frecuencia[i] < salto*8:
frecuencia.pop(i)
else:
print frecuencia[i], i
draw_lines(image, frecuencia, circulomat)
image.save(output)
def main():
deteccioncirculo(sys.argv[1])
main()
view raw circulos.py hosted with ❤ by GitHub
El resultado no fue el esperado:



1 comentario:

Elisa dijo...

3 pts por el avance inicial

Publicar un comentario