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

martes, 21 de mayo de 2013

Reconocimiento de objetos



Propósito

En la actualidad, conforme la tecnología va avanzando se realizan diferentes métodos para el reconocimiento de objetos, todos estos con ventajas y desventajas pero todos con un objetivo en común que es la detección.

El propósito de este proyecto es poder detectar objetos similares, a través de imágenes, se analizan las esquinas de los diferentes objetos en la imágen y se establecen puntos de interés para extraerles sus características y así poder encontrar puntos similares en las dos imágenes y saber con esto si se trata del mismo objeto. 

Justificación

En ocasiones se necesita detectar objetos con las mismas características para realizar diferentes cosas, ya sea imágenes panorámicas, detección de rostros, monitoreo de objetos, para que un robot reconozca los objetos del entorno en el que se está desarrollando, entre otras cosas.

Un uso que se le puede dar a este proyecto es al hacer un inventario de tus objetos personales, los que son más común que se te pierdan, ya sea tus llaves o tu cartera, se puede realizar una aplicación que sirva para encontrar dichos cuando se encuentren extraviados, ya sea en el cine debajo del asiento, o incluso en la bolsa de mano en el caso de las mujeres.





Diseño del Software

El proyecto fue desarrollado en el lenguaje de programación Python, utilizando como sistema operativo Ubuntu 12.04.

La detección de los objetos en la imagen se hace analizando cada imagen, y encontrando mediante las esquinas (algoritmo Harris Corners Detection), los puntos de interés de las mismas. Con esto se pueden extraer las características de los puntos de interés para con esto poder saber si hay algunos puntos semejantes en las dos imágenes. Al tener estas características y obtener los puntos semejantes, se realiza una unión dependiendo de las características de estos puntos para encontrar los puntos que son semejantes en dichas imágenes. Estos puntos se unen cada uno con el que le corresponda en cuanto a características y al final se muestra una imagen que muestra mediante líneas los puntos que salieron semejantes entre las dos imágenes.

El programa consta de diferentes funciones.

  • Corner_detection. Calcula las esquinas que tiene la imagen utilizando una función de opencv que realiza el algoritmo de Harris Corner Detection, el cual localiza los puntos de interés en los alrededores analizando cambios de intensidad que se producen en cada píxel para un tamaño determinado de ventana.  
  • Get_descriptors. Teniendo los puntos de interés en cada una de las imágenes se obtienen los descriptores de cada uno de estos puntos, los descriptores son vectores que describen la apariencia de la imagen en un punto dado, esto sirve para obtener los puntos semejantes de las diferentes imágenes.
  • Match. Se localizan los puntos en común de una imagen con la otra con ayuda de los descriptores, para cada punto descriptor de la primera imagen se selecciona un punto descriptor de la segunda imagen.
  • Plot_matches. Esta función une los puntos que se obtuvieron en la funcion match mediante líneas para así unir estas semejanzas por medio de líneas con ayuda de la libreria pylab.
 
El siguiente diagrama muestra el procedimiento que se tiene que seguir para obtener como resultado la detección de objetos similares en las imágenes.







Detección de esquinas (Harris Corner Detection)





Resultado. Líneas que muestran los puntos semejantes de ambas imágenes




Librerías

Para la realización de este proyecto se utilizaron diferentes librerías que sirvieron de mucha ayuda ya que facilitan muchos procedimientos y sobre todo te permiten utilizar algoritmos más eficaces y rápidos. 


  • OpenCV: es una librería libre de visión computacional originalmente desarrollada por Intel. Se ha utilizado para un sin fin de aplicaciones, desde seguridad con detección de movimiento hasta aplicativos de control de procesos donde se requiere reconocimiento de objetos.
  • Pylab: es una librería para la generación de gráficos a partir de datos contenidos en listas o arrays en el lenguaje de programación Python y su extensión matemática Numpy.
  • Numpy: es una extensión de Python, que le agrega mayor soporte para vectores y matrices, constituyendo una biblioteca de funciones matemáticas de alto nivel para operar con esos vectores o matrices.
  • PIL (Python Imaging Library): es una librería externa del lenguaje de programación Python que añade soporte para abrir, manipular y guardar diferentes imágenes en diferentes formatos.  

Desempeño

Para evaluar el desempeño se tomó el tiempo que se tarda en realizar todo el procedimiento en diferentes imágenes, obviamente entre más grandes sean las imágenes más tarda, el tiempo promedio que toma en hacer todo el procedimiento es de  12.9 segundos.

La resolución de la imagen como lo mencione es un factor muy importante el desempeño del procesamiento.


En imágenes con mayor resolución aparte de que tarda más tiempo también genera mejores resultados ya que detecta un mayor puntos de interés. En las imágenes de poca resolución toma en cuenta menos puntos de interés.

Resultados con las mismas imágenes pero con diferentes resoluciones.

Algunos de los resultados obtenidos son los siguientes.

Primer resultado.
Puntos de interés encontrados imagen 1 = 2443 Puntos de interés encontrados imagen 2 = 5012 
Resolución imagen 1 = 1080x720 pixeles
Resolución imagen 2 = 1280x800 pixeles
Tiempo de procesamiento = 24.24 segundos

Segundo resultado.
Puntos de interés encontrados imagen 1 = 2237 Puntos de interés encontrados imagen 2 = 3552
Resolución imagen 1 = 900x600 pixeles
Resolución imagen 2 = 1100x688 pixeles
Tiempo de procesamiento = 18.26 segundos

Tercer resultado.
Puntos de interés encontrados imagen 1 = 2124Puntos de interés encontrados imagen 2 = 2833
Resolución imagen 1 = 850x567 pixeles
Resolución imagen 2 = 950x594 pixeles
Tiempo de procesamiento = 11.24 segundos

Cuarto resultado.
Puntos de interés encontrados imagen 1 = 2109Puntos de interés encontrados imagen 2 = 2773
Resolución imagen 1 = 800x533 pixeles
Resolución imagen 2 = 900x563 pixeles
Tiempo de procesamiento = 9.74 segundos

Quinto resultado.

Puntos de interés encontrados imagen 1 = 2007Puntos de interés encontrados imagen 2 = 2311
Resolución imagen 1 = 750x500 pixeles
Resolución imagen 2 = 800x500 pixeles
Tiempo de procesamiento = 7.72 segundos

Promedio: 12.9 segundos



Gráfica de tiempos




Debilidades


Una de las debilidades más importantes es que al momento de hacer la unión de los puntos semejantes, no todas las uniones son correctas y esto puede realizar un problema al hacer la detección de alguna cosa importante.



Otra de las debilidades es el tiempo ya que como se analizan puntos de interés tiene que encontrarlos y tratarlos y entre más grande sea la imagen más puntos habrá pero esto ayuda a obtener un mejor resultado.

La interfaz donde se muestra el resultado es una más de las debilidades ya que simplemente se muestra una imagen al lado de la otra y mediante líneas son detectados los puntos en común.



Trabajo a futuro

Mejorar interfaz de resultado
  • La interfaz es una parte importante para el sistema ya que como el objetivo principal es de detectar objetos, los puntos en común entre las dos imágenes se deben mostrar de una forma diferente donde se pueda ver claramente cuales son los puntos en común entre las mismas ya que por medio de líneas no se puede mostrar claramente porque se sobreponen una sobre otra. Una idea mejor sería marcar los puntos en común con colores diferentes. También que se identifiquen los diferentes objetos en común de las imágenes localizando mediante un marco o cuadro sin relleno a dichos objetos. 

Mejorar la detección de puntos semejantes
  • Con el fin de que todos los puntos que se unan sean semejantes y no haya ninguno o sean muy pocos los que no coincidan, y a partir de esto se pueden hacer cosas como video en tiempo real para detectar objetos con la cámara web mediante una imagen como template. 
Realizar una aplicación móvil 
  • En la que se puedan encontrar con ayuda del flash del celular, objetos que se encuentren en lugares oscuros como abajo del asiento del cine (cuando se te cae dinero, o las llaves) y también para encontrar objetos en la bolsa de la mujer, ya que es uno de los problemas que ocurre seguido ya que siempre está llena de cosas y es difícil encontrar un objeto en específico.

Control de versiones

El proyecto se encuentra en línea en un repositorio. La liga del repositorio es la siguiente:

https://github.com/carmensrz/VisionFinal


Videos








Referencias:
Corner detection. (2013, April 28). Retrieved from http://en.wikipedia.org/wiki/Corner_detection
Opencv documentation. (2013, February 15). Retrieved from http://docs.opencv.org/2.4.4-beta/index.html


miércoles, 24 de abril de 2013

Laboratorio 7. Detección de agujeros

Para este laboratorio se nos pidió detectar agujeros mediante el método del histograma lateral. Para esto utilicé una fotografía de una herramienta de la cocina que tenía en mi casa.

Lo que se pidió fue lo siguiente:
Prueban con algunas imágenes que contienen unos pocos
objetos que no se empalman entre ellos y que tienen
agujeros.
• Usen fotografías tomadas por ustedes mismos.
• Dibujen encima de casa imagen una recta para cada pico del
histograma lateral; independientemente para horizontal &
vertical.
• Las intersecciones deberían coincidir con los agujeros.
• Es efectivamente un preprocesamiento de lo que requiere la
tarea.
• Hagan esto primero, luego la tarea

La tarea está en una entrada anterior pero como dice anteriormente, primero realicé el laboratorio para después hacer la tarea. Aunque también estuve perfeccionando unas cosas. Como lo dije en la entrada de clase, se obtuvieron los histogramas vertical y horizontal en los cuales se encuentran puntos altos y bajos que representan los cambios de intensidad, al juntar los histogramas se pueden trazar las líneas y encontrar los cruces o intersecciones de las mismas que es donde se encuentran los posibles agujeros.

La imagen que se utilizó fue la siguiente:




El resultado al trazar las líneas de acuerdo a los histogramas:



La siguiente gráfica muestra lo que se obtuvo con los histogramas horizonal y vertical, en la misma se puede apreciar los puntos altos y bajos que son los que se tomaron en cuenta al detectar los agujeros.








Código:

martes, 23 de abril de 2013

Tarea 6. Detección de agujeros

Para esta entrada el objetivo es detectar la posición de agujeros en una imagen y cumplir con las siguientes especificaciones:
  • Los agujeros detectados se marcan con un borde morado oscuro y un relleno de morado claro.
  • Un tono ligeramente diferente en cada agujero.
  • Se marca el centro de cada agujero con un punto amarillo.
  • Al centro de cada agujero se agrega una etiqueta del ID del agujero.
  • El programa imprime un listado que indica para cada ID el tamaño del agujero (como porcentajes del tamaño de la imágen)

La imagen que utilicé fue tomada por mi, para poder detectar los agujeros, se tiene que obtener los histogramas, estos se obtienen con las intensidades de los pixeles de la imagen  ya que un agujero es un orificio de forma aproximadamente circular, esto quiere decir que cuando existe un agujero hay un cambio de intensidad de luz lo cual facilita detectar utilizando histogramas. Los histogramas se realizan haciendo las sumas de los pixeles de los renglones y de las columnas respectivamente.

Al formar los histogramas habrá puntos altos y bajos que representan los cambios de intensidad, pasa saber donde hay agujeros para saber donde hay bajadas o valles en los dos histogramas y se juntan para ver donde se forman los cruces las cuales son los posibles agujeros.

Utilizando el código de entradas anteriores junto con nuevo código para obtener los histogramas y detectar los agujeros, se buscaron los cruces que se forman en los histogramas para así poder detectar donde se ueden encontrar los agujeros.

En mis pruebas, no se detectaron algunos agujeros pero pienso perfeccionarlo para el laboratorio. 

Imagen original:


Resultado:

Resultado en Terminal:






martes, 5 de marzo de 2013

Tarea 4. Detección de Circulos

Para esta semana, se nos pidió detectar círculos en una imagen, estos círculos tienen un radio conocido y todos los los mismos tienen el mismo radio.

Para esta tarea utilicé algunas de las fórmulas utilizadas para la detección de líneas, los círculos los dibuje en GIMP con radio de 100.

Para este algoritmo como ya lo mencioné se utilizó el código de detección de líneas, en este nuevo código se utilizaron los gradientes para calcular el ángulo y utilizar este punto para el círculo y se obtiene el centro del círculo.

Fórmula para calcular el gradiente:

Con el gradiente se calcula:

Teniendo esto calculamos obtenemos lo siguiente para calcular los centros:


Tuve algunos problemas con el programa, pero para la tarea de lab pienso solucionarlo.




Resultados:







Código:





Referencias:
http://elisa.dyndns-web.com/~elisa/teaching/comp/vision/circulos.pdf

jueves, 28 de febrero de 2013

Laboratorio 4. Detección de diagonales

Para esta tarea de laboratorio se nos pidió ahora detectar diagonales en una imagen, utilizando la tarea de clase que fue detección de lineas horizontales y verticales.

Ahora a diferencia de en la tarea que solo detectaba ángulos de 0 y 90 grados, utilizo la función arctan para calcular los ángulos de los pixeles, también cambie las máscaras de convolución de Sobel por las de Prewitt.

Al final del programa como en el anterior, se definen colores para los pixeles dependiendo de los ángulos y se ponen diferentes si la línea es horizontal, vertical o diagonal.

No se cambiaron muchas cosas de la tarea de clase, sólo que ahora es capaz de detectar otros angulos diferentes de 0 y 90.

Código

Resultados.

Imagen Original



Resultado




Imagen Original


Resultado




martes, 26 de febrero de 2013

Tarea 3. Detección de Lineas


Para la tarea de esta semana se nos pidió detectar líneas horizontales y verticales en una imagen.

Para esto la imagen debe estar binarizada osea en blanco y negro.

El método utilizado consiste en calcular las gradientes verticales y horizontales de la imagen, para con estos poder obtener el ángulo de los pixeles de la misma. Los gradientes se calculan mediante las máscaras de convolución, que fue una de las tareas pasadas, la máscara que utilicé fue la de sobel para calcular estos gradientes.

La convolución se aplica dos veces, una vez con la matriz para obtener gradiente horizontal y la otra con la matriz para obtener gradiente vertical.

Teniendo los ángulos hacemos unas validaciones:

  • Si el gradiente x y el gradiente y son iguales a 0, no hay ángulo.
  • Si el gradiente x es igual a 255 y el gradiente y es igual a 0, entonces el ángulo será 0.
  • Si el gradiente y es igual a 0 y el gradiente x es igual a 255, entonces el ángulo será 90.
Resultados:

Imagen Original


Resultado


Imagen Original


Resultado:


Código:

jueves, 21 de febrero de 2013

Laboratorio 3. Convex Hull

Para la tarea de laboratorio de esta semana, se nos pidió utilizar un algoritmo para el cálculo de la envolvente convexa.

La envolvente convexa de un conjunto de puntos X de dimensión n se refiere a la intersección de los conjuntos convexos que contienen a X.

Utilicé el algoritmo envoltura de regalo, el cual toma un polígono cóncavo y lo envuelve para hacerlo convexo.

Este algoritmo envuelve un conjunto de puntos en un "papel de regalo", el propósito principal del algoritmo es pensar en una recta que se desplaza hasta que toque un punto del conjunto de puntos P. La recta redondea los puntos del lado positivo, gira en cada vértice hasta que se junte con el siguiente, de forma que el último la envuelve por completo.

Tuve un poco de problemas con el algoritmo, y algunas líneas trazadas no son correctas pero lo arreglaré.

Imagen Utilizada


Resultado


Código:

jueves, 14 de febrero de 2013

Laboratorio 2. Sal y Pimienta

Para esta semana en el laboratorio, se nos pidió realizar el efecto de sal y pimienta en una imagen y luego reducirlo con algún método. 

Sal y Pimienta
Los pasos que seguí para realizar esto son los siguientes:

  1. Para agregar sal y pimienta, establecí una probabilidad de poner puntos negros o blancos en los pixeles.
  2. Recorro los pixeles de la imagen, genero un número random entre 0 y 1 y si este es menor a la probabilidad entonces se crea un punto negro o blanco.
  3. Para establecer si será un punto negro o blanco genere otro numero random entero entre 0 y 1. Si es 0 el punto será negro y si es 1 el punto será blanco.
  4. Agrego los pixeles que cambiaron a la imagen.






Redudir Sal y Pimienta

Los pasos que seguí para realizar esto son los siguientes:

  1. Recorro todos los pixeles y genero una lista con sus vecinos norte, sur, este y oeste, esto en caso de que sea un pixel de en medio, si es de las orillas agrego a la lista el vecino correspondiente. 
  2. Al tener esta lista, la ordeno de forma descendente y obtengo la mediana, es decir cuando ya está ordenada obtengo el número de en medio de la fila, si son dos los de en medio se saca un promedio entre esos dos y ese será la mediana.
  3. En la nueva imagen pongo el resultado de la mediana en el pixel correspondiente.







Bordes
Los pasos que seguí para realizar esto son los siguientes:
  1. Calculo la diferencia de todos los pixeles de la imagen original menos la imagen difusa.
  2. Esta diferencia se la agrego a los pixeles de la nueva imagen. Los bordes se empiezan a notar pero muy tenues.
  3. Al final normalizo la imagen con el fin de hacer los bordes más notables, y al final hago la binarización.









Código:


Link a mi repositorio:
https://github.com/carmensrz/VisionComputacional/blob/master/ruido.py

martes, 12 de febrero de 2013

Tarea 1. Detección de Bordes

Para esta tarea, se nos pidió aplicar una máscara de convolución a una matriz de pixeles de la imagen.

Por ejemplo, en la siguiente imagen podemos ver como se toma un pixel central (borde rojo) y el área de acción del kernel que son los vecinos (borde verde). El cuadro del medio muestra la máscara(kernel) que se le aplicará a la matriz de pixeles de nuestra imagen y el último cuadro muestra el resultado de la multiplicación de estas dos anteriores, es decir se multiplica el valor de cada uno de ellos por el valor correspondiente del kernel y se hace una sumatoria de los resultados

En este caso por ejemplo sería: (40*0)+(42*1)+(46*0) + (46*0)+(50*0)+(55*0) + (52*0)+(56*0)+(58*0) = 42
El procedimiento que realicé para esta tarea fue el siguiente:

1.- Convertí la imagen original en escala de grises con la subrutina que ya había hecho para el laboratorio.
2.- Apliqué la máscara Sobel horizontal y vertical para la detección de bordes
3.- Normalicé la imagen
4.- Realicé la binarización

Imagenes resultantes:

Original


Escala de grises


Máscara


Binarizado




Original


Escala de grises


Máscara


Binarizado




Original


Escala de grises


Máscara


Binarizado


Los tiempos promedio que tomaron estás imagenes para realizar este procedimiento son:

  • Primera imagen "Taz bebe": 321 x 394 pixeles tardó 4.13 segundos
  • Segunda imagen "Google": 543 x 378 pixeles tardó 6.94 segundos
  • Tercera imagen "Persona": 605 x 792 pixeles tardó 14.9 segundos



Código:


Liga a mi repositorio
https://github.com/carmensrz/VisionComputacional