Mostrando entradas con la etiqueta Vision Computacional. Mostrar todas las entradas
Mostrando entradas con la etiqueta Vision Computacional. Mostrar todas las entradas

miércoles, 15 de mayo de 2013

Proyecto-Detección placas de Autos

Propósito de proyecto


El propósito de mi proyecto como su nombre lo dice es el poder detectar las placas de los autos a partir de una imagen, esta es una tecnología que se utiliza en varios países y en las fronteras para mantener un control de los autos que cruzan la frontera o bien en otros países se utiliza como control vehicular, me pareció interesante trabajar en esto ya que si bien la tecnología ya existe al menos en nuestro país no se emplea y pudiera servir como control vehicular en las ciudades.

Diseño

Diagrama del diseño, funcionamiento y procedimiento que sigue el programa para arrojar los resultados.

Librerías y lenguaje Utilizado

El lenguaje de programación con el que se trabajo fue:

Python Versión 2.7.3: Todo el programa esta escrito en python y requiere de las siguientes librerías:

  • PIL
  • Numpy
  • Librerias del sistema: random,math,time
Para obtener los comando de instalación de las librerías revisar el archivo readme y install que se encuentran en el repositorio del proyecto.

Técnicas de Visión Utilizadas

Para mi proyecto utilice la mayoría de las técnicas vistas durante el curso dejo las ligas a cada entrada del blog donde se explico detalladamente la técnica:


Descripción de funcionamiento

Lo primero que se hace una ves que se ejecuta el programa es el cargar la imagen, la imagen puede ser de cualquier formato, el único requisito es que se encuentre en la mismo directorio que se encuentra el código.


Una ves que se selecciona la imagen se empiezan a aplicar los filtros necesarios para la detección, explicare paso a paso cada uno de ellos con la siguiente imagen:

Lo primero que se hace es transformar la imagen a escala de grises para ver como realizar cada uno de los filtros; arriba donde coloque las técnicas utilizadas deje las ligas para cada una de ellas.


Después la imagen de escala de grises pasa a un filtro medio lo cual nos genera otra imagen.


Después del filtro medio aplicamos lo que es diferencia, lo cual consiste en restar la imagen generada de filtro medio con la de escala de grises esto nos arrojara una imagen nueva.



La imagen de diferencia la pasamos ahora por lo que es convolucion para remarcar un poco las partes importantes como lo es la placa.


Para eliminar lo mas que se pueda lo que no nos sirve de la imagen aplicamos umbrales.

Después para marcar aun mas los pixeles para los próximos filtros que usaremos aplicamos binarizacion, esto nos ayudara a marcar los pixeles que realmente necesitamos y eliminara otros que no nos sirven.

Después aplicamos dilatación para agrupar los pixeles, como se puede ver en la foto anterior la parte donde mas pixeles tenemos es en la placa al agrupar los pixeles con dilatación formaremos algunas manchas o figuras dentro de la imagen.


Como dilatación no se utilizo durante el curso explicare como funciona, lo que se hace es recorrer la imagen si se encuentra un pixel blanco se agregara a una cadena, una ves que ya tenemos las coordenadas de todos los pixeles blancos encontrados dentro de la cadena la recorremos y se revisaran sus vecinos los cuales todos ellos se transformaran en blancos también, con esto se ensanchan los pixeles y se agrupan los que están cercanos a otros formando figuras.

El código que se diseño para esto es el siguiente:

La función posibles reúne todos los pixeles blancos y en la función dilatación se recorren y se cambian los vecinos.


Una ves que agrupamos los pixeles con dilatación aplicamos detección de formas, la forma de mayor dimensión sera la placa y se marcara de un color gris.


Ya que tenemos detectado el lugar de la placa simplemente hay que enmarcar con un rectángulo sobre la imagen original y procedemos también a recortar la parte importante.



Evaluación de desempeño

En cuanto al desempeño en términos de tiempo influye en gran medida el tamaño de la imagen para la imagen anterior es una imagen de 575x371 pixeles el tiempo de procesamiento de todos los pasos descritos anteriormente fue el siguiente.


En cuanto a la posibilidad de fallo del sistema depende mucho de la imagen si contiene mucho ruido la imagen es mas difícil la detección entre las técnicas usadas se intenta eliminar lo mas posible el ruido pero no se garantiza que se elimine del todo.

Trabajo a futuro

En cuanto a trabajo a futuro con el mismo proyecto me gustaría mejorar la forma de detección,  ademas de agregar lo que serian detección de caracteres para poder almacenar en una base de datos la informacion de la placa, otra cosa seria ya en si hacer un sistema con videocámara que obtenga las fotos de los carros y realice todo lo anterior. Un sistema parecido a la imagen siguiente:


Vídeo Demo



Repositorio

Aquí se encuentra lo que es el readme y el install ademas de todo el codigo también dejo el repositorio de la clase de Visión donde están todos los códigos de las técnicas.

Repositorio de Proyecto


Repositorio Clase



Presentación



Referencias
















martes, 23 de abril de 2013

Detección de agujeros

Para esta semana la tarea consistió en la detección de agujeros a partir de una imagen, esto es importante ya que existen muchas maquinas que realizan procesos parecidos como el corte de metal por medio de lazer entre otras cosas en la industria. El proceso para realizar la tarea consistía en elaborar un histograma para detectar en una imagen por medio de lineas verticales y horizontales los posibles agujeros en la imagen, una ves hecho esto había que repintar el agujero y etiquetarlo.


Lo primero que se hizo fue elaborar los histogramas separando los pixeles verticales y horizontales y almacenando toda esta información en 2 archivos .dat para utilizarlos posteriormente ademas que esto sera util para la tarea del laboratorio de esta semana.


Esto nos genera 2 archivos .dat con información de esta manera:
 

Ya con los 2 archivos .dat generados, procedemos a sacar los mínimos de los mismos datos obtenidos:


Posteriormente dibujamos las lineas que nos marcaran las intersecciones en la imagen:


Ejemplos






Al principio tuve problemas con algunas imágenes y en algunas se resolvió usando filtros en algunas otras continué con problemas de marcar demasiadas rayas donde no era necesario.


Código completo en mi repositorio:








martes, 16 de abril de 2013

Detección de Elipses

La tarea de esta semana consistió en realizar un programa capaz de identificar elipses a partir de una imagen.

Para esta tarea se utilizaron algunos conceptos anteriores como lo son la detección de figuras y centros: Dejo las ligas a las entradas que pienso que son de importancia y utilidad.



Se utilizan estos conceptos anteriores para dividir la imagen en figuras y tener los centros que nos ayudan a obtener puntos claves requeridos para saber si alguna de las figuras es en realidad un elipse o no. 

Lo que hice fue lo siguiente, lo primero que hice fue encontrar el vértice y co-vertice de las figuras dentro de la imagen esto con la finalidad de cumplir con una formula del elipse, para esto cree 2 funciones una que partiendo del punto cuente los pixeles del centro de la figura moviéndose atreves del eje x hasta donde termina la figura, de igual manera y con otra función lo hice para el eje y.





Ya con estos datos simplemente cree una función llamada elipse en donde con los datos que ya contamos que son el vértice y co-vértice que representaran en la siguiente formula a y b.

Formula de Área Área = Pi * A * B 

Y al igual como lo había hecho anteriormente con la tarea de círculos comparamos el área obtenida con la de la figura que ya conocemos y podemos saber si se cumple la formula del elipse en caso de ser cierto podemos obtener otros datos como el foco,excentricidad y su ecuación. Para identificar los elipses puse que se pintaran de color amarillo y marcar su centro.


Ejemplos:


Imagen original:












Codigo completo:
https://github.com/rodo2043/VisionComputacional

Fuentes:

martes, 5 de marzo de 2013

Detección de círculos

Para esta semana la actividad consistió en realizar un programa capaz de identificar círculos a partir de una imagen.


Lo que utilice para realizar esto fue partiendo de lo que ya se tenia de detección de figuras y centros:
por lo que para poder realizarlo se tiene que contar con todo lo que se necesita para detección de figuras- formas ver esta entrada:http://m8sem.blogspot.mx/2013/02/clase-2-deteccion-de-formas.html


Partiendo de esto para no estar buscando los centros de nuevo una ves que se obtiene el centro de una figura lo que hago es lo siguiente:

Envió en una función llamada círculos el valor inicial en el cual se detecto la figura, este valor es donde se recorre toda la imagen y se encuentra un pixel blanco dando a entender que inicia una nueva figura,el centro de dicha figura obtenido con una formula ya empleada en la entrada anterior,la cantidad de pixeles que conforma la figura en este caso representara el área de la figura y por ultimo el color que tiene actualmente la figura, esto en dado caso de que si sea un circulo re-pintarlo de color azul para marcarlo.

Con todo esto podemos hacer uno de algunas formulas para confirmar si la figura es o no un circulo

Formulas a utilizar:


La formula para obtener el área de un circulo, para poder utilizar esta formula necesitamos el radio.

Para obtener el radio utilizaremos la formula de distancia:

Con la formula de distancia podremos obtener el radio ya que tenemos 2 puntos el punto de inicio donde se detecto una nueva figura y el punto donde se ubica el centro, estos serán nuestros valores de (x1,x2)(y1,y2).

Una ves que obtenemos el radio podemos utilizar la formula del área de un circulo con pi*r^2 el resultado nos dará el área de la figura que en caso de coincidir con el área en cantidad de pixeles que ya tenemos(puede haber una variación mínima de pocas décimas) podremos saber si la figura es un circulo.

Ejemplos:

Imagen original:
Circulo detectado:
Corrida:


Otro ejemplo

Imagen Original:
Circulo detectado:
En este caso el centro de la bandera y el del circulo casi están posicionados en el mismo punto.
Corrida:




Otro ejemplo:

Imagen original:


Circulo detectado:
El punto extra en el circulo del medio es el centro de la imagen total

Corrida:


Aclaro que el otro cambio de color es por lo utilizado anteriormente en formas y figuras todo lo que sea un circulo sera pintado de azul.

El código que realice es el siguiente:

Para saber si es un circulo:



Llamado de función círculos y pintado de los círculos:



Código Completo:

Fuentes:




martes, 26 de febrero de 2013

Tarea 3 Deteccion de Lineas

La tarea 3 consiste en realizar un programa capaz de detectar lineas verticales y horizontales, una ves detectadas había que pintar de rojo las horizontales y de azul las verticales.

Para poder trabajar con esto hay que contar con lo que hicimos anteriormente la parte de convolucion(detección de bordes) y binarizacion son importantes sin alguna de estas 2 no se puede avanzar.

Para la detección de lineas lo primero que hay que hacer es con lo utilizado en convolucion obtener los gradientes x,y con la siguiente formula utilizada ya anteriormente en convolucion:

Una ves obtenido los gradientes con la siguiente formula podemos obtener su angulo o dirección:


Con esta formula podemos calcular la dirección del gradiente por medio del método de sobel.

Lo que se busca es obtener resultados como los siguientes:


Fuentes:






lunes, 18 de febrero de 2013

Deteccion de formas


Para la tarea 2 de la clase de visión se nos pidió realizar un programa el cual detectara formas en una imagen, separadas por sus diferentes bordes, después de realizar esto se pintarían de colores diferentes cada forma y la de mayor tamaño se pintaría de gris, después de hacer esto hay que encontrar el centro de masa de cada forma y colocarle una etiqueta. Explicare cada paso por partes.

Convolucion y Binarizacion

Primero que nada para poder hacer la parte de detección de formas debemos tener hecho la parte de detección de bordes por medio de convolucion y a partir de la imagen que nos genera usar binarizacion.
Como no había hecho anteriormente la parte de binarizacion la explicare aquí para la parte de convolucion ya tengo una entrada que explica eso y el código utilizado para esa parte es el mismo.

Para realizar la parte de binarizacion es muy sencillo, partiendo de la imagen obtenida de la detección de bordes con convolucion, generamos un valor máximo, recorremos la imagen y sacamos el promedio de cada pixel si su promedio es menor que el valor lo cambiamos a negro si no cumple con esto se hace blanco. De esta manera obtenemos una imagen con los bordes bien definidos con la que podemos trabajar en la detección de formas.

El código que utilice para binarizacion es el siguiente:





Ejemplos


Original

                                          Convolucion                                    Binarizacion


Original

                   
                                        Convolucion                                      Binarizacion

Como las 2 imágenes anteriores ya tenían sus bordes bien definidos de inicio pondré un 3r ejemplo utilice las anteriores ya que me gusta su resultado final en las figuras ya que desde el inicio tienen formas bien marcadas.

Original

                                 
                                             Bordes                                      Binarizacion


Ya que tenemos bien toda esta parte podemos pasar a la primera parte de detección de formas.

Detección de formas


BFS

Para esta parte partiremos de la imagen obtenida de la binarizacion, lo que haremos aquí es empesar a recorrer la imagen desde el punto 0,0 generamos un color random, creamos una cola en la cual agregaremos el primer valor a checar en este caso 0,0 que se convertirá en nuestro punto de partida después creamos un while que seguirá hasta que la cola este vacía como tenemos actualmente el valor 0,0 se cumple la condición lo primero que haremos dentro de la condición sera eliminar el valor que ya vamos a revisar para no repetirlo y empesaremos a revisar los vecinos en el caso de 0,0 solo tiene 2 uno a su derecha y el otro abajo de igual forma esto lo verificamos con trys que verifica que existan vecinos, una ves que encontramos vecinos revisamos si su valor r,g,b es igual al del punto de partida si es igual se pinta del color generado y se agrega a la cola, esto se hace con todos los vecinos y así vamos revisando todas los vecinos hasta que se encuentre con un borde ya que como binarizamos la imagen cuando encuentre otro valor que no sea negro significara el comienzo de otra forma.

Imagen explicativa:



Código utilizado:

Ejemplos


Partiendo de las imágenes anteriores









Figura de mayor área

Después de haber coloreado la imagen también se nos pidió pintar el fondo de la figura de mayor área de color gris, para esto lo que hice fue crear 2 listas una que en la cual guardare la cantidad de pixeles de cada corrida en la función bfs por ende cada corrida es una figura diferente entonces en cada corrida por medio de un contador sumo la cantidad de pixeles que contiene la figura lo regreso y lo almaceno en la lista contador y de la misma forma regreso el color que contiene esa figura y lo almaceno en la otra lista de esta manera quedara en la misma posición ejemplo:
lista contador[0]=2000
lista color[0]=(0,0,0)
De esta forma de ser el 2000 el valor mas grande en la lista sabre que el color que tengo que repintar de gris es el negro.Una ves que tenemos todas las figuras pintadas, todos los valores almacenados en la lista buscamos el valor mas alto de la cadena contador usando:

máximo =contador.index(max(contador))

en este caso nos regresara a la variable máximo la posición del valor mayor, ya lo único que hacemos es conociendo la posición del máximo sacar el color del cual esta pintado esa parte de la siguiente manera:

 gris=colores[máximo]

Conociendo todo esto solo recorremos la imagen buscando el color de la variable gris en este caso y lo repintamos de color gris.


El código que realice quedo de la siguiente manera:




 

      Primer Resultado                                      Área mayor repintada


               


Obtención de centros y etiquetado

Para obtener los centros de cada figura se hizo algo parecido a lo de obtener el valor mayor, cree 2 listas  en las cuales el bfs me regresara cada valor de i,j que se agreguen a la cola esto para utilizarlos después con una formula para obtener su centro, la cual quedo de la siguiente manera:

centro.append((sum(centro1)/float(len(centro1)),sum(centro2)/float(len(centro2))))

centro1 siendo los valores de i

centro2 los valores de j

La formula la aplique con un try ta que hay casos en fotos que pequeñas manchas 1 solo pixel lo detecta como una figura y causa errores al querer dividir entre 0.

La formula nos almacenara en otra lista los centros de cada figura y después con esto recorremos la cadena y dibujamos un circulo en cada uno de esos puntos para diferenciar los centros. Al mismo tiempo que se dibuja los círculos hay que crear las labels para diferenciar las figuras, esta parte también la hice pero tuve problemas con la ventana al mostrar las labels lo cual aun no eh resuelto y dejo solo las imagenes hasta los puntos.


El código que utilice:







El código completo se encuentra en mi repositorio: