En está entrada tenemos que detectar formas en una imagen a partir de la tarea 1, lo que debemos de tener primero para comenzar es aplicarle convolucion a la imagen y después de eso normalizarla y binarizarla.
Imagen a utiliar:
Imagen aplicando convolución:
Imagen normalizada:
Imagen binarizada:
Ahora que tenemos lo anterior basandome en el código que realizo la Dra. Elisa del bfs detecte las formas y las pinte de un color cada una. El bfs lo que realiza es buscar los vecinos y agregarlos a una cola (los vecinos tienen q ser del mismo color que el pixel original), cada vez q cheka un pixel sus vecinos de ese pixel se agregan a la cola.
Cuando la imagen esta completamente pintada sacando su porcentaje de cada uno de las formas pinte la más grande de color gris:
Cuando la imagen esta completamente pintada sacando su porcentaje de cada uno de las formas pinte la más grande de color gris:
El código es el siguiente del bfs y para pintar las formas:
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 c_colorear(self): | |
im=self.boton_convolucion() | |
pixels=im.load() | |
porcentajes=[] | |
fondos=[] | |
centro_masa=[] | |
ancho,alto=im.size | |
t_pixels=ancho*alto | |
c=0 | |
for i in range(ancho): | |
for j in range(alto): | |
pix = pixels[i,j] | |
r,g,b= random.randint(0,255),random.randint(0,255), random.randint(0,255) | |
fondo=(r,g,b) | |
if (pix==(0,0,0)): | |
c +=1 | |
origen=(i,j) | |
num_pixels,abscisa,ordenada=self.bfs(pix,origen,im,fondo) | |
p=(num_pixels/float(t_pixels))*100 | |
if p>.10: | |
porcentajes.append(p) | |
fondos.append(fondo) | |
# print num_pixels | |
centro_masa.append((sum(abscisa)/float(num_pixels),sum(ordenada)/float(num_pixels))) | |
# print centro_masa | |
# raw_input() | |
self.colocar_gris(im,porcentajes,fondos) | |
self.centro_masa(im,centro_masa) | |
self.imprimir_porcentajes(porcentajes) | |
print 'c',c | |
print 'termino' | |
im.save('final.jpg') | |
return im | |
def bfs(self,pix,origen,im,fondo): | |
pixels=im.load() | |
cola=list() | |
lista=[-1,0,1] | |
abscisa=[] | |
ordenada=[] | |
cola.append(origen) | |
original = pixels[origen] | |
num=1 | |
while len(cola) > 0: | |
(i,j)=cola.pop(0) | |
actual = pixels[i,j] | |
if actual == original or actual==fondo: | |
# pixels[i,j] = fondo | |
for x in lista: | |
for y in lista: | |
a= i+x | |
b = j+y | |
try: | |
if pixels[a,b]: | |
contenido = pixels[a,b] | |
if contenido == original: | |
pixels[a,b] = fondo | |
abscisa.append(a) | |
ordenada.append(b) | |
num +=1 | |
cola.append((a,b)) | |
except IndexError: | |
pass | |
im.save('23333.png') | |
return num,abscisa,ordenada |
Código para pintar de gris la forma con más porcentaje:
Después coloco los centros de masa de cada una de las formas:
Para colocar estos centros me base en el método de las áreas:
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 colocar_gris(self,im,porcentajes,fondos): | |
pixels=im.load() | |
ancho,alto=im.size | |
l=porcentajes.index(max(porcentajes)) | |
color=fondos[l] | |
for i in range(ancho): | |
for j in range(alto): | |
if pixels[i,j]==color: | |
pixels[i,j]=(95,95,95) | |
im.save('fr.png') | |
return |
Después coloco los centros de masa de cada una de las formas:
Para colocar estos centros me base en el método de las áreas:
A cada pixel lo tome como una área y su ordenada y su abscisa como x y como y de la ecuación anterior.
Para poder realizar esto cada vez que recorria la imagen pintando pixel por pixel del mismo color agregue su ordenada y su abscisa a dos listas y para sacar su centro de masa:
en x= sum(abscisa)/float(num_pixels)
en y=sum(ordenada)/float(num_pixels)
El área de cada pixel es 1.
Les agrego la étiqueta a cada uno de ellos
Para añadir la étiqueta solo utilice el label de TKinter y lo acomode alado del centro de masa de cada forma.
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
def centro_masa(self,im,centros): | |
# pixels=im.load() | |
draw = ImageDraw.Draw(im) | |
for i,punto in enumerate(centros): | |
draw.ellipse((punto[0]-2, punto[1]-2, punto[0]+2, punto[1]+2), fill=(0,0,0)) | |
label_id = Label(text=i) | |
label_id.place(x = punto[0]+16, y = punto[1]) | |
im.save('centro.png') | |
return |
Y al final en la términal imprime los id y el porcentaje de cada forma:
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
def imprimir_porcentajes(self,porcentajes): | |
for i,p in enumerate(porcentajes): | |
print 'Figura ID: %d Porcentaje: %f' %(i,p) |
El código esta completo en mi repositorio: Link
Más imagenes
"q cheka"... Other than that, muy bien. 5 pts.
ResponderEliminar