February 18, 2013

Tarea 2.Detectar y etiquetar formas

Para esta tarea lo que se realizó fue lo siguiente:
  • Una rutina que detecta todos los componentes conexos separados por bordes.
  • El componente más grande debe suponerse ser el fondo, y colorearse gris.
  • Los demás dibujos se les asignan colores fuertes. Colocando el borde en blanco y un punto negro en el centro indicando el centro de masa.
  • Al lado del centro de masa, agregar una etiqueta del componente.
  • Imprimir un listado con los porcentajes de la parte del total que abarca un componente y su ID.
Primero que nada hice la rutina para colorear las diferentes formas, pero para esto primero se debe pre-procesar la imagen, es decir: 
  • Primero cambiarla a escala de grises
  • Despúes aplicar un filtro utilizando el promediado de los vecinos
  • Luego encontrar los bordes de la imagen
  • Normalizarla
  • Y por último binarizar la imagen
Para detectar los bordes utilicé la siguiente máscara:



Esta es la primera imagen que utilicé como prueba cuando hice la rutina de bfs para iniciar con la obtención de las formas:

Despues del pre-procesamient la imagen queda de la siguiente manera:



BFS

Esta rutina es para colorear los componentes conexos, y lo que hace es que toma un pixel origen (sus coordenadas) y a partir de él recorrer todos sus vecinos que comparten el mismo color y a todos ellos asignarle el mismo color; también lleva el conteo de todos los pixeles de la forma detectada para después calcular el porcentaje de la forma con respecto al total de pixeles de la imagen. Bueno cabe aclarar que para realizar esta rutina tomé como base el código realizado por la Dra, en clase.

Aquí algunas pruebas con la imagen del cuadrado:

Con origen en 0,0                                                                                     Origen en 52,60                              

                                                         Origen en 61, 133


  
Código




Después de esto hice una rutina para poder recorrer toda la imagen y obtener todas las formas de la imagen. Bueno lo que hice fue recorrer los pixeles de la imagen pre-procesada y aplicar a cada pixel la rutina de BFS. En la primer versión de esta rutina de esta versión marcaba cada uno de los pixeles visitados en una lista para no recorrer todos, pero tomaba mucho tiempo al momento de ejectuarlo y despúes caí en cuenta que solo los bordes son blancos por lo que cambie a comparar sólo los pixeles negros de la imagen. Con esto no quiere decir que a cada pixel se le aplica BFS ya que una vez que entró en la rutina el primer pixel negro, detecta una forma y cambia el color por lo que ya todos los pixeles vecinos dejan de ser negros y ya no entran en la comparación.

A cada forma se le asigna un color aleatorio, y las coordenadas en x y y se guardan en listas para después obtener los centros de masa o centroids y los porcentajes.

Aquí algunas pruebas:




Como se puede apreciar en las capturas, en esta prueba se localizaron 17 figuras, debieran de ser más pero al momento de obtener los bordes las líneas no quedan del todo bien definidas por lo que quedan algunos espacios y al momento de recorrer la imagen se toma como una sola. Pero detecta casi todas las figuras y como se puede ver la primer figura detectada es el fondo con un .38 que vendría a ser un 38% de la imagen.




Código



Repositorio git: github.com/JonathanAlvarado/VisionComputacional

1 comment: