martes, 16 de abril de 2013

Detección de elipses

En esta entrega se nos pidio detectar elipses en una imagen.
Para realizar esta detección es necesario realizar la detección de bordes, en tareas anteriores ya hemos realizado esto.
Primero realizaremos la detección de bordes y se crea un filtro de estos puntos con respecto a los diferentes gradientes.




Se calcula centro:


def calcula_centro(pixel1, pixel2, grad1, grad2, image, draw_line):
tang1 = [grad1, pixel1[1]-(grad1*pixel1[0])]
tang2 = [grad2, pixel2[1]-(grad2*pixel2[0])]
x = float(tang2[1]-tang1[1]) / (tang1[0]-tang2[0])
y = tang1[0]*x+ tang1[1]
interseccion = (x, y)
medio = ( (pixel1[0]+pixel2[0])/2, (pixel1[1]+pixel2[1])/2 )
if (interseccion[0]-medio[0]) != 0:
m = (interseccion[1]-medio[1] ) / (interseccion[0]-medio[0])
else:
m = 1000
b = medio[1] - (m*medio[0])
center_line = [m, b]
if (interseccion[0]-medio[0]) < 0.0:
direccion = 1
else:
direccion = -1
draw_line.draw(center_line, inicio = medio[0], direccion = direccion)





Se detecta elipse:

def deteccion_elipse():
image = Image.open(image_name)
original_image = image.copy()
filtro_umbral(imageEllipse, umbral = 130)
centers = detecta_centro(imageEllipse)
pic = image.load()
dimensiones = list()
for c in centers:
actual = list(c[:])
horizontal = 0
while pic[tuple(actual)] != (255, 255, 255):
actual[0] += 1
horizontal += 1
if horizontal > size[0]:
break
actual = list(c[:])
vertical = 0
while pic[tuple(actual)] != (255, 255, 255):
actual[1] += 1
vertical += 1
if vertical > size[1]:
break
dimensiones.append((horizontal, vertical))
razon = list(image.size)
image = original_image
razon[0] = float(image.size[0]) / razon[0]
razon[1] = float(image.size[1]) / razon[1]
draw = ImageDraw.Draw(image)
r = 5
for i in range(len(centers)):
nombre = 'N'+str(i+1)
x = int(centers[i][0]*razon[0])
y = int(centers[i][1]*razon[1])
draw.text((x, y+(r*2)), nombre, fill=(255, 0, 0), font=font)
draw.ellipse((x-dimensiones[i][0]*razon[0], y-dimensiones[i][1]*razon[1], x+dimensiones[i][0]*razon[0], y+dimensiones[i][1]*razon[1]), outline = random_orange())
draw.ellipse((x-r, y-r, x+r, y+r), fill=(255, 0, 0))
image.save(output)

Imagen de entrada:


Salida:
Imagen de entrada:



Salida:



1 comentario:

Elisa dijo...

Aquí falta código relevante y no hay liga al repositorio. Lo de dibujar un segmento aún no explica de dónde sacas el centro. 3 pts.

Publicar un comentario