jueves, 18 de abril de 2013

Lab #5. Relleno de elipses

Para esta semana en laboratorio se nos pidio:

Identificar cada elipse individual
Rellénarlo de un corlor aleatorio
Marcar los centros con bolita y ID con etiqueta
En porcetaje de la imagen completa

Ahora si para detectar las elipses seguí utilizando bfs y detección de bordes, en esta ocación lo que pude hacer es identificar las formas por contornos, rellenar las elipses de un color aleatorio.

Original






Código Bfs:

Después se agrupan lo que son los bordes en este caso utilice la tarea de detección de formas donde utilizamos el bfs para eliminar pixeles que no son necesarios.


def im2():
image = Image.open('binarizas.jpg') #carca la imagen con convolucion y binarizada
imagen = image.load()
ancho,alto = image.size
total = ancho*alto
porcentaje = []
centro = []
contiene = 0
fel=[]
print ancho
print alto
#aplicamos bfs para la imagen
for a in range(ancho):
for b in range(alto):
if imagen[a,b] == (255, 255, 255): #toma solo los pixeles blancos
color = random.randint(0,255),random.randint(0,255),random.randint(0,255)
n,xs,xy= bfs(image,color,a,b)
por = float(n)/float(total) * 100.0 #promedio maximo
if por > 0.5:
centro.append((sum(xs)/len(xs),sum(xy)/len(xy)))
fel.append(c)
#obtenemos los centros de la imagen
porcentaje.append([por, (color)])
print "Pinta figura %s"%contiene
#contiene +=1
fondo_new = porcentaje.index(max(porcentaje))
max_c = porcentaje[fondo_new][1]
print "Pinta fondo"
for i in range(ancho): #ciclo para pintar en gris la parte con un mayor porcentaje de color
for j in range(alto):
if imagen[i,j]==max_c:
imagen[i,j]=(120,120,120)
nueva='fondogris.jpg'
image.save(nueva)
#return nueva
print "centros de masa"
print centro
#dibujar los centros y las etiquetas en las formas
draw = ImageDraw.Draw(image)
m=0
for i in centro:
draw.ellipse((i[0]-2, i[1]-2,i[0]+2,i[1]+2), fill=(0,0,0)) #dibuja los puntos en los centros de las formas
draw.text(((i[0]+4,i[1]+4),), str(m), fill=(0,0,0)) #muestra las etiquetas cerca de los centros
m +=1
contiene = 0
for por in porcentaje: #muestra el id de la etiqueta y el porcentaje de color de cada una
print "Porcentaje de ID %d: %.2f"%(contiene, por[0])
contiene +=1
nueva2 = 'centro.jpg'
image.save(nueva2)
return nueva2, fel
def bfs(image,color,a,b): #para detectar por formas
imagen=image.load()
ancho,alto=image.size
original = imagen[a,b]
#punto=[]
c=[]
xs=[]
ys=[]
c.append((a,b))
n = 0
while len(c) > 0:
(x, y) = c.pop(0)
actual = imagen[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 < ancho and j >= 0 and j < alto:
contiene = imagen[i, j]
if contiene == original:
imagen[i, j] = color
xs.append(i)
ys.append(j)
n += 1
c.append((i, j))
#punto.append((i, j))
forma1 = image.save('formas.png')
return n, xs, ys, c
def busca_e(imagen,fel):
#image=Image.open(image)
#imagen=image.load()
#ancho,alto=image.size
for i in fel:
print len(i)
def main():
imagen, fel = im2()
imagen2 = busca_e(imagen,fel)
if __name__ == "__main__":
main()
view raw bfsn.py hosted with ❤ by GitHub





Por ahora solo nos muestra el porcentaje en un area especifica de las elipses rellenas con un color aleatorio y lo que es el total de la imagen. 




 Código:

import Image
from sys import argv
from math import*
from time import*
import math
import random
import ImageDraw
def elipse(): #para puntos de pendiente
imagen1 = argv[1]
image = Image.open(imagen1)
img = image.load()
tam = image.size
c = []
p = []
for i in range(tam[0]):
for j in range(tam[1]):
if(img[i, j] not in color):
if(img[i, j] != (255, 255, 255)):
c.append(img[i, j])
c.append(1)
p.append((i, j))
elif(img[i, j] in c):
pos = c.index(img[i, j])
c[pos+1] += 1
#print colors
print p
#porcentaje de pantalla
todo = tam[0] * tam[1]
print "\nTotal de pixeles = ", tam[0], "x", tam[1], "= ", todo, "\n"
#porcentaje
draw = ImageDraw.Draw(image)
m=0
for i in range(0,len(c),2):
print "Porcentaje de elipse ", c[i], " = "+str(round((c[i+1]/float(todo))*100))+"%"
#pt = pixel.index(colors[i])
draw.text(p[c], (str(round((c[i+1]/float(todo))*100))+"%"), fill="rgb(0, 255, 0)")
m += 1
image.save("elipse_"+img)
def main():
img = elipse()
if __name__ == "__main__":
main()
view raw por.py hosted with ❤ by GitHub

1 comentario:

  1. No estás detectando si la zona en sí es o no un elipse. Es simplemente un reciclado del código BFS. 5 pts.

    ResponderEliminar