lunes, 18 de febrero de 2013

Tarea2: Detección de formas

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:




El código es el siguiente del bfs y para pintar las formas:
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
view raw detector.py hosted with ❤ by GitHub



Código para pintar de gris la forma con más porcentaje:
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
view raw centros.py hosted with ❤ by GitHub


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:
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
view raw centro_masa.py hosted with ❤ by GitHub




Y al final en la términal imprime los id y el porcentaje de cada forma:


Código:
def imprimir_porcentajes(self,porcentajes):
for i,p in enumerate(porcentajes):
print 'Figura ID: %d Porcentaje: %f' %(i,p)
view raw porcentaje.py hosted with ❤ by GitHub

El código esta completo en mi repositorio: Link

 Más imagenes




1 comentario: