Reconocimiento de formas y colores

El proposito de éste programa es, como cabría esperar, el reconocimiento de formas y colores para posteriormente enviar los datos procesados a un brazo robot que coje las piezas de la forma y color indicadas.

El programa fue desarrollado en Visual c++ y consta básicamente de las siguientes técnicas de procesado de imagenes:

- Aplicación de filtros de media y mediana.
- Conversión del espacio de colores RGB a HSI
- Binarización de objetos del color elegido.
- Clusterización y separación de los diferentes objetos en búferes diferentes.
- Detección de bordes.
- Cálculo de la Transformada de Hough.

ACTUALIZACIÓN: Codigo fuente en: reconocimiento-de-formas-y-colores-2

Lo primero que se ejecuta es un algoritmo de media repetido unas 10 veces, se utiliza para pulir los defectos encontrados en la superficie de las piezas, tales como arañazos, surcos y falta de pintura en algunas partes.

A continuación se realiza una mediana con el fin de homogeneizar la imagen.

Después de este pretratamiento se llega al menú de selección de color, donde elegimos el color de la pieza a escoger.












Se observa la imagen original y la aplicación de medias y mediana a ésta.

A continuación se realiza el cambio del espacio de colores RGB al espacio HSI.

Posteriormente se binariza la imagen para el color elegido (azul para la fotografía de la izquierda) y nos quedamos solo con unos en los píxeles donde se cumplieran las restricciones de color impuestas.

A continuación se ejecuta un algoritmo de clusterización de píxeles basado en la vecindad del píxel actual.

Es decir, se recorre la imagen desde arriba hacia abajo y de izquierda a derecha y al encontrar un píxel a uno se comprueban los píxeles ya recorridos y si se encuentra alguno en el entorno definido se añade dicho píxel al objeto anterior, en caso contrario se incrementa el contador de objetos y se añade el píxel a un nuevo objeto.

Además se dispone de una matriz de píxeles con el número de objeto al que corresponde cada píxel.

Después se separan los objetos encontrados en búferes de imagen diferentes para mostrarlos posteriormente, además calculamos su área en píxeles.

Si el objeto tiene menos de un 0.7% del área de la foto se desecha como objeto no válido.

A continuación se escriben por pantalla todos los objetos detectados, en caso de ser válidos se escribe también su área.

Luego se calcula el centroide de los objetos válidos y se muestra por pantalla.

Para los diferentes objetos válidos detectados se procede a la detección de bordes mediante el método de Sobel, además aprovechamos para contar el perímetro en píxeles del objeto y lo escribimos por pantalla.

Posteriormente decidimos la clase de objeto que es cada uno mediante una relación de perímetro cuadrado partido por área.

Y procedemos a escribir por pantalla la clase de objeto que es.

A continuación se encuentra un resumen de los objetos detectados y se nos pide la elección del tipo de figura.

Si elegimos una figura que se ha encontrado pasaremos al cálculo de la matriz de Hough de la figura correspondiente.

Además se escribirá un fichero en Matlab llamado hough.m que contendrá las diferentes matrices de Hough encontradas (en el caso de que se encontraran dos rectángulos azules por ejemplo).

Posteriormente se calcula el número de máximos correspondiente a cada tipo de figura (tres para triangulo, cuatro para rectángulos y cuadrados).

Y finalmente se hace un resumen del objeto elegido escribiendo por pantalla el tipo de objeto, las coordenadas del centroide, el ángulo del lado mayor y las coordenadas reales del centroide en mm.
A continuación se espera la pulsación de Esc o q por parte del usuario para pasar por las diferentes imágenes mostradas en los búferes y se cierra el programa.

Por ejemplo esta sería una secuencia de imágenes del programa:

Objetos azules detectados

Primer objeto azul

Segundo objeto azul


Y aquí se observa las matrices de Hough correspondientes:

Rectángulo azul

Triangulo azul


Se observan claramente los máximos correspondientes a las líneas de borde del rectángulo y triángulo.

Si quereis el código fuente o el ejecutable pedidlo en los comentarios y os lo paso.

0 comentarios:

Publicar un comentario