Etiquetas

jueves, 7 de marzo de 2013

Actividad#5 - Detección de Círculos

Para esta entrada se nos pidió realizar un programa que fuera capaz de detectar círculos dentro de una imagen, esto a partir de su radio.

Para realizar esto me apoye con las tareas realizadas anteriormente, y utilice el bfs para recorrer toda la imagen e ir detectando cada forma. Después ubique cada uno de los puntos centrales dentro de cada figura.



Y este es el código que utilice:
***
def formas(img,ancho,alto):
pixel= img.load()
cntdr = []
colors=[]
porcentajes=[]
cm=[] #cm = centros de masa
for i in range(ancho):
for j in range(alto):
if pixel[i,j]== (0,0,0):
a=random.randint(0,255)
b=random.randint(0,255)
c=random.randint(0,255)
(r,g,b)= (a,b,c)
#bfs(img,ancho,alto,(r,g,b),(i,j)) #se llama a la funcion bfs
cont,color,c1,c2,pts,bla = bfs(img,ancho,alto,(r,g,b),(i,j))
por=(cont/float(ancho*alto))*100
if por>.1:
cntdr.append(cont)
colors.append(color)
porcentajes.append(por)
#print 'ya pase'
try:
#c1 =centro 1 y c2 = centro 2
cms=((sum(c1)/float(len(c1)),sum(c2)/float(len(c2))))
cm.append(cms)
fig = circulos(bla,cms,cont,color)
except:
pass
#print 'sali'
m = cntdr.index(max(cntdr))
n = colors[m]
print m
print n
for i in range(ancho):
for j in range(alto):
if pixel[i,j] == n:
pixel[i,j]=(160,160,160)
#print 'pase por aki'
#porcentajes
#porcentaje = (float(num)/(ancho*alto))*100
draw=ImageDraw.Draw(img)
for i,Z in enumerate(cm):
draw.ellipse((Z[0]-2,Z[1]-2,Z[0]+2,Z[1]+2),fill=(0,0,0))# dibujar elipse
img3 =img.save('cm.jpg')
def bfs(img,ancho,alto,color,posa):
pixel= img.load()
cont=0
cen1=[]
cen2=[]
cola=[] #creamos la cola
puntos = []
cola.append(posa) #posicion actual se agrega a la cola
bla = posa
inicio = pixel[posa]
while len(cola)>0:
(i,j)=cola.pop(0)
posa = pixel[i,j]
if (posa == inicio or posa ==color):
try:
if(pixel[i-1,j]):
if(pixel[i-1,j]==inicio):
pixel[i-1,j] = color
cola.append((i-1,j))
cont+=1 # contador para encontrar los pixeles ke van en gris
cen1.append((i-1))
cen2.append((j))
puntos.append((i-1,j))
except:
pass
try:
if(pixel[i+1,j]):
if(pixel[i+1,j]==inicio):
pixel[i+1,j] = color
cola.append((i+1,j))
cont+=1
cen1.append((i+1))
cen2.append((j))
puntos.append((i+1,j))
except:
pass
try:
if(pixel[i,j-1]):
if(pixel[i,j-1]==inicio):
pixel[i,j-1] = color
cola.append((i,j-1))
cont+=1
cen1.append((i))
cen2.append((j-1))
puntos.append((i,j-1))
except:
pass
try:
if(pixel[i,j+1]):
if(pixel[i,j+1]==inicio):
pixel[i,j+1] = color
cola.append((i,j+1))
cont+=1
cen1.append((i))
cen2.append((j+1))
puntos.append((i,j+1))
except:
pass
img = img.save('forms.jpg')
return cont,color,cen1,cen2,puntos,bla
def circulos(bla,cms,cont,color):
print '---Analizando Forma---'
x1,y1 = bla
x2,y2 = cms
print '-- Punto de inicio:'+str(bla)
print '-- Centro: '+str(cms)
area = cont
print '--Area de la Fig revisada:'+str(area)
radio = math.sqrt(((x2-x1)**2)+((y2-y1)**2))
print '--Radio:'+str(radio)
revarea=(pi*(pow(radio)))
print '--Area del posible circulo:'+str(revarea)
print '--Comparando Areas -- '
if(revarea-100)<area<(revarea+100):
print 'Si es circulo'
else:
print 'No es circulo'
view raw c.py hosted with ❤ by GitHub
***
Aunque no es lo que esperaba de resultado, ya que tuve algunos conflictos al enviar algunos datos desde el bfs, esto lo que tengo hasta ahora. Espero tener algo mejor para la próxima entrada.

:/

Repositorio

1 comentario: