Max Hernandez

Laberinto - Ejemplo de Canvas en HTML5

sábado, 20 de abril de 2013

Tarea 6: Detección de agujeros

Para esta semana en la clase de visión computacional se nos dio a la tarea de detectar la posición de agujeros en una imagen, después deberíamos marcar con un punto amarillo el centro del agujero, rellenar el agujero de un tono morado, con un tono morado mas fuerte marcar el relleno, dibujar una etiqueta para el agujero e imprimir en la terminal, los identificadores de cada agujero y su porcentaje de tamaño respecto a toda la imagen.

Detección de agujeros

Un agujero es una figura elíptica donde existe una hendidura y por lo tanto un cambio de intensidad de la luz, aprovechando esto es fácil detectar una imagen donde existe un agujero.
Estas técnicas pueden ser utilizadas para miles de aplicaciones entre ellas puede ser medir la calidad de la superficie de un producto, o para desviar agujeros que puedan presentar un obstaculo a autos robots.

La técnica que estaremos programando en esta clase sera la de utilizar matrices con patrones de agujeros, y buscando por patrones parecidos en la imagen. Dado que esta técnica puede tomar mucho tiempo de procesamiento si se buscan los patrones en toda la imagen, necesitamos reducir el espacio de búsqueda de los patrones, para lo cual utilizaremos un histograma de los cambios de intensidad en cada linea o columna de pixeles en la imagen.

Con la practica de laboratorio de esta semana generamos un código que nos redujo el espacio de búsqueda de patrones de agujeros en la imagen.

Características del patrón
El primer paso fue identificar el patrón de búsqueda, para eso tome varias fotos a un grupo de agujeros en un pedazo de cartón, tomando uno como muestra y sabiendo la posición del agujero extraje, la matriz del agujero y obtuve cuando variaba un valor de otro dividiendo todos los valores entre el número mas pequeño encontrado.

La matriz de 11x11 obtenida fue la siguiente:
[[ 1.67, 1.67, 1.68, 1.66, 1.66, 1.65, 1.66, 1.65, 1.65, 1.66, 1.65], 
[1.68, 1.66, 1.61, 1.50, 1.43, 1.43, 1.50, 1.61, 1.65, 1.66, 1.65], 
[1.66, 1.61, 1.39, 1.08, 1.07, 1.09, 1.42, 1.50, 1.61, 1.66, 1.65], 
[1.65, 1.39, 1.08, 1.03, 1.00, 1.04, 1.09, 1.45, 1.65, 1.66, 1.65], 
[1.65, 1.28, 1.03, 1.00, 1.00, 1.00, 1.07, 1.45, 1.65, 1.66, 1.65], 
[1.68, 1.28, 1.03, 1.01, 1.01, 1.01, 1.07, 1.51, 1.66, 1.66, 1.65], 
[1.68, 1.59, 1.28, 1.03, 1.03, 1.07, 1.46, 1.65, 1.66, 1.66, 1.65], 
[1.70, 1.70, 1.59, 1.34, 1.34, 1.46, 1.66, 1.66, 1.66, 1.66, 1.65], 
[1.70, 1.69, 1.69, 1.68, 1.68, 1.68, 1.66, 1.66, 1.66, 1.65, 1.65], 
[1.69, 1.69, 1.69, 1.69, 1.69, 1.68, 1.68, 1.66, 1.66, 1.66, 1.65], 
[1.69, 1.69, 1.69, 1.69, 1.69, 1.68, 1.68, 1.66, 1.66, 1.66, 1.65]]
Aunque no todos los orificios son iguales, los demás orificios deben de ser muy parecidos a este tomando en cuenta que la distancia a la cámara es la misma y los orificios fueron hechos con el mismo artefacto.

Los orificios que tome como patrón tienen un radio aproximado de 5 píxeles reduciendo el tamaño de la imagen a un máximo de 128x128, tiene fondo oscuro y va incrementando la intensidad de la luz conforme se acerca a las orillas.

La Medición del parecido se hizo de la misma forma que se aplica una mascara de convolución a un píxel (en nuestro caso a nuestro supuesto centro del orificio obtenido con los histogramas), recorriendo todos los vecinos y aplicando una operación entre la celda del patrón y el valor que se superpone en la imagen. La diferencia es que la operación aplicada es un factor absoluto de la resta entre la celda del patrón y el valor que le corresponde en la imagen. Sumando las operaciones en cada celda se obtuvo una aproximación numérica del cuanto se parece el patrón a los vecinos del lugar donde supuestamente esta el orificio.

Código

Resultados

Original Salida
max@max-laptop:~/Dropbox/vision_computacional/tarea6$ python hole.py lb7-1.png 
Porcentaje del agujero con respecto a la imagen
    Agujero:  H1 0.204427083333%
    Agujero:  H2 0.160807291667%
    Agujero:  H3 0.136067708333%
Tiempo de corrida: 1.7956700325


Original Salida
max@max-laptop:~/Dropbox/vision_computacional/tarea6$ python hole.py lb7-2.png 
Porcentaje del agujero con respecto a la imagen
    Agujero:  H1 0.0706380208333%
    Agujero:  H2 0.0670572916667%
Tiempo de corrida: 1.49644517899


En la tercera y ultima imagen no fue posible detectar la posición de los agujeros debido a que como puede verse en la búsqueda vertical de posibles agujeros se confunden los tres como si fueran un solo orificio, lo que provoca que el patrón buscado no quede en el centro y no sea detectado.
Original Salida del histograma
max@max-laptop:~/Dropbox/vision_computacional/tarea6$ python hole.py lb7-3.png 
Porcentaje del agujero con respecto a la imagen
Tiempo de corrida: 0.777371883392


Referencias:
http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/agujeros.pdf

2 comentarios:

  1. Para el último podría ser útil rotar la imagen de entrada para desalinear los agujeros. Se me hace que además tiene mucho ruido y se podría mejorarse la selección de umbral. 4 pts.

    ResponderBorrar
  2. No pues Yolo, no me funciono, me dio error en "call(['gnuplot', 'hole.plot'])" en subprocess no tengo eso

    ResponderBorrar