jueves, 25 de abril de 2013

Lab 7: Detección de agujeros

En esta semana se encargo lo siguiente:

• Sacar los histogramas vertical y horizontal
• Graficar los histogramas
• Buscar los minimos locales
• Lozalizar intersección (pico del histograma horizontal o vertical)

• Dibujen encima de casa imagen una recta para cada pico del histograma lateral; independientemente para horizontal & vertical.
• Las intersecciones deberían coincidir con los agujeros.
• Es efectivamente un preprocesamiento de lo que requiere

Las imagenes con las que probe fueron las siguientes:


Gráfica de histograma vertical y horizontal




Prueba 2


Grafica de histograma vertical y horizontal






El código es el siguiente (se obtinenen los minimos locales, se sacan intersecciones y se pintan las liíneas):


def detectar_agujero(self,horizontal,vertical,image):
minimosh=self.minimos_locales(horizontal)
minimosv=self.minimos_locales(vertical)
minimosh2 = minimosh[-4:]
minimosv2 = minimosv[-4:]
pixeles=image.load()
corx=[]
cory=[]
for x in minimosh2:
for y in range(image.size[1]):
pixeles[x,y] = (255,255,0)
corx.append((x,y))
for y in minimosv2:
for x in range(image.size[0]):
pixeles[x,y] = (0,0,255)
cory.append((x,y))
inte=self.intersecciones(corx,cory)
print 'intersecciones-long',inte
image.show()
#self.pintar(vertical)
im_bin=self.boton_convolucion()
im=self.verificar_agujero(im_bin,inte,image)
#img = self.cargar_imagen(im)
im_bin.show()
return im
def verificar_agujero(self,im_bin,inte,image):
print 'verificando'
draw = ImageDraw.Draw(im_bin)
imagefinal = Image.open(self.o_imagen)
pixels=im_bin.load()
ancho,alto=im_bin.size
t_pixels=ancho*alto
masa=[]
fondos=[]
centro_masa=[]
porcentajes=[]
for i in inte:
origen=i
fondo=(92,random.randint(10,70),random.randint(70,80))
print 'i',i
#raw_input()
pix=pixels[i]
if pixels[i]==(0,0,0):
print 'entro'
num_pixels,abscisa,ordenada,puntos=self.bfs(pix,origen,im_bin,fondo)
p=(num_pixels/float(t_pixels))*100
if p>.10:
centro=(sum(abscisa)/float(num_pixels),sum(ordenada)/float(num_pixels))
#centro_masa.append(centro)
masa.append(num_pixels)
porcentajes.append(p)
print 'bfs'
fondos.append(fondo)
centro_masa.append(centro)
self.pinta(puntos,imagefinal,fondo)
self.centro_masa(imagefinal,centro_masa)
self.imprimir_porcentajes(porcentajes)
print 'termino'
im_bin.save('final.jpg')
imagefinal.save('si.png')
return im_bin
def minimos_locales(self,vector):
minimos=list()
media=sum(vector)/len(vector)
media2=(max(vector)+min(vector))/2
print 'media',media
print 'media2',media2
for i in range(1,len(vector)-1):
if vector[i-1]>vector[i]<vector[i+1]:
if vector[i]<media:
minimos.append(i)
return minimos
view raw f.py hosted with ❤ by GitHub

El código para graficar es el siguiente (basaso en el código de la Dra. Elisa):

def graficar(self,horizontal,vertical,image):
plt.clf()
fig=plt.subplot(111)
topex=max(horizontal)
minx=min(horizontal)
topey=max(vertical)
miny=min(vertical)
ancho,alto=image.size
if ancho>alto:
n=ancho
else:
n=alto
if topex > topey:
tope=topex
else:
tope=topey
if minx>miny:
minimo=miny
else:
minimo=minx
print 'horixontal',horizontal
print 'vertical',vertical
plt.ylim(minimo-500,tope * 1.1)
plt.xlim(-0.1*n,1.1*n)
plt.title('Histograma')
x=range(1,ancho+1)
y=range(1,alto+1)
plt.plot(x,horizontal,'r-',linewidth=2,label='horizontal')
plt.plot(y,vertical,'b-',linewidth=2,label='vertical')
box = fig.get_position()
fig.set_position([box.x0, box.y0 + box.height * 0.1,box.width, box.height * 0.9])
fig.legend(loc = 'upper center', bbox_to_anchor=(0.5, -0.05),
fancybox = True, shadow = True, ncol = 1)
plt.show()
return
view raw graficar.py hosted with ❤ by GitHub

1 comentario:

  1. idealmente sería una regla horizontal y una vertical por cada agujero; hay mucho ruido en tu detección. 9 pts.

    ResponderEliminar