lunes, 18 de febrero de 2013

Detección de formas


  • A partir de lo escrito para T1, ahora agregue (aún sin andar googleando y sin usar librerías para visión) una rutina que detecta todos los componentes conexos separados por los bordes detectados.
Para lograr hacer esto lo primero que hay que hacer es perfeccionar el método que se hizo en la tarea pasada de detección de bordes, aquí simplemente cambie las máscaras que usaba por el operador Laplaciano:
Lo siguiente que se hace es detectar los bordes de una imagen muy simple en donde el reto sea detectar las formas y no cerrar los bordes (el método de bordes de todas maneras ya fue mejorado), empezaremos con una simple:


Lo que hay que hacer es comenzar a colorear todas los píxeles de cada objeto, para hacer esto programé una función que recorre todos los píxeles de la imagen con el algoritmo BFS.
En esta rutina se recorren los píxeles de la imagen, si el pixel es negro entonces se manda llamar a la función bfs() para poder colorear todos los píxeles circundantes hasta que se pinten todos, la rutina bfs devuelve una imagen modificada con nuevos colores para poder buscar en ella los puntos negros que queden y poderlos colorear mandando llamar la misma función en el siguiente ciclo.


Esta función es la encargada de pintar cada una de las figuras, es una modificación a el código visto en clase hecho por la Doctora Elisa:



Así queda la imagen:


  • El componente más grande se supone ser el fondo y se colorea gris.
Para hacer esto primero se necesitaba tener coloreadas las figuras para ya tener un conocimiento previo de su tamaño, después se saca un porcentaje dependiendo de la cantidad de píxeles que cubre una figura con respecto a la cantidad de píxeles totales de la imagen, ya una vez que se tiene cual es la de mayor porcentaje con ese color que se guardo de esa forma se hace de nuevo bfs() para pintar todo el fondo de color gris.
Así es como queda la imagen:


  • Los demás objetos están asignados colores fuertes. En cada objeto, el borde se dibuja en blanco y se coloca un pequeño círculo negro para indicar el centro de masa.
Ahora lo que sigue es dibujar el centro de masa (las figuras muy pequeñas no las tomo en cuenta) , esto se obtiene sumando sus coordenadas "x" y "y" y promediandolas.
  • Al lado del centro de masa se agrega una etiqueta del ID del componente.
También se agrega al lado del centro de masa una etiqueta con una ID del numero de objeto detectado, los objetos basura (objetos basura son los que están muy pequeños) también tienen IDs.


  • El programa imprime un listado que indica para cada ID el porcentaje de la imagen abarcado por ese componente.


Partes importantes de código
Para dibujar etiquetas y centros de masa:



BFS:



Otras pruebas
Mapa:







Mariposa:





Liga al repositorio


Referencias

Visión Computacional, Elisa Schaeffer

1 comentario: