Procesamiento de Imágenes con Matlab Introducción Vamos a ver una introducción al procesamiento de imágenes con Matlab. Vamos a ver, mediante un pequeño tutorial, las siguientes funciones básicas de procesamiento de imágenes: imread() imshow() imwrite() rgb2gray() imhist() imadjust() im2bw() imread() El comando imread() leerá una imagen guardándola en una matriz: img = imread('Torre.png'); La imagen queda guardada en la matriz img. Si se estima conveniente, dentro del nombre de la imagen que queremos abrir es posible indicar el directorio donde se encuentra la imagen (por ejemplo Midirectorio/EjercProcImag/Torre.png). >> size(img) ans = 499 748 %size: para ver dimensiones de la matriz de la imagen 3 Esto indica que es una matriz de 499x748 con 3 canales RGB. RGB (Red Green Blue): en cada canal contiene la cantidad de ese color que contiene ese pixel. La matriz contiene algo parecido a esto: 1 imshow(): Para mostrar nuestra imagen, podemos usar (entre otros) los comandos imshow() o imagesc(). El comando imshow() muestra una imagen en formato estándar de 8 bits, como suelen aparecer las imágenes, por ejemplo, en un navegador web. El comando imagesc() muestra la imagen con ejes escalados con el valor mínimo como negro y el valor máximo como blanco. Usando imshow(): 2 Usando imagesc(): El nombre del fichero de la imagen es sensible a mayúsculas/minúsculas. Podemos ver los valores RGB de un pixel (x, y) poniendo el cursor en esa posición de la imagen de la siguiente forma: 1. Seleccionar el icono "Data Cursor" en el menú superior. 2. Hacer clic con el botón izquierdo del ratón en cualquier punto de la imagen. Vemos que cada pixel es un vector tridimensional con valores en el rango [0, 255]. Los tres números que se muestran es la cantidad de cada color Rojo, Verde y Azul (RGB: Red Green Blue). 3 Una imagen en color es una imagen combinada de 3 imágenes (R, G, B). Por tanto, podemos mostrar los componentes individuales RGB de la imagen usando comandos como los utilizados en el siguiente script: subplot(1,3,1); imagesc(img(:,:,1)); title('Red'); % color Rojo (R) subplot(1,3,2); imagesc(img(:,:,2)); title('Green'); % color Verde (G) subplot(1,3,3); imagesc(img(:,:,3)); title('Blue'); % color Azul (B) Si usamos colormap gray, configuramos el mapa de colores como escala de grises: >> colormap gray 4 Si quisiéramos seguir "jugando" con la imagen, podríamos crear una imagen nueva que tenga más azul (por ejemplo cuadriplicando este componente azul). subplot(2,1,1); imshow(img); title('Normal RGB'); subplot(2,1,2); blue_img = double(img); %conversión (cast) a formato double blue_img(:,:,3) = 4*blue_img(:,:,3); blue_img = uint8(blue_img); %conversión (cast) a formato uint8 imshow(blue_img); title('RG 4*B'); % 4*B: hemos multiplicado por 4 el azul (Blue) 5 imwrite (): Para guardar nuestra nueva imagen que hemos modificado poniéndole el color azul intensificado, usamos el comando imwrite(): imwrite(blue_img, 'Blue4_Torre.png', 'png');%guarda imagen formato PNG imwrite sigue la sintaxis imwrite(A, 'NombreFichero', FMT) que escribe la imagen A en el fichero NombreFichero, en el formato FMT (por ejemplo, BMP, GIF, JPG, PNG, TIF, etc.). Para más información, teclear help imwrite(). rgb2gray(): Si queremos pasar nuestra imagen a escala de grises podemos utilizar el comando rgb2gray(). Podríamos hacer algo así: img = imread('IP1/Torre.png'); gray = rgb2gray(img); imshow(gray); 6 >> size(gray) ans = 499 748 Ahora, tenemos solo un valor por cada pixel, no 3 valores como teníamos antes (R,G,B). imhist(): Muestra un histograma de los datos de la imagen. imhist(img,n) muestra un histograma con n barras para la imagen de intensidad sobre una barra de color de la escala de grises de longitud n. Si omitimos los argumentos, imhist() usa un valor por defecto de n = 256 si I es una imagen en escala de grises, o n=2 si I es una imagen binaria. img = imread('IP1/Torre.png'); gray = rgb2gray(img); imhist(gray); 7 imadjust(): imadjust() ajusta los valores de intensidad de la imagen. Mapea los valores de intensidad de la imagen de una entrada a nuevos valores en la imagen de salida. J = imadjust(I) mapea los valores de intensidad de una imagen en escala de grises a nuevos valores en J. J = imadjust(I,[low_in; high_in],[low_out; high_out]) mapea los valores en I a nuevos valores en J tal que los valores entre low_in y high_in son mapeados a valores entre low_out y high_out. Si se especifica una matriz vacía ([]), imadjust usa los límites por defecto de [0 1]. Lo siguiente incrementa el contraste de la imagen: img = imread('IP1/FotoPadreHija.jpg'); gray = rgb2gray(img); adj_img = imadjust(gray, [0.3,0.7],[]); subplot(1,2,1); imshow(gray); title('input'); subplot(1,2,2); imshow(adj_img); title('adjusted'); 8 Input file : FotoPadreHija.jpg. im2bw() im2bw() convierte la imagen que teníamos en escala de grises a una imagen binaria (sólo contiene blanco o negro). En este ejemplo usamos la imagen ajustada. img = imread('IP1/FotoPadreHija.jpg'); gray = rgb2gray(img); adj_img = imadjust(gray, [0.3,0.7],[]); bw_img = im2bw(adj_img); subplot(1,2,1); imshow(adj_img); title('input image'); subplot(1,2,2); imshow(bw_img); title('binary image'); 9