miércoles, 8 de mayo de 2013

Lab: detección de esquinas

Se nos pide realizar para este laboratorio como parte básica, detectar las esquinas con el método de diferencia de filtro mediano y como parte avanzada, hacer un wire-frame uniendo las esquinas con segmentos de líneas.

El procedimiento que realicé:

  • Cambiamos a grises
  • Agregamos el filtro de la mediana varias veces
  • Sacamos la diferencia 
  • Ponemos un umbral
  • Obtenemos esquinas
  • Obtenemos los bordes con Laplaciana
  • Agregamos BFS
  • Hacemos un corte en cada primera esquina detectada
  • Agregamos otra vez BFS en la imagen cortada
  • Unimos esquinas 
Capturas de pantalla:







Este es el código importante:

def boton_esq():
#Cambiamos a grises
imagen = cambiar_agrises(path_imagen_original)
imagen.save("paso_1.jpg")
#Agregamos filtro de la mediana
imagen_median = cambiar_promedio(imagen)
for i in range(8):
imagen_median = cambiar_promedio(imagen_median)
imagen_median.save("paso_2.jpg")
#Sacamos la diferencia
imagen_dif = diferencia(imagen_median, imagen)
imagen_dif.save("paso_3.jpg")
#Ponemos un umbral y tenemos bordes
imagen_um = cambiar_umbral(imagen_dif, 0.3) #ESTE UMBRAL CAMBIA
imagen_um.save("paso_4.jpg")
#Agrego Laplaciana para bordes
umbral_valor = 0.5
h_lap = numpy.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]])
imagen_lap, puntos = convolucion(imagen, numpy.multiply(1.0/1.0,h_lap))
imagen_lap = cambiar_umbral(imagen_lap, 0.1)
imagen_BFS = cambiar_umbral(imagen_lap, umbral_valor)
imagen_BFS.save("paso_5.jpg")
#Agregamos BFS
imagen_BFS, colores, poligonos = aplicar_BFS(imagen_BFS)
imagen_BFS.save("paso_6.jpg")
esq_pix = imagen_um.load()
dibuja = ImageDraw.Draw(imagen_lap)
corte = []
for poli in poligonos:
for i in range(len(poli)):
esq = esq_pix[poli[i][0], poli[i][1]]
if esq[0] == 255:
dibuja.ellipse((poli[i][0]-6,poli[i][1]-6,poli[i][0]+6,poli[i][1]+6), fill="black")
cor = (poli[i][0], poli[i][1])
corte.append((poli[i][0], poli[i][1]))
break
#Agregamos BFS
imagen_BFS, colores, poligonos = aplicar_BFS(imagen_lap)
imagen_BFS.save("paso_ALGO.jpg")
x, y = imagen.size
imagen_nueva = Image.new("RGB", (x, y))
dibuja = ImageDraw.Draw(imagen_nueva)
cont = 0
for poli in poligonos:
cor = (corte[cont][0], corte[cont][1])
dibuja.ellipse((cor[0]-6,cor[1]-6,cor[0]+6,cor[1]+6), fill="red")
for i in range(len(poli)):
cor_ant = cor
esq = esq_pix[poli[i][0], poli[i][1]]
if esq[0] == 255:
dibuja.ellipse((poli[i][0]-6,poli[i][1]-6,poli[i][0]+6,poli[i][1]+6), fill="red")
cor = (poli[i][0], poli[i][1])
if cor != "NULL" and cor_ant != cor and cor_ant != "NULL":
dibuja.line((cor_ant[0], cor_ant[1], cor[0], cor[1]), fill="red")
dibuja.line((corte[cont][0], corte[cont][1], cor[0], cor[1]), fill="red")
cont = cont + 1
imagen_nueva.save("paso_7.jpg")
view raw esq.py hosted with ❤ by GitHub

1 comentario:

  1. La explicación no es exactamente la mejor posible, pero el código hace todo lo necesario. 9 pts.

    ResponderEliminar