Professional Documents
Culture Documents
Reporte de Estada
en el Laboratorio de ptica y Sistemas de Visin por Computadora Asesora Dra. Carina Toxqui Quitl
Resumen
En este reporte de estada se analizan e implementan las funciones ms comunes del procesamiento digital de imgenes usando la biblioteca de OpenCV. Los algoritmos presentados son desarrollados en Visual Studio 2010.
Se abordan tres problemas en el contexto de Visin por Computadora. El control de calidad de botellas PET, la segmentacin de imgenes y la detencin de bordes para el anlisis del lenguaje a seas.
ndice general
1. Introduccin ....7 2. Estructura de OpenCV ....11 2.1 Procesamiento de imgenes y algoritmos de visin ...12 2.1.1 Binarizacin12 2.1.2 Trasformacin gamma.16 2.1.3 Histograma y Ecualizacin del Histograma ................. ...................18 2.1.4 Laplaciano ..21 2.2 Estructura y Algoritmos...23 2.2.1 Dilatacin y Erosin ...23 2.2.2 Canny ..25 3. Sistema de Visin por Computadora 27 3.1 Control de calidad ..30 3.2 Anlisis de la marcha 33 3.3 Lenguaje a Seas ...36 4. Conclusiones ..39 5. Apndice - CUDA 41 6. Referencias ..43
Captulo 1
Introduccin
Se llev a cabo la bsqueda de una nueva herramienta de visin por computadora que permita procesar informacin en tiempo real. Para esto se escogi la biblioteca de OpenCV. Es una biblioteca que cuenta con mas de 500 funciones las cuales estn enfocadas a visin por computadora y estn basadas en un lenguaje de programacin como es C y C++ y es muy familiar para cualquier desarrollador del rea de Sistemas Computacionales. OpenCV permite procesar imgenes en tiempo real y es muy sencillo hacer interactuar con la cmara y la biblioteca ya que es una de sus caractersticas, la desventaja que podremos encontrar es que al trabajar video el procesamiento de la CPU es muy tardado. Para ello necesitaramos utilizar la GPU con la ayuda de la interfaz de CUDA mediante la programacin en paralelo para poder combinar la CPU con la GPU.
Problema En los procesos de Visin por Computadora se requiere de un anlisis y procesamiento de series de imgenes en tiempo real. Lo cual no ha sido logrado debido a que el procesado en CPU que actualmente se realiza es muy tardado.
Propuesta Utilizar la biblioteca de OpenCV ya que contiene ms de 500 funciones para el rea de visin por computadora en tiempo real, procesando imgenes digitales y reduciendo costos de tiempo en la ejecucin en su procesamiento.
7
Objetivo Dar a conocer algunas de las funciones que brinda OpenCV para poder tener una herramienta de procesamiento en tiempo real que va a permitir reduccin de tiempos en procesamiento.
OpenCV
Es una librera de tratamiento de imgenes, destinada principalmente a aplicaciones de visin por computadora en tiempo real. Son un conjunto de bibliotecas de C y C++ de cdigo libre, orientadas a visin por computadora. Puede ser usado en Windows, Linux y MacOS
Qu podemos hacer con OpenCV? OpenCV nos permite entre muchas otras cosas: Operaciones bsicas, como (suma, productos, integraciones, derivaciones, etc.) Procesado de imgenes y anlisis, Anlisis estructural, Anlisis de movimiento, Reconstruccin 3d y calibracin de la cmara, Interfaz grfica y adquisicin,
Su licencia de OpenCV
Intel fue el pionero en el desarrollo de OpenCV, sin embargo su licencia permite el desarrollo con las bibliotecas e inclusive la modificacin y distribucin de las mismas, tambin la explotacin, investigacin y comercializacin.
10
Captulo 2
Estructura de OpenCV
Introduccin
En este capitulo se describe la librera de OpenCV para el anlisis y procesamiento de imgenes. Se proporciona el cdigo de algunas tareas bsicas para el mejoramiento y realce en imgenes.
1. CXCORE: Donde se encuentran las estructuras y algoritmos bsicos que usan las dems funciones. Ejemplo: suma, media. Operacionesbinarias. etc. 2. CV: donde estn implementadas las funciones principales de procesamiento de imgenes. Ejemplo: Erosin, Dilatacin, Operaciones bsicas de umbralizacin, Derivados de Sobel, Operador de Laplace, etc. 3. HighGUI: todo lo relacionado a la interfaz grfica de OpenCV y las funciones que permiten importar imgenes y video.
11
En esta investigacin de las cuatro grupos con los que cuenta OpenCV solo se utilizaron: CV, HighGUI, CXCORE.
12
2.1.1 Binarizacin
Esta operacin transforma la imagen a solo dos colores blanco y negro. El proceso para binarizar la imagen es el siguiente: 1. Se encuentra la mediana (dato de en medio) de los valores permitidos para cada pxel. 2. Se toma uno por uno los pxeles de la imagen.
3. Se compara cada pxel: si el valor del pxel es menor a la mediana entonces ese pxel toma el valor mnimo permitido, caso contrario toma el valor mximo permitido.
13
14
Resultados:
15
Contraste El contraste es la relacin entre las intensidades de los pixeles en una imagen, tambin se puede definir como la relacin entre la iluminacin mxima y mnima de un objeto.
BRILLO El brillo es la luz que refleja o emite un cuerpo. La forma de aumentar o disminuir el brillo es incrementando o disminuyendo el valor de los pxeles de cada canal.
Aumento de Brillo. En esta operacin se aumenta la intensidad en una imagen. Esta operacin la realizo en combinacin de varias funciones, no existe una funcin que por si sola haga la operacin.
Cdigo desarrollado en Visual Studio 2010 con la biblioteca de OpenCV para el mejoramiento del contraste en una imagen.
#include <cv.h> #include <highgui.h> #include <iostream> using namespace cv; double alpha; /**< Control de contraste simple */ int beta; /**< Control de brillo simple */ int main( int argc, char** argv ) { /// Leer la imagen dada por el usuario Mat image = imread( "lena.bmp",1 ); Mat new_image = Mat::zeros( image.size(), image.type() ); /// Inicializar los valores std::cout<<" contraste y brillo "<<std::endl; std::cout<<"-------------------------"<<std::endl; std::cout<<"* contraste [0-20]: ";std::cin>>alpha; std::cout<<"* brillo [0-100]: "; std::cin>>beta; /// operaciones
16
Resultado:
Imagen Original
La aplicacin pide que introduzcas un valor de contraste de 0 a 20 y un brillo de 0 a 100 para poder dar una imagen resultante.
17
2.1.3 Histograma y Ecualizacin del Histograma Histograma. El histograma es una grfica que relaciona los niveles de intensidad de una imagen y el nmero de pxeles que poseen tal nivel de intensidad. Cdigo desarrollado en Visual Studio 2010 con la biblioteca de OpenCV para el calculo del histograma de una imagen.
#include #include #include #include "opencv2/highgui/highgui.hpp" "opencv2/imgproc/imgproc.hpp" <iostream> <stdio.h>
using namespace std; using namespace cv; /** * @funcion main */ int main( int argc, char** argv ) { Mat src, dst; /// cargar imagen src = imread( "lena.bmp", 1 ); if( !src.data ) { return -1; } /// separa las imagenes en los 3 colores ( R,G,B ) vector<Mat> bgr_planes; split( src, bgr_planes ); /// establecer el contador int histSize = 256; /// establecer rangos ( para B,G,R) ) float range[] = { 0, 256 } ; const float* histRange = { range }; bool uniform = true; bool accumulate = false; Mat b_hist, g_hist, r_hist; /// calcular los histogramas: calcHist( &bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate ); calcHist( &bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, uniform, accumulate ); calcHist( &bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate );
18
Resultado:
Imagen original
19
Ecualizacin del histograma. La ecualizacin del histograma se aplica cuando se desea lograr una distribucin ms uniforme entre el nmero de pxeles referido a los diferentes niveles de intensidad presentes en la imagen. Un histograma que se extienda en el intervalo de niveles de gris.
Cdigo desarrollado en Visual Studio 2010 con la biblioteca de OpenCV para la ecualizacin del histograma.
#include #include #include #include "opencv2/highgui/highgui.hpp" "opencv2/imgproc/imgproc.hpp" <iostream> <stdio.h>
using namespace cv; using namespace std; /** @funcion main */ int main( int argc, char** argv ) { Mat src, dst; char* source_window = "imagen original"; char* equalized_window = "Equalized Image"; /// carga la imagen src = imread( "lena.bmp", 1 ); if( !src.data ) { cout<<"Usage: ./Histogram <path_to_image>"<<endl; return -1;} /// convierte a escala de grises cvtColor( src, src, CV_BGR2GRAY ); /// plicar la ecualizacion del histograma equalizeHist( src, dst ); /// mostrar resultados namedWindow( source_window, CV_WINDOW_AUTOSIZE ); namedWindow( equalized_window, CV_WINDOW_AUTOSIZE ); imshow( source_window, src ); imshow( equalized_window, dst ); /// guardar la imagen ecualizada cvSaveImage("lenaecua.bmp", &IplImage(dst)); /// esperar asta cerrar la aplicacion waitKey(0); return 0;
20
Resultados:
Imagen Original
2.1.4 Laplaciano Es un operador ideal para detectar bordes independientes de la orientacin o direccin de los mismos. Cdigo desarrollado en Visual Studio 2010 con la biblioteca de OpenCV para el operador de Laplaciano.
#include #include #include #include "opencv2/imgproc/imgproc.hpp" "opencv2/highgui/highgui.hpp" <stdlib.h> <stdio.h>
using namespace cv; /** @funcion main */ int main( int argc, char** argv ) { Mat src, src_gray, dst; int kernel_size = 3; int scale = 1; int delta = 0; int ddepth = CV_16S; char* window_name = "Laplace"; int c; /// carga la imagen src = imread( "lena.bmp",1 );
21
Resultado:
22
2.2 Estructuras y Algoritmos Las Estructuras y Algoritmos en OpenCV cuenta con una gran cantidad de funciones que podemos encontrar como por ejemplo: suma, resta, multiplicacin, media. Operaciones- binarias. Dilatacin, Erosin, Canny, etc. 2.2.1 Dilatacin y Erosin Dilatacin Este operador es comnmente conocido como 'relleno', 'expansin' o 'crecimiento'. Puede ser usado para rellenar 'huecos' de tamao igual o menor que el elemento estructurante con la que se opera la dilatacin. Erosin Los efectos son de 'encogimiento', 'contraccin', o 'reduccin'. Puede ser utilizado para eliminar islas menores en tamao que el elemento estructural. Cdigo desarrollado en Visual Studio 2010 con la biblioteca de OpenCV para los operadores de Dilatacin y Erosin.
#include "cv.h" #include "highgui.h" #include "math.h" int main() { IplImage* src; // imagen de color base IplImage* colorThresh; // contendr la imagen de color binarizada IplImage* gray; // contendr la imagen convertida en escala de grises IplImage* grayThresh; // imagen binaria conseguida // a partir de la imagen en escala de grises int threshold = 30; // definimos el valor umbral int maxValue = 255; // definimos el valor mximo int thresholdType = CV_THRESH_BINARY; // definimos el // tipo de binarizacin src = cvLoadImage("lena.bmp", 1); // cargamos imagen de color colorThresh = cvCloneImage( src ); // copiamos esa imagen de color gray=cvCreateImage( cvSize(src->width, src->height), IPL_DEPTH_8U, 1 ); // la imagen de intensidad tendr la misma configuracin // que la fuente pero con un solo canal cvCvtColor( src, gray, CV_BGR2GRAY ); // pasamos la imagen de color // a escala de grises grayThresh = cvCloneImage( gray ); // copiamos la imagen en escala // de grises (truco anterior) cvNamedWindow( "src", 1 ); // representamos la imagen de color
23
Resultado:
Resultado de la Dilatacin.
Resultado de la Erosin
24
2.2.1 Canny El detector de bordes Canny fue desarrollado por John F. Canny en 1986. Tambin conocido por muchos como el detector de ptimo, el algoritmo de Canny tiene como objetivo cumplir con tres criterios principales:
Baja tasa de error: Significado una buena deteccin de bordes existentes solamente. Buena localizacin: La distancia entre los pxeles del borde y los pxeles reales detectado borde tiene que ser minimizado. Respuesta mnima: Slo una respuesta del detector al borde.
Cdigo:
#include #include #include #include "opencv2/imgproc/imgproc.hpp" "opencv2/highgui/highgui.hpp" <stdlib.h> <stdio.h>
using namespace cv; /// variables globales Mat src, src_gray; Mat dst, detected_edges; int edgeThresh = 1; int lowThreshold; int const max_lowThreshold = 100; int ratio = 3; int kernel_size = 3; char* window_name = "Edge Map"; /** * @funcion CannyThreshold */ void CannyThreshold(int, void*) { /// Reducir el ruido con un kernel de 3x3 blur( src_gray, detected_edges, Size(3,3) ); /// detector canny Canny( detected_edges, detected_edges, lowThreshold, lowThreshold*ratio, kernel_size ); /// .mouestra los resultados optenidos dst = Scalar::all(0); src.copyTo( dst, detected_edges); imshow( window_name, dst ); /// cvSaveImage("lena2.bmp", &IplImage(dst)); }
25
Resultado:
Captulo 3
Sistema de Visin por Computadora
Introduccin
En este captulo se abordan tres problemas de anlisis de imgenes. El primero es el control de calidad de botellas PET. Usando los algoritmos de mejoramiento de contraste, binarizacin, ecualizacin del histograma y filtraje es posible detectar el defecto de las botellas. El segundo es el anlisis de la marcha. En este se usa la resta, Binarizacin, Dilatacin y erosin para la segmentacin de imgenes. Finalmente, se aborda el problema del reconocimiento del lenguaje de seas. Usando la funcin Canny es posible extraer los bordes de la mano de manera eficaz.
27
En esta imagen se muestra el plano imagen del cual salen 3 haces de luz. El primero sale de forma paralela llega el lente, y le cambia la trayectoria pasando por F que es su punto focal y continua su trayectoria.
El segundo haz de luz sale de forma paralela pasando por en medio de la lente. El tercer haz de luz pasa por F por el punto focal, pasando por la lente y contina. En la interseccin de estos haces de luz se encuentra el plano imagen.
28
La cmara digital esta constituida por un lente, diafragma, sensor principalmente estos 3 elementos son de gran importancia para la adquisicin de la imagen. El diafragma nos va a permitir controlar qu tanto de luz va ingresar para el grabado de la imagen, el sensor nos va a permitir, dependiendo de las caractersticas del mismo, la calidad de la imagen que vamos adquirir digitalmente. Imagen Digital Una imagen digital es una funcin f(x,y) de dos dimensiones donde x e y representan las coordenadas del plano. f(x,y) representa la intensidad o nivel de gris de la imagen en ese punto.
, =
X filas
Representacin en Formato de la matriz. Cada elemento de la Matriz es un PIXEL con una intensidad f.
Y columnas
29
3.1 Control de Calidad La visin por computadora permite inspeccionar el proceso de produccin sin fatigas ni distracciones, facilitando la cuantificacin de las variables de calidad traducindose en un mejoramiento continuo.
Para llevar acabo este proyecto en el laboratorio de ptica se cuenta con los componentes para el realizar el estudio del control de calidad. Sistema de iluminacin
En este caso en particular el objeto que vamos a analizar es una botella ya que en la boca de la botella tiene un defecto y se desea realizar un sistema que detecte este error para que la botella se retire de la banda de produccin.
30
Original
Cambio de Contraste:
= 12
Binarizada
31
Como se puede observar, el defecto es detectado con mayor facilidad usando el filtro Laplaciano.
32
Fondo
Fondo + persona
El objeto a investigar en este caso es la forma de caminar de las personas para ello el escenario fuera de la persona no nos interesa por ello se va a segmenta la imagen. Segmentacin: Su objetivo es dividir la imagen en las partes que la constituyen o los objetos que la forman. En este proceso se diferencia el objeto y el fondo. Para esto como tenemos 2 imgenes una sin la persona y otra con la persona para ello vamos a realizar una resta de imgenes para poder obtener solo la persona.
33
Ya que tenemos la imagen solo con la persona la tenemos que convertir a escala de grises para posteriormente binarizarla.
Escala a grises
Binaria
Al realizar la resta podemos observar que la persona pierde informacin en algunas reas. Para corregir esto, vamos a utilizar las funciones de Dilatacin y Erosin.
Esta es la imagen dilatada como se puede observar se rellena algunas de las partes la cual no tenia prdida pero a las vez aparece informacin que tenamos o al menos no era visible
Esta es la imagen Erosin esta funcin reduce las reas que tenan accesos y nos y tenemos una imagen con mayor definicin.
34
Resultados:
Como se puede observar en las imgenes si hubo mejora al aplicarle las funciones de Erosin y dilatacin. Se rellenaron algunas de las partes en las cuales faltaba informacin.
Es importante hacer notar que solo la informacin de la marcha, es decir, la parte inferior del cuerpo es usada para el anlisis de la marcha humana.
35
En estas imgenes se muestra la mano pero pareciera a simple vista que solo tiene 3 dedos pero en realidad esta formando el numero 7 del lenguaje a seas como no se puede ver por completo toda la mano, la funcin Canny nos da la informacin de la mano completa si importar su posicin de los dedos, como se muestra en la imagen.
Ahora el problema que se tena era que nos arrojaba informacin de ms ya que la funcin Canny es muy precisa y muestra todos los bordes de la mano y el rea que esta de fondo de la mano. Para esto se utilizo la funcin de Umbral para quitar un poco el ruido que nos estaba generando de ms.
36
Con un Umbral a 0
Estas images son con un umbral igual a 25 que es donde podemos observar aun los dedos sin importar su posicin y tenemos muy poco ruido o informacin de mas.
37
38
Captulo 4
Conclusiones
Se revis la biblioteca de OpenCV para el procesamiento de imgenes y se programaron algunos algoritmos en Visual Studio 2010. OpenCV es una biblioteca muy sencilla de utilizar ya que esta esta basado en lenguaje de programacin como c/c++ y la velocidad de procesamiento es mayor a comparacin de Mathcad. Para el rea de sistemas es ms familiar para el desarrollador.
Se analizaron algoritmos tales como cambio de contraste y filtraje para el mejoramiento de imgenes. La deteccin de defectos se logr a partir de la imagen mejorada usando transformacin gamma =
Se analizo la segmentacin de imgenes con algoritmos aritmticos y operaciones morfolgicas, tales como dilatacin y erosin. En la segmentacin de imgenes se logr quitar el ruido y rellenar parte faltante en la imagen de entrada.
Se apoy al sistema de lenguaje a seas con la funcin canny. La cual permiti extraer de manera eficaz la informacin de seales con la mano. Se logr la deteccin de bordes de las imgenes de la mano a partir de un umbral de 25.
Como trabajo a futuro se buscara implementar los algoritmos en tiempo real usando cuda la cual esta basada en una lgica paralela. Los algoritmos para una imagen sern extrapolados al anlisis de N imgenes.
39
40
Apndice A
Cuda utilizando la GPU mediante la
Programacin en paralelo
La unidad de procesamiento grfico o GPU es un coprocesador dedicado al procesamiento de grficos u operaciones de coma flotante, para aligerar la carga de trabajo del procesador central en aplicaciones como los videojuegos y/o aplicaciones 3D interactivas.
La programacin paralela es el uso de varios procesadores trabajando en conjunto para dar solucin a una tarea en comn, lo que se hace es dividir el trabajo y cada procesador realiza una porcin del problema al poder intercambiar datos por una red de interconexin o a travs de memoria.
La programacin paralela permite resolver problemas que no caben en un solo procesador y que no se resuelven en un tiempo razonable, se pueden ejecutar problemas con mayor complejidad mas rpidamente.
CUDA (Compute Unified Device Architecture) es una arquitectura de clculo paralelo que hace referencia tanto a un compilador como a un conjunto de herramientas de desarrollo creadas por NVIDIA. En General permite a los programadores usar una variacin de C/C++ para codificar algoritmos en una GPU de NVIDIA.
41
42
Referencias
Learning OpenCV Computer Vision with the OpenCV Library http://opencv.willowgarage.com/wiki/ http://fi.uaemex.mx/h.a.montes/files/TI%20Reporte%20%20Alan%20Barbosa%20Mendoza.pdf http://opencv.itseez.com/index.html https://groups.google.com/group/opencv-espanol?hl=es&lnk=srg http://docencia-eupt.unizar.es/ctmedra/tutorial_opencv.pdf http://tech.groups.yahoo.com/group/OpenCV/
43