jueves, 2 de mayo de 2013

Laboratorio 8: Detección de Polígonos

Para esta semana se nos dio la tarea de hacer un programa que detecte polígonos en una imagen.
Además de detectarlos se pidió, clasificarlos, etiquetarlos e imprimir como salida en terminal el porcentaje de pixeles que ocupa con respecto a la imagen total.

Para explicar el procedimiento usaré la siguiente imagen:

Lo primero que se debe de hacer es obtener las líneas de la imagen. Esto se hace con la transformada de Hough. Para poder iniciar, hice uso de la rutina de detección de líneas programada en una tarea anterior con ligeras modificaciones. 


De esa manera se pueden obtener todas las líneas de la imagen (tanto internas como externas), pero no era posible discriminar unas de otras, es decir eran meramente pixeles juntos que sería difícil distinguir si llegasen a cruzarse. Para evitar eso, dibuje todos los pixeles detectados como partes de líneas en una imagen temporal de un mismo color, formando algo así:

Ahora, utilizando un recorrido bfs, se buscan pixeles blancos para empezar y pintar a sus vecinos blancos también, pero con una condición. Durante la transformada de Hough podemos obtener los pares $(\rho, \theta)$ de cada pixel, por lo que hago uso de los $\theta$ para discriminar entre diferentes líneas en caso en que estén conectadas. Esto debido a que es bastante obvio que cuando un pixel tiene diferente ángulo a uno vecino, ambos pertenecen a dos diferentes líneas.

Con ese recorrido separo todas las líneas y las guardo y es posible para forma de ejemplo, pintarlas de diferentes colores:


Ya teniendo todos los segmentos de línea conocidos, lo siguiente es buscar a que figura pertenecen. Para encontrar las figuras se utiliza de nuevo un recorrido bfs, pero ahora en una imagen conteniendo los bordes (obtenida utilizando convolución u otros filtros). 


La imagen parece la misma que en las líneas, pero en este caso solo se detectan los bordes y no hay excesos cerca de las esquinas. Ya localizadas nuestras figuras y almacenados los puntos, es momento de comparar los puntos de estos bordes con los puntos de las lineas. Línea por línea, punto por punto, buscamos que por lo menos una cierta cantidad de pixeles estén cubiertos.
Nota: Es posible que la detección de líneas se haga a un lado de la línea, o encima de ella, para lo cual es necesario comparar por cada pixel de la línea, sus pixeles alrededor.

Si la línea pertenece a la figura, las asociamos y contamos al final para cada figura cuantas líneas se le asociaron. Si fueron 2 o menos, no es un polígono claramente y se ignora. De ser más de 2, se encuentra el centro de la figura utilizando un promedio de los puntos en x y y de los bordes y se coloca sobre el un tag, además de pintar el polígono utilizando un recorrido BFS desde el centro con colores variados:
  • Polígonos de 3 lados se pintan de rojo.
  • De 4 verde.
  • De 5 Azul.
  • De 6 Rosa.
  • De 7 Amarillo.
  • De 8+ aleatorio.
El resultado en la imagen de ejemplo es:




(Nota: En mi caso, las líneas eran detectadas tanto interior como exteriormente, por lo cual se hubieran localizado 2 polígonos por cada uno, pero para evitar esto busque centros repetidos, e ignoraba el segundo (los promedios de los puntos de las líneas de los polígonos tanto internas como externas, arrojaban el mismo centro.)

Otros ejemplos:

Entrada:

Salidas:

 Entrada :
Salidas:


Entrada:
 Salidas:


Código:

1 comentario:

  1. La identificación del centro no es con la técnica encargada. El resto parece bien. 8 pts.

    ResponderEliminar