Adquisición y Procesamiento de Datos de Sensores "KINECT" en Matlab Dr. Isidro Robledo Vega División de Estudios de Posgrado e Investigación Instituto Tecnológico de Chihuahua irobledo@itchihuahua.edu.mx http://www.depi.itchihuahua.edu.mx/irobledo Sesión 1 Procesamiento de Imágenes en Matlab Repaso de Programación en Matlab Funciones y Archivos M MATLAB tiene un gran número de funciones, estas pueden ser: Internas.- Incluidas en el mismo sistema. Externas: Librerías de funciones distribuidas con el software de MATLAB (MATLAB Toolboxes). La funciones externas también pueden ser agregadas por los usuarios o grupos de usuarios para aplicaciones mas especializadas en forma de Archivos M. Es transparente para el usuario si una función es interna o externa, lo cual es una importante característica de MATLAB, ya que los usuarios pueden crear librerías con sus propias funciones, las cuales actuarán tal y como lo hacen las funciones internas. Funciones Internas abs(x) acos(x) acosh(x) angle(x) asin(x) atan(x) atan2(x,y) ceil(x) conj(x) cos(x) exp(x) fix(x) floor(x) gcd(x,y) imag(x) lcm(x) log(x) log10(x) real(x) rem(x,y) round(x) sign(x) sin(x) sqrt(x) tan(x) Valor absoluto o magnitud de un número complejo Coseno inverso Coseno inverso hiperbólico Angulo de un número complejo en cuarto cuadrante Seno inverso Tangente inverso Tangente inverso en cuarto cuadrante Redondeo hacia el infinito positivo Complejo conjugado Coseno x Exponencial e Redondeo a cero Redondeo hacia el infinito negativo Máximo común divisor de los enteros x y y Parte imaginaria de un número complejo Mínimo común múltiplo de los enteros x y y Logaritmo natural Logaritmo común ó base 10 Parte real de un número imaginario Sobrante de la división de x/y Redondeo al entero más cercano Función de signo, regresa el signo como argumento (1:positivo, -1:negativo, 0:cero) Seno Raíz cuadrada Tangente Funciones Externas Todas las funcione externas son escritas como Archivos M. Una lista de funciones básicas se puede escribir como un archivo de texto y después leerlo desde MATLAB. Estos archivos de texto o listados de funciones son llamados archivos M. El término de archivo M es por el hecho de que los nombres usados para estos archivos deben terminar con la extensión .m como ejemplo1.m. Enseguida se muestra el listado de una función que calcula el promedio de las calificaciones de cuatro unidades. Después de guardar este archivo solo se requiere teclear ejemplo1 en la línea de comandos de MATLAB y el sistema leerá y evaluara cada línea del archivo M como si se hubiera tecleado directamente en MATLAB. % Listado del archivo ejemplo1.m unidad1 = 80; unidad2 = 85; unidad3 = 75; unidad4 = 80; suma_de_calificaciones = unidad1 + unidad2 + unidad3 + unidad4; calificación_promedio = suma_de_calificaciones/4 Matlab Toolboxes Son librerías de funciones externas para aplicaciones especializadas. Todas las funciones de los toolboxes están escritas como Archivos M usando funciones internas básicas o funciones externas de otros toolboxes. Cada toolbox que se desee agregar a Matlab tiene un costo extra al del paquete básico. Listado de Toolboxes: http://www.mathworks.com/products/?s_tid=gn_ps Ver Toolboxes instalados en la ayuda. Nos interesa: Adquisición de Imágenes Procesamiento de Imágenes Visión por Computadora Ciclos FOR Un ciclo for repite un conjunto de enunciados un número predeterminado de veces. El comando for de MATLAB es muy diferente y no tiene la generalidad del for de C, C++ o Java. La siguiente construcción ejecuta expresiones con valores de i de 1 a n, variando de uno en uno. for i=1:n expresión end o bien, for i = Vector_de_Valores expresión end donde Vector_de_Valores es un vector con los distintos valores que tomará la variable i. Ciclos FOR En el siguiente ejemplo se presenta el caso más general para un rango de valores con incremento fijo predefinido de la forma (valor_inicial: incremento: valor_final); el ciclo se ejecuta por primera vez con i=n, y luego i se va reduciendo de 0.2 en 0.2 hasta que llega a ser menor que 1, en cuyo caso el ciclo termina. for i=n : -0.2 : 1 expresión end En el siguiente ejemplo se presenta una estructura correspondiente a dos ciclos anidados. La variable j es la que varía más rápidamente (por cada valor de i, j toma todos sus posibles valores): for i=1:m for j=1:n expresión end end Ciclos FOR Una última forma de interés del ciclo for es la siguiente (A es una matriz): for i=A expresión end en la que la variable i es un vector que va tomando en cada iteración el valor de una de las columnas de A. Cuando se introducen interactivamente en la línea de comandos, los ciclos for se ejecutan sólo después de introducir la sentencia end que los completa. Desiciones If, Else, Elseif En su forma más simple, el comando if se escribe en la forma siguiente: if condicion expresion end Obsérvese que a diferencia de C, C++ o Java, la condición no va entre paréntesis, aunque se pueden poner si se desea. Existe también la condición múltiple, en la que pueden concatenarse tantas condiciones como se desee, y que tiene la forma: if condicion1 bloque1 elseif condicion2 bloque2 elseif condicion3 bloque3 else %opción por defecto bloque4 end donde la opción por defecto else puede ser omitida: si no está presente no se hace nada en caso de que no se cumpla ninguna de las condiciones anteriores. Las condiciones son expresiones que pueden contener combinaciones de operadores lógicos y relacionales sobre escalares, variables simples o arreglos de datos. Switch-Case Los comandos switch-case realizan una función análoga a un conjunto de if...elseif concatenados. Su forma general es la siguiente: switch expresión case caso1, bloque1 case caso2, bloque2 otherwise, % opción por defecto bloque3 end Al principio se evalúa la expresión, cuyo resultado debe ser un número escalar o una cadena de caracteres. Este resultado se compara con los diferentes case, y se ejecuta el bloque de expresiones del case que corresponda con ese resultado. Si ninguno es igual al resultado de la expresión se ejecuta el bloque de expresiones correspondientes a otherwise. Ciclo While La estructura del ciclo while es muy similar a la de C, C++ o Java. Su sintaxis es la siguiente: while condición expresión end donde condición puede ser una expresión vectorial o matricial. Las expresiones se siguen ejecutando mientras haya elementos distintos de cero en condición, es decir, mientras haya algún o algunos elementos true. El ciclo se termina cuando todos los elementos de condición son false (es decir, cero). Break y Continue Comando Break Al igual que en C, C++ o Java, la sentencia break hace que se termine la ejecución del ciclo for o while en que se halla invocado. Comando Continue El comando continue hace que se pase inmediatamente a la siguiente iteración del ciclo for o while, saltando todas las expresiones que hay entre el continue y el fin del ciclo en la iteración actual. Try-Catch La construcción try-catch permite gestionar los errores que se pueden producir en tiempo de ejecución. Su forma es la siguiente: try bloque1 catch bloque2 end En el caso de que durante la ejecución del bloque1 se produzca un error, el control de la ejecución se transfiere al bloque2. MATLAB dispone de una función lasterr que devuelve una cadena de caracteres con el mensaje correspondiente al último error que se ha producido. En la forma lasterr('') pone a cero este contador de errores, y hace que la función lasterr devuelva la matriz vacía [ ] hasta que se produzca un nuevo error. Procesamiento de Imágenes Funciones para leer y escribir imágenes: Imagen=imread(archivo) imwrite(Imagen,archivo, formato) El contenido de las imágenes es guardado como una matriz de datos en Matlab, sus dimensiones dependerán del tipo de imagen. Procesamiento de Imágenes Tipos de Imágenes: Binarias: Arreglo de 0’s (negro) y 1’s (blanco). Indexadas: Arreglo de datos cuyos valores son índices para un mapa de color. El mapa de color se encuentra en otro arreglo. Escala de gris: Arreglo de datos con valores de intensidad entre 0 (negro) y 255 (blanco) RGB: Arreglos de datos de tres dimensiones, uno para cada color R(Rojo), G(verde) y B(azul), con valores entre 0 y 255. Funciones para convertir tipos de imágenes: rgb2gray, gray2ind, ind2gay, mat2gray, ind2rgb, im2bw. Procesamiento de Imágenes Funciones para visualizar imágenes: imshow, montage, subimage, immovie, implay. Funciones de exploración: imtool, imageinfo, imcontrast imdisplayrange, imdistline, impixelinfo. Funciones para Transformaciones Espaciales: imcrop, imresize, imrotate, imwarp. Funciones para mejorar imágenes: Ajuste de contraste: imadjust, imcontrast, imsharpen, histeq. Filtrado: imfilter, nlfilter, fspecial, medfilt2. Operaciones Morfológicas: bwhitmiss, bwmorph, bwulterode. Actividad 1 Obtener la siguiente imagen y colocarla en su directorio de trabajo. http://www.depi.itchihuahua.edu.mx/irobledo/cursos/taller_kin ect_matlab/lenna.pgm Utilizar el siguiente código y agregar un menú de funciones para: Cambiar el tamaño Convertir a blanco y negro Ajustar el contraste Ecualizar el histograma Suavizar Afilar Dibujar círculos de colores en la imágen Visualizar la imagen original y la modificada Guarda la imagen modificada Código Actividad 1 %Funcion que realiza Procesamiento Digital de Imagenes function proc_im(Imagen) %Lee la imagen im1=imread(Imagen); %Muestra la imagen original figure, imshow(im1) %Menu de Opciones display(['Procesamiento de la Imagen: ' Imagen]) display(['Cambiar Tamaño................1']) display(['Convertir a blanco y negro....2']) opcion=input('Seleccione el procesamiento a realizar: ','s'); %Llama a la funcion seleccionada switch opcion case '1', escala=input('Factor de escala: ','s'); im2 = imresize(im1, str2num(escala)); figure, imshow(im2) str=input('Guardar imagen (s/n): ','s'); if(strcmp(str,'s')) outimage=input('Nombre de la imagen: ','s'); imwrite(im2,outimage); end otherwise, display(['Opcion Invalida']) end