Mostrando entradas con la etiqueta Laboratorio Visión Computacional. Mostrar todas las entradas
Mostrando entradas con la etiqueta Laboratorio Visión Computacional. Mostrar todas las entradas

miércoles, 8 de mayo de 2013

[Lab VC] Actividad 8: Detección de esquinas


Para ésta tarea se debieron programar las rutinas para detectar esquinas en imagenes. Para ello se utilizó una combinación entre filtro mediano y filtro en escala de grises.


Teoría

Primeramente, los pasos necesarios para la detección son:
  • Aplicar filtro mediano a la imágen
  • Aplicar filtro escala de grises a la imágen
  • Por cada pixel, restar el valor del filtro mediano al filtro en escala de grises, dicha diferencia al final resaltará las esquinas a color blanco.
  • Identificar las coordenadas donde se encuentra cada esquina y asignarlas al objeto al que pertenecen. Se puede utilizar detección de bordes y BFS para dicho objetivo.
  • Se hace un corte pequeño en los bordes detectados (borde discontinuo), al utilizar BFS nuevamente el corte obligará al BFS a recorrer los pixeles en una sola dirección, lo que permitirá darle un orden al las esquinas detectadas.
  • Con las esquinas asignadas a cada objeto y ordenasas, conectarlas con una línea para obtener el wireframe de cada objeto o polígono detectado.
  • Dibujar las lineas, y si se requiere, etiquetar las esquinas y objetos.

    Práctica

    Las imagen utilizada para las pruebas fue la siguiente:

    Imágen original


    Se eligió la imágen porque cuenta con varias figuras para hacer diferentes pruebas, es una imágen con poco ruido en realidad y por ahora es necesario que las figuras se encuentren separadas y rellenas de un color solido para poder resaltar sus bordes correctamente.

    Objetos completamente sólidos


    Resultados

    Para los resultados primero se sacan los bordes

    Bordes detectados

    Después realizamos el corte en los bordes, no se alcanza a ver muy bien, pero haciendo zoom en la imágen se alcanza a ver muy bien

    Corte en la primer esquina detectada

    Lo demás ya es automático, recorriendo los bordes podemos fácilmente ordenar las esquinas, ya solo es de etiquetarlas y dibujar el wireframe, es éste caso es de color negro y muy delgado pero ahí esta. En la terminal se ve un paso intermedio, donde se asignan las esquinas a cada objeto, por ello hay 4 listas.


    En la imágen, el wireframe con las esquinas y objetos etiquetados.
    En la terminal, las esquinas asignadas a cada objeto.


    Código


    En el repositorio encuentran la implementación completa en código, la carpeta marcada como Tarea 9.


    Para la detección de esquinas

    Para dibujar en la GUI


    Referencias:

    jueves, 2 de mayo de 2013

    [Lab VC] Actividad 7: Detección de polígonos


    Para ésta tarea se debieron programar las rutinas para detectar polígonos con base en las líneas rectas detectadas en la imagen. Para ello se utilizó la Transformada de Hough.


    Teoría

    Primeramente, los pasos necesarios para la detección son:
    • Trabajar con la imagen en escala de grises.
    • Detectar los bordes, altamente recomendable que los bordes sean continuos.
    • Separar los polígonos por su borde, es decir, agrupar los pixeles contiguos utilizando alguna técnica como BFS.
    • A cada lista de borders, aplicar la convolucion discreta, en este caso se elegieron 2 máscaras de Sobel
    • A partir de las matrices de gradientes obtenidas, calcular la pendiente local para cada pixel.
    • Agrupar los pixeles con la misma pendiente. Cada grupo representa un posible segmento, eliminar aquellos grupos que generan ruido, por ejemplo, si tienen pocos pixeles.
    • Ordenar los pixeles de cada segmento para obtener los puntos teóricos inicial y final.

    Práctica

    Las imagen utilizada para las pruebas fueron las siguientes:

    Original
    Binarizada
    Contornos

    La prueba realizada fue muy simple, detección de bordes e identificación del posible segmento, sin embargo podemos notar que se obtenía mucho ruido.
    Se cubren los requisitos de detectar bordes y agrupar los objetos por su borde, aplicar la convolución discreta para obtener las gradientes y calcular las pendientes, y de agrupar los segmentos por su pendiente.


    Resultados




    Sin embargo, aquí aplico a las pendientes la función floor al valor de la pendiente lo que parece limpiar un poco los resultados.



    Cabe mencionar que las lineas dibujadas corresponden a los segmentos detectados, se puede ver, por ejemplo, en el pentágono algunos segmentos detectados cubren en realidad 2 lados de la figura y en el caso del hexágono hasta 3 lados.

    Esta de mas decir que los resultados no fueron los esperados.


    Código


    En el repositorio encuentran la implementación completa en código, la carpeta marcada como Tarea 8.

    Referencias:

    martes, 23 de abril de 2013

    [Lab VC] Actividad 6: Detección de agujeros

    La actividad de esta semana es complemento de la tarea de la clase, es un preprocesamiento para la detección de agujeros en un objeto.
    Los requisitos de la tarea son:
    • Dibujen encima de casa imagen una recta para cada pico del histograma lateral; independientemente para horizontal y vertical.
    • Las intersecciones deberían coincidir con los agujeros.

    Para lograr dibujar el histograma, se debieron normalizar los valores del histograma ya que éstos eran demasiado altos.

    Es posible obtener el histograma de todas las imágenes, y se puede hacer un histograma por cada uno de los colores (RGB) o en escala de grises para calcular los niveles de iluminación.

    Un agujero es una hendidura en algún objeto, por consiguiente, causa una variación en la iluminación general de la imagen, es posible detectar  un agujero midiendo estas variaciones utilizando histogramas laterales, uno para el largo de la imagen y otro para el ancho.

    Éste es un ejemplo de los histogramas de una imágen genérica:




    Actividad


    Se utilizaron las siguientes imágenes :

    Original
    Escala de grises

    Resultados:


    Original
    Histograma horizontal
    Histograma vertical
    Histograma horizontal sobrepuesto
    Histograma vertical sobrepuesto
    Intersecciones


    Los histogramas sobrepuestos, es necesario ver la imagen con un 100% de zoom, después se podrá ver en las orillas derecha e inferior las formas de los histogramas.

    Los resultados de la detección de los agujeros se muestran en esta entrada

    Código


    En el repositorio encuentran la implementación completa en código, la carpeta marcada como Tarea 7.



    Como el código para detectar los agujeros permaneció igual, solo adjunto la rutina que dibuja todos los resultados del preprocesamiento.


    Fin de a actividad.

    jueves, 18 de abril de 2013

    [Lab VC] Actividad 5: Detección de elipses

    Para la actividad de laboratorio se debió programar el código para detección de círculos.
    Los requisitos de la actividad son:

    • Identifica cada elipse/círculo individual
    • Rellénalo de un color aleatorio
    • Sigue marcando su centro con bolita & ID con etiqueta
    • Imprime un listado de los áreas de los círculos/elipses
      • En porcentaje de la imagen completa

    Teoría

    Para la detección de elipses se utilizó el método de cuerda-tangente, el procedimiento para aplicarlo se describe en la siguiente entrada:



    Mejoras

    Se mejoró el método para detectar ellipses, anteriormente hacía una búsqueda exhaustiva comparando todas las posibles combinaciones de pares de puntos para sacar los pixeles sujetos a votación y posteriormente ubicar el centro.
    Ahora simplemente ordeno la lista de pixeles de los bordes por la coordenada Y, después hago una copia de la lista pero la ordeno al reves. Asi me quedan 2 listas con los pixeles ordenados en la coordenada Y pero una esta ordenada al reves.
    Después, dado que tienen el mismo número de elementos, con un mismo ciclo recorro ambas listas tomando un punto de cada una, calculando las tangentes de los puntos y todo lo demás para obtener los votos.
    Con éste cambio ahorro mucho tiempo de ejecución y además se mejoró un poco la precisión para hallar los centros, aunque todavía falta refinar más.

    Ejemplo de detección con el nuevo método


    Resultados de la actividad

    Las imagenes utilizadas para las pruebas fueron las siguientes:

    Original
    Binarizada
    Contornos



    Los resultados de la detección y rellenado de pixeles fueron los siguientes:

    Elipses con su área

     Elipses con su área


    Código

    En el repositorio encuentran la implementación completa en código, la carpeta marcada como Tarea 6.

    https://github.com/jcespinosa/vision_computacional

    Dado que es el mismo código que antes, solo incluyo la nueva rutina para detectar elipses:

    Fin de la actividad

    jueves, 7 de marzo de 2013

    [Lab VC] Actividad 4: Detección de círculos (radio diferentes)

    Para esta actividad se debieron programar las rutinas para detectar círculos de diferentes tamaños, es decir, con radios variables, en una imagen. Para ello se utilizó la Transformada de Hough.

    En la entrada anterior:


    se describió el método utilizado para la detección de círculos a detalle, las bases para esta actividad son las mismas, sin embargo, ahora el radio es variable, por lo que hay que adaptar el código para que haga ésto.

    Cuando el radio no es conocido, la solución más simple es comenzar con un radio de cota inferior e ir aumentándolo en cierta cantidad, pasos de 1 o 2.
    Posteriormente hay que establecer una cota superior, una cota superior segura generalmente es la longitud de la diagonal mayor de la imagen ya que no tiene sentido buscar por circulos más grandes que ese tamaño.

    Fuente: http://www.aishack.in/2010/03/circle-hough-transform/


    Podemos limitar un poco más la búsqueda, por ejemplo, a 3/4 del tamaño de la longitud mayor.

    Posteriormente, por cada radio tendremos una arreglo de bidimensional de votos, si cada arreglo lo agregamos a una lista terminaremos con un arreglo de tres dimensiones que contendrá los votos por cada radio probado.

    Las imágenes utilizadas para la prueba fueron:

    Original
    Binarizada
    Contornos

    Los resultados fueron los siguientes:


    Como podemos ver en las imágenes, hasta cierto punto el programa sabe dónde se encuentran los círculos ya que detecta y dibuja los contornos dentro de los límites de los mismos, y, por ejemplo en la primea imagen  ignora cualquier otra cosa (caso del triángulo invertido a la derecha). Sin embargo, no detecta correctamente los círculos lanzando basura en cada radio analizado.

    Se necesita alguna rutina que limpie esa basura, ya que el problema que he notado es que por cada radio analizado, no importa cuan pequeño sea el radio o que el radio analizado no corresponda a un círculo en específico, siempre me lanza algún resultado, centros de círculos en alguna posición de la imagen  posiblemente porque a pesar de que el radio analizado no corresponde a ningún círculo visible, los pixeles aún así votan, los votos aún así se agrupan y aún así se lanza algún "centro" falso.


    Implemente un pequeño algoritmo que hace una segunda agrupación de votos para detectar mejor los círculos y barrer un poco la basura, los resultados obtenidos fueron los siguientes:





    Como podemos ver, los resultados son un poco mejores, en la primera imagen por lo menos se ubican los círculos, pero no exactamente en los centros. En la segunda imagen el resultado fue un poco mejor ya que se detectan los centros de 2 de los círculos, por lo menos de los 2 mas grandes. Sin embargo, esta segunda agrupación elimina la posibilidad de detectar la longitud del radio y no puedo dibujar el contorno de los círculos.

    Mejoraré un poco el código, pienso que algún tipo de hibridación entre el primero y el segundo puede funcionar

    Código


    En el repositorio encuentran la implementación completa en código, la carpeta marcada como Tarea 5.

    La mayoría de las funciones fueron explicadas en la entrada anterior, ahora solo se modularizó un poco el código y se adaptó a lo nuevo.


    Referencias: