jueves, 25 de abril de 2013

Preprocesamiento - Detección de agujeros

Prueban con algunas imágenes que contienen unos pocos objetos que no se empalman entre ellos y que tienen agujeros.
Usen fotografías tomadas por ustedes mismos.

Las fotografías que yo usaré son:







Dibujen encima de cada imagen una recta para cada pico del histograma lateral; independientemente para horizontal & vertical.
Imágenes mias:












en esta imagen vemos que se dibujan varias líneas debido a que los agujeros no están  alineados

Imagen de internet 1:





Imagen de internet 2:



Imagen de internet 3:






Código:

#!/usr/bin/python
from PIL import Image, ImageDraw
import random
import filtros
import time
from math import sqrt, fabs
import sys
import matplotlib.pyplot as plt
import numpy as np
def dibuja_lineas(lista, imagen, op):
"""dibuja las lineas verdes si es horizontal
o rojo si es vertical
"""
x, y = imagen.size
draw = ImageDraw.Draw(imagen)
if op == 1:
for i in lista:
#lineas horizontales
draw.line((0,i, x,i), fill="green")
else:
for i in lista:
#lineas verticales
draw.line((i,0, i,y), fill="red")
return imagen
def encuentra_minimos(lista):
"""encuentra los minimos de la grafica
"""
c = 0
promedio = 0
minimos_temp = {}
minimos = {}
for i, valor in enumerate(lista):
try:
if lista[i-10]>=lista[i] and lista[i+10]>lista[i]:
minimos_temp[i]=lista[i]
c = c + 1
promedio = promedio + valor
except:
pass
promedio = promedio/c
print minimos_temp
minimos_temp = sorted(minimos_temp.items(), key=lambda x: x[1])
print "temporal"
print minimos_temp
for i in minimos_temp:
if i[1] < promedio:
minimos[i[0]] = i[1]
print minimos
return minimos
def graficar(columnas, renglones):
"""grafica dividiendo el canvas en 2
columnas y renglones
"""
fig = plt.figure()
fig.subplots_adjust(hspace=.5)
uno = fig.add_subplot(2,1,1)
uno.plot(np.arange(len(renglones)), renglones)
uno.set_xlabel('renglon')
uno.set_ylabel('suma')
uno.set_title('Horizontal')
uno.grid(True)
dos = fig.add_subplot(2,1,2)
dos.plot(np.arange(len(columnas)), columnas, 'r')
dos.set_xlabel('columna')
dos.set_ylabel('suma')
dos.set_title('Vertical')
dos.grid(True)
plt.savefig('hola.png')
def vertical(pixeles,x,y):
"""sumatoria por columnas
"""
col_total = []
for i in range(y):
col = []
for j in range(x):
col.append(pixeles[j,i][0])
col = sum(col)
col_total.append(col)
return col_total
def horizontal(pixeles,x,y):
"""sumatoria por renglones
"""
row_total = []
for i in range(x):
row = []
for j in range(y):
row.append(pixeles[i,j][0])
row = sum(row)
row_total.append(row)
return row_total
def main():
"""funcion principal
"""
VERTICAL = 1
HORIZONTAL = 0
MAXIMA = 1
MINIMA = 0
try:
imagen_path = sys.argv[1]
imagen = filtros.abrir_imagen(imagen_path)
except:
print "No seleccionaste una imagen"
return
imagen = filtros.hacer_gris(imagen)
imagen = filtros.normalizar(imagen)
original = imagen.copy()
#imagen = filtros.umbral(imagen)
imagen.show()
pixeles = imagen.load()
x, y = imagen.size
suma_columnas = vertical(pixeles,x,y)
suma_renglones = horizontal(pixeles,x,y)
#se encuentran los minimos de las columnas
min_col = encuentra_minimos(suma_columnas)
#se encuentran los minimos de los renglones
min_ren = encuentra_minimos(suma_renglones)
#se dibujan las lineas verticales
nueva = dibuja_lineas(min_col, original, 1)
#se dibujan las lineas horizontales
nueva = dibuja_lineas(min_ren, nueva, 2)
nueva.show()
graficar(suma_columnas, suma_renglones)
main()
view raw gistfile1.py hosted with ❤ by GitHub


Refrencias

Visión computacional - Elisa Schaeffer

1 comentario: