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:
***
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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' |
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