miércoles, 1 de mayo de 2013

Labo Visión. Detección de polígonos.

Que tal gente, para esta semana se realizo la actividad de escribir un script que sea capaz de reconocer polígonos, misma que se describe a continuación.

Flujo del proceso.

  • El procedimiento para lograr lo anterior, consta de los siguientes pasos:
  • Se carga imagen original
  • Se convierte a escala de grises
  • Se aplica convolucion discreta, lo cual genera la imagen con los bordes encontrados y los gradientes
  • Se aplica BFS sobre la imagen de bordes, para agrupar los pixeles que forman parte del potencial objeto, al final, se obtiene una lista de coordenadas por objeto en la imagen.
  • Por cada lista de puntos:
    • Se itera sobre la lista para obtener los valores de los gradientes y sacar la pendiente de cada punto.
    • Se genera un mapa de pendientes, donde se agrupan todos los puntos que tengan una pendiente igual, se asume que los puntos con una misma pendiente son parte del mismo segmento, al final se obtiene un listado de puntos para cada pendiente, donde el total de elementos es igual al numero de lados del polígono.
    • Se descartan listados de puntos perdidos mediante un umbral.
    • Se calculan máximos y mínimos y punto medio de cada posible segmento.
    • Se busca el centro del polígono
    • Con el centro, se aplica bfs en es punto para obtener la masa del polígono.
Implementación

A continuación se muestran algunas funciones significativas del código:

La siguiente es la función encargada de calcula las pendientes, recibe el listado de puntos correspondiente a la forma detectada, y los gradientes de X y Y.

Para cada punto de la lista, obtiene el valor en los gradientes, y calcula la pendiente en el punto, al final se obtiene un listado de tuplas con la coordenada y el valor de la pendiente en dicho punto.


Después esta la función encargada de calcular los segmentos, esta función recibe el listado de pendientes calculadas para la forma, y comienza a agrupar las coordenadas con la misma pendiente para al final obtener la listas separas de los diversos segmentos que componen la forma

Al final se discriminan las listas muy cortas en base a un umbral, son listas que representa ruido o puntos perdidos en la imagen.

Después están estas dos funciones, encargadas de pintar cada linea que compone el polígono  esto en base a los picos y el punto medio del segmento obtenido.

Todo el código se puede ver acá.

Pruebas.

Bien, para la primera prueba, se utilizo una imagen con un solo polígono.

La imagen original es la siguiente:
despues de BFS:


Ahora se muestran las lineas detectadas que conforman la figura, pintando de colores distintos cada una, en base al mapa de pendientes:


En el log se observa lo siguiente:


Se muestra  primero la cantidad de objetos detectados, en este caso 1, y después se obtienen todas las coordenadas cuyos puntos coincidían con una pendiente común  y después la salida indicando de color se pintarían los pixeles correspondientes a cada pendiente  y el total de pixeles que la componen


ENTRADA EN PROCESO....




1 comentario:

  1. Pues, ya no puede estar en proceso, ya estoy calificando... 4 pts por el avance parcial.

    ResponderEliminar