Tratamiento de imágenes mediante Matlab

Anuncio
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
Descargar