Aquí las imágenes que utilice para realizar el ejercicio.
Ahora a partir de las tareas antes realizadas a estas imágenes también les agregue lo que es convolucion y binarizacion para facilitar el detectar las formas. Esto para que cuando se recorran todos los pixeles se identifique como borde aquellos pixeles que son blancos, entonces todo lo que se encuentra dentro de ellos es una forma/figura.
Ahora aplicando la detección de formas obtenemos lo siguiente:
Como vemos a cada figura se le asigna un color random para identificar una de otra. Para obtener el fondo gris, elabore una lista, la cual contenía los datos de la cantidad de pixeles que se recorrieron dentro de cada figura, y después obtuve cual lugar era el que mayor cantidad de pixeles recorrió y asigne el color gris.
El código que utilice es el siguiente:***********
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=[] | |
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 = bfs(img,ancho,alto,(r,g,b),(i,j)) | |
cntdr.append(cont) | |
colors.append(color) | |
#print 'ya pase' | |
#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' | |
img =img.save('fondo.jpg') | |
def bfs(img,ancho,alto,color,posa): | |
pixel= img.load() | |
cont=0 | |
cola=[] #creamos la cola | |
cola.append(posa) #posicion actual se agrega a la cola | |
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 | |
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 | |
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 | |
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 | |
except: | |
pass | |
img = img.save('forms.jpg') | |
return cont,color |
Y esta es la imagen que obtengo al ubicar los centros de masa:
Lo que agregue al código para encontrar estos centros es lo siguiente:
********
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
try: | |
#c1 =centro 1 y c2 = centro 2 | |
cm.append((sum(c1)/float(len(c1)),sum(c2)/float(len(c2)))) | |
except: | |
pass | |
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)) | |
img =img.save('cm.jpg') |
********
Lo que hago aquí es crear una lista que me almacene los centros encontrados cada vez que se manda llamar a la función bfs.
Aqui adjunto la liga al repositorio:
https://github.com/AdriC1705/Viscomp.git
:) 5 pts.
ResponderEliminar