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):
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 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 | |
El código para graficar es el siguiente (basaso en el código de la Dra. Elisa):
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 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 |
idealmente sería una regla horizontal y una vertical por cada agujero; hay mucho ruido en tu detección. 9 pts.
ResponderEliminar