Práctica 6 Tratamiento de imágenes mediante Matlab 1 MODIFICACIÓN DE LOS COLORES ................................................................................................................. 1 1.1 1.2 1.3 2 OBTENCIÓN DEL NEGATIVO DE UNA IMAGEN ....................................................................................................... 1 MODIFICACIÓN DEL BRILLO DE UNA IMAGEN ....................................................................................................... 2 DIBUJO DE LA IMAGEN EN BLANCO Y NEGRO Y ESCRITURA EN UN FICHERO ......................................................... 2 IDENTIFICACIÓN DE OBJETOS ........................................................................................................................ 2 2.1 2.2 2.3 3 INTRODUCCIÓN .................................................................................................................................................... 2 DETERMINACIÓN DE UN OBJETO MEDIANTE MÁSCARAS DE GRADIENTE ............................................................... 3 ENCABEZADO DE LA FUNCIÓN.............................................................................................................................. 3 DIBUJO DEL MAPA Y DE LA TRAYECTORIA DEL ROBOT ....................................................................... 4 3.1 3.2 3.3 INTRODUCCIÓN .................................................................................................................................................... 4 SISTEMA DE COORDENADAS................................................................................................................................. 4 PROGRAMACIÓN .................................................................................................................................................. 5 1 MODIFICACIÓN DE LOS COLORES La digitalización de una imagen permite realizar operaciones numéricas sobre ella. Esto es lo que realizan las distintas funciones implementadas en los programas para tratamiento de imágenes. Mediante las distintas operaciones se pueden realizar efectos especiales sobre una imagen, eliminar ruido, darle más o menos luz a una fotografía, etc. En el directorio Q:\Informatica1\Practica06 se dispone de una serie de archivos gráficos del tipo JPG con los que puede probar los programas que se piden a continuación. 1.1 Obtención del negativo de una imagen Realice una función cuyo encabezado sea: function negativo(archivo) Donde archivo es una cadena de caracteres con el nombre completo del archivo (incluida su extensión). Esta función debe abrir dos figuras, en la primera figura dibujará el JPG del archivo y en la segunda figura el negativo del mismo JPG. Solución: El código podría ser el siguiente: function negativo(archivo) N=length(archivo); % n=numero de letras de la cadena 'archvo' formato=archivo(N-2:N); %formato guarda las tres ultimas letras matriz_de_colores=imread(archivo,formato) ; %Lectura del archivo matriz_de_colores=double(matriz_de_colores); %Paso a double matriz_de_colores=matriz_de_colores/255; %Escalado figure;image(matriz_de_colores) %Dibujo del JPG axis equal %Escalado horizontal y vertical X=size(matriz_de_colores,2); % X=numero de pixeles horizontales Y=size(matriz_de_colores,1); % Y=numero de pixeles verticales axis([1 X 1 Y]) %Encuadre de la imagen drawnow %Se obliga al programa a dibujar lo que se ha pedido for c=1:X %Bucle para recorrer las columnas de la imagen for f=1:Y %Bucle para recorrer las filas de la imagen for k=1:3 %Bucle para recorrer los 3 colores RGB de cada pixel matriz_de_colores(f,c,k)=1-matriz_de_colores(f,c,k); %Operacion end end end figure;image(matriz_de_colores) %Dibujo de la nueva imagen obtenida axis equal %Escalado horizontal y vertical axis([1 X 1 Y]) %Encuadre de la imagen Escuela Superior de Ingenieros de San Sebastián - Universidad de Navarra 6ª práctica. Matlab 1.2 página 2 Modificación del brillo de una imagen Realice una función cuyo encabezado sea: function brillo(archivo,porcentaje) Donde archivo es, de nuevo, una cadena de caracteres con el nombre completo del archivo y porcentaje es el % que se quiere incrementar la intensidad de los colores de la imagen. Esta función debe abrir dos figuras, en la primera dibujará el JPG del archivo y en la segunda dibujará la misma imagen con la intensidad pedida por el usuario. 1.3 Dibujo de la imagen en blanco y negro y escritura en un fichero Realice una función cuyo encabezado sea: function escala_grises(archivo_origen,archivo_destino) Donde archivo_origen es, como siempre, una cadena de caracteres con el nombre completo del archivo y archivo_destino es el nombre completo del archivo en el que el usuario desea guardar la imagen en escala de grises. Esta función debe abrir dos figuras, en la primera dibujará el JPG del archivo y en la segunda dibujará la misma imagen en escala de grises. Para dibujar en escala de grises cada píxel de la imagen debe tener la misma cantidad de Rojo, Verde y Azul. Así que lo que debe hacer es calcular la media de la composición RGB de cada píxel y asignar esta media a los tres valores RGB. Para escribir el fichero con el nombre puesto por el usuario, habría que finalizar el programa con las instrucciones: matriz_de_colores=matriz_de_colores(:,:,1);%Se recoge sólo un color ya que los tres coinciden al ser escala de grises matriz_de_colores=matriz_de_colores*255; %Se reescala a 255 matriz_de_colores=uint8(matriz_de_colores); %Se convierten a enteros sin signo de 8 bits imwrite(matriz_de_colores,archivo_destino,formato) %Se guarda la imagen en el archivo de destino 2 IDENTIFICACIÓN DE OBJETOS 2.1 Introducción Vamos a realizar una operación digital consistente en extraer el contorno de una figura. Usted partirá de una imagen y creará una nueva imagen binaria. Está nueva imagen tendrá un número de píxeles igual a la imagen de partida pero el valor RGB de estos píxeles será de 1 –si el píxel no pertenece al contorno de la figura– o de 0 –si el píxel pertenece al contorno de la figura. Escuela Superior de Ingenieros de San Sebastián - Universidad de Navarra 6ª práctica. Matlab página 3 Posteriormente dibujará la imagen binaria mediante la función image para comprobar el resultado. En la imagen aparece Sven Hannavald,: subcampeón del mundo 2002-2003 de saltos de trampolín. A la derecha se encuentra la silueta de la imagen de la izquierda. 2.2 Determinación de un objeto mediante máscaras de gradiente En primer lugar se ha de crear una matriz de dimensión MxN que contenga la media de los colores de la hipermatriz de dimensión MxNx3 con los colores RGB. Sobre esta nueva matriz hay que aplicar dos máscaras (H1, H2). Estas máscaras se llaman máscaras de gradiente porque dan un valor de la variación del color de la imagen en la dirección X -H1- y en la dirección Y -H2-. Hay muchas máscaras de gradiente. Nosotros utilizaremos las de Prewitt, que tienen los siguientes valores: Prewitt −1 0 1 H1 = −1 0 1 −1 0 1 −1 −1 −1 H 2 = 0 0 0 1 1 1 A cada píxel de la imagen, exceptuando los píxeles que se encuentran en los bordes, se le aplicará primeramente la máscara H1 y posteriormente la máscara H2. Aplicar la máscara H1 sobre el píxel M, N da la variación cromática en la dirección X en el punto M, N y se obtiene mediante la siguiente operación: 3 3 g1 ( M , N ) = ∑∑ H1 ( i, j ) Pixel ( M + i − 2, N + j − 2 ) i =1 j =1 De igual forma, aplicar la máscara H2 en el píxel M, N da como resultado el valor de g2 en el punto M, N, que será proporcional a la variación del color de la imagen en la dirección vertical: 3 3 g 2 ( M , N ) = ∑∑ H 2 ( i, j ) Pixel ( M + i − 2, N + j − 2 ) i =1 j =1 Posteriormente se aúnan las dos variaciones cromáticas obtenidas mediante la siguiente operación: g ( M , N ) = g1(2M , N ) + g 2(2M , N ) Con lo que se obtiene el valor del módulo del gradiente de colores en el píxel M, N. Una vez aplicada la máscara a lo largo de todos los píxeles se procede a marcar aquellos cuyo valor de gradiente supere un cierto umbral. 2.3 Encabezado de la función Realice una función cuyo encabezado sea: Escuela Superior de Ingenieros de San Sebastián - Universidad de Navarra 6ª práctica. Matlab página 4 function contorno(archivo,umbral) Donde archivo es una cadena de caracteres con el nombre completo del archivo (incluida su extensión) y umbral es el valor mínimo que debe presentar g(M,N) para que sea marcado como contorno de la figura. Esta función debe abrir dos figuras, en la primera figura dibujará el JPG del archivo y en la segunda figura el contorno de los objetos. Respecto a la magnitud del parámetro umbral, pruebe con valores de al rededor de 0.5. 3 DIBUJO DEL MAPA Y DE LA TRAYECTORIA DEL ROBOT 3.1 Introducción Vamos a continuar con el ejercicio del robot que es capaz de moverse dentro de un mapa. Y más concretamente vamos a programar un entrono gráfico en el que podamos ver el mapa y los movimientos que realiza el robot dentro de él. En realidad, lo que usted va a hacer es equivalente a programar el fichero laberinto.m que ha estado utilizando para chequear si funcionaba bien el programa realizado en la práctica anterior. 3.2 Sistema de coordenadas El desarrollo del algoritmo y de la programación que nos hemos propuesto resulta muy sencilla si dedicamos un cierto tiempo a concretar un sistema de coordenadas para realizar los dibujos. Lo primero que haremos será dividir el mapa en 60x60 puntos y numerarlos así: Y 1 1 2 3 4 60 2 3 60 Donde la unidad de longitud será igual a 1. Con este esquema hay que considerar lo siguiente y es que a la hora de dibujar en 2D, Matlab utiliza ejes cartesianos, mientras que los ejes elegidos por usted tienen valor ascendente según se reduce la altura de lo que sería el eje Y en un sistema cartesiano, por lo que hay que introducir la instrucción >>axis ij , que lo que hace es invertir el sentido del eje Y. Con este esquema posicionar los dibujos resulta muy sencillo. Si, por ejemplo, el mapa tuviera un -1 en la fila F y en la columna C, para dibujar el cuadrado negro correspondiente a ese punto bastaría con utilizar la función patch con las siguientes C-1 C C+1 60 coordenadas: F-1 >>patch([C C+1 C+1 C],[F F F+1 F+1],'k') F F+1 60 Escuela Superior de Ingenieros de San Sebastián - Universidad de Navarra 6ª práctica. Matlab página 5 Lo mismo sucedería si se quisiera dibujar el cuadrado azul correspondiente a la localización del 1: >>patch([C C+1 C+1 C],[F F F+1 F+1],'b'). Un poco más complicado puede ser dibujar el robot en forma de triángulo, -pero sólo un poco más-. El lugar y la manera en la que se dibuje es función de la fila y columna en la que se encuentre y de la orientación. Suponga que el robot se encuentra en la fila F y en la columna C. Tendrá una de estas cuatro orientaciones: F, C F, C Orientación 1 Orientación 2 F, C F, C Orientación 3 Orientación 4 Si, por ejemplo, se encontrara con la orientación 1 (Norte), una expresión que lo dibujaría perfectamente situado dentro del mapa, sería la siguiente: patch([C C+0.5 C+1], [F+1 F F+1],'r') De igual manera sucedería con las orientaciones 2, 3 y 4, que se dibujarían así: 3.3 patch([C C C+1], [F+1 F F+0.5],'r') Orientación 2 patch([C C+1 C+0.5], [F F F+1],'r') Orientación 3 patch([C C+1 C+1], [F+0.5 F F+1],’r') Orientación 4 Programación Realice una función cuyo encabezado sea: function dibujar(mapa,estado,instrucciones) Donde los argumentos de entrada son: mapa: matriz con el mapa del terreno. estado: vector con la posición y orientación inicial del robot. instrucciones: vector con las instrucciones que se mandan al robot. A continuación desarrolle el diagrama de flujo del programa y programe la función. Las primeras líneas serán para la preparación de la gráfica y deberán ser las siguientes: function dibujar(mapa,estado,instrucciones) Encabezado de la función figure(gcf); Abre una nueva ventana clf; Iniciales de Clear current figure. set(gcf,'Position',[100 100 600 600], ... Prepara la figura en sus dimensiones 'Name','Mapa del terreno','DoubleBuffer','on'); axis ij; y para que no parpadee. Invierte la orientación del eje Y. axis([1 61 1 61]) Ajusta el tamaño de la figura para que sea de 60x60 unidades (desde la 1 hasta la 61). Escuela Superior de Ingenieros de San Sebastián - Universidad de Navarra 6ª práctica. Matlab página 6 Los pasos que debe dar a continuación su programa deben ser: 1º Recorrer las filas y columnas del mapa mediante un doble bucle e ir dibujando los cuadros negros y el cuadro azul. 2º Posteriormente hay que hacer un bucle que recorra el vector de instrucciones y dibuje el movimiento que realiza el robot adecuadamente. Nota: para ver la evolución del robot a lo largo del mapa, utilice la función drawnow cada vez que utilice la función patch. De lo contrario solo verá el resultado final. Escuela Superior de Ingenieros de San Sebastián - Universidad de Navarra