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.
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 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() |
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:
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
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() |
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