Guía 1 Facultad: Ingeniería. Escuela: Biomédica Asignatura: Imágenes Médicas Introducción a MatLab y Tollbox Image Processing Objetivos • Introducir • Introducir el conceptos uso del básicos de Image Processing imágenes ToolBox de digitales. MatLab. Recomendaciones • Tenga orden y aseo para trabajar • Siempre que tenga duda del procedimiento a realizar, consúltelo con el docente o instructor • Todas las piezas y componentes que se quiten se deben de ir guardando en forma ordenada • Siempre anote lo que haga, aún lo mas irrelevante, ya que al final cuando el sistema se tiene desensamblado se vuelve complejo • Siempre aplique las normas de seguridad que le explicará el docente o instructor • Los circuitos eléctricos dentro del equipo utilizan voltajes los cuales soncapaces de causar algún daño debido a los choques eléctricos por lo que sedebe de tener en cuenta las normas de seguridad eléctrica. • Familiarizarse con el sistema de desconexión de la energía eléctrica • Los cables de alto voltaje y los capacitores de este equipo guardan energía que puede provocar algún choque eléctrico, por lo que antes de manipularse se deberán descargar. • No aplique energía eléctrica al equipo, hasta que esté seguro que las desconexiones que ha realizado se han restaurado. • Al finalizar el laboratorio se debe dejar en la misma condición en que se encontró, aún los accesorios y herramientas utilizadas. Equipo Computadora con MatLab y Processing Image Toolbox Introducción Teórica FUNDAMENTOS 1 Guía 1 Una imagen digital esta compuesta de píxeles los cuales pueden definirse de alguna manera como pequeños puntos en la pantalla o imagen. Cada píxel es capaz de proporcionar información visual acerca de una pequeña región en particular de la imagen. A partir de esto, se puede considerar a una Imagen Digital, como un arreglo de instrucciones de cómo se encuentra coloreado cada píxel. En general se puede decir que una imagen de m por n si esta compuesta de m píxeles en la dirección vertical y n píxeles en la dirección horizontal. Es decir que tener una imagen de 512 x 1024 píxeles, significa que la imagen contiene en sí información para 524288 píxeles, los cuales requiere mucha memoria. Por lo tanto, la compresión de las imágenes es algo esencial para el procesamiento eficiente de la imagen. El sistema de coordenadas empleado para la ubicación de cada píxel de la imagen es como se muestra la figura FIGURA 1.1. Sistema de coordenadas en la ubicación de cada píxel. Las imágenes digitales en MATLAB se representan por medio de un arreglo de números reales o complejos. Dicho arreglo puede ser bidimensional o tridimensional, dependiendo del tipo de imagen de que se trate. PROFUNDIDAD DE BITS La Profundidad de Bits viene determinada por la cantidad de bits utilizados para definir cada píxel. Mientras mayor sea la profundidad de bits, mayor será la cantidad de tonos (escala de grises o color) que se pueden representar. Las imágenes digitales se pueden producir en blanco y negro (en forma bitonal), a escala de grises o a color. Una imagen bitonal está representada por píxeles que constan de 1 bit cada uno, que pueden representar dos tonos (típicamente negro y blanco), utilizando los valores 0 para el negro y 1 para el blanco o visceversa. Una imagen en escala de grises está compuesta por píxeles representados por múltiples bits de información, que típicamente varían entre 2 a 8 bits o más. 2 Guía 1 Una imagen a colores está típicamente representada por una profundidad de bits entre 8 y 24 o superior a ésta. En una imagen de 24 bits, los bits por lo general están divididos en tres grupos: 8 para el rojo, 8 para el verde, y 8 para el azul. Para representar otros colores se utilizan combinaciones de esos bits. Una imagen de 24 bits ofrece 16,7 millones (2 24 ) de valores de color. Cada vez más, los escáneres están capturando 10 bits o más por canal de color y por lo general imprimen a 8 bits para compensar el "ruido" del escáner y para presentar una imagen que se acerque en el mayor grado posible a la percepción humana. Independientemente del numero de colores que el sistema pueda desplegar, MatLab puede almacenar y procesar imagenes con altas profundidades de bits : - 224 colores para imagenes RGB uint8 - 248 colores para imagenes RGB uint16 - 2159 colores para imagenes RGB double Estas imagenes se desplegan mejor en sistemas con color de 24 bits, pero usualmente lucen bien en sistemas de 16 bits. Para poder determinar la profundidad de bits de la pantalla del sistema se debe introducir el siguiente comando en el prompt de MatLab: >> get (0,'ScreenDepth') ans = 32 El entero que MatLab retorna representa el número de bits por cada píxel de la pantalla. Es obvio entonces, que el tamaño del archivo estará definido por la profundidad de bits con la que se trabaje, dado que para calcular el tamaño del archivo se ha de proceder calculando primero el área de la imagen y luego multiplicandola por la profundidad de bits que se selecciona. FORMATO O TIPOS DE DATOS Un entero es un número que no tiene una parte fraccional, el cual puede ser positivo, negativo o cero. Normalmente, se utiliza un signo negativo para designar un entero negativo. Sin embargo, una computadora puede guardar información en bits unicamente, es decir, solamente puede hacer uso de dos valores para lograr la representación anterior, 0 y 1. Cuando un entero es declarado como no signado (uint), el significado de ello es que el bit mas significativo en la representación de un dato se toma como lo que és, un dato significativo y no como un signo. MatLab tiene cuatro tipos de datos enteros signados y cuatro no signados. Los del tipo signado permiten trabajar con enteros negativos así como con enteros positivos, pero no pueden representar un rango amplio de numeros como lo hacen los tipos no signados dado que un bit es utilizado para designar el signo del número, si es positivo o negativo. El tipo no signado permite un rango mayor de numeros, pero estos únicamente puedenestar en el rango de los enteros positivos, o el cero. 3 Guía 1 La información de tipo Punto Flotante, provee los medios para guardar y manipular numeros con parte fraccionaria y un amplio rango de ramaños. El standar ANSI describe tres tipos de puntos flotantes de almacenaje conocidos como: - float, - double - long double MatLab construye la información del tipo de precisión doble (double) de acuerdo al estandar 754 de la IEEE. Cualquier valor almacenado como double requiere 64 bits,en un formato que se detalla a continuación: Por defecto Matlab almacena la mayoría de los datos en vectores de clase doble (double). Sin embargo, para procesamiento de imágenes, esta representación de datos no es siempre la ideal, ya que el número de píxeles en una imagen puede ser muy grande. Para reducir requerimientos de memoria las versiones nuevas de Matlab puede almacenar píxeles en uint8 (enteros de 8 bits sin signo). Las operaciones permitidas en Matlab para trabajar con píxeles uint8 son: - Representación de imágenes - Lectura de la imagen a partir de un formato (imread). - Reordenar vectores (reshape, cat). - Guardar o cargar un fichero .MAT. 4 Guía 1 - Funciones all (devuelve un 1 si todos los elementos de un vector valen 1) y any (devuelve un 1 si cualquier elemento de un vector vale 1). - Operadores lógicos y de indexación. - Operaciones relacionales. - La función find se puede utilizar con vectores de datos uint8, pero devuelve un vector de dobles. Aparte de las indicadas, Matlab NO puede realizar la mayoría de las funciones con datos uint8. En particular, las peraciones matemáticas no están permitidas. Sin embargo, la mayoría de las funciones del Toolbox de Imagen aceptan como entradas uint8. Convertir de una a otro formato o tipo de datos es sencillo, de la siguiente manera: >> Ima=im2double(Ima); % Convierte una imagen con nombre Ima de uint8 a double. >> Ima=im2uint8(Ima); % Convierte una imagen con nombre Ima de double a uint8. FORMATOS DE IMÁGENES SOPORTADOS POR MATLAB MatLab soporta los siguientes formatos de imágenes: .BMP, .HDF, .JPEG, .PCX, .TIFF, .XWB La mayoría de las imágenes disponibles hoy en día , se encuentran en el formato JPEG, el cual es el nombre para el standard de compresión de imágenes que más se utiliza. Una imagen puede ser truecolor o indexada. Una imagen indexada, de altura h y anchura w, se almacena mediante dos matrices: una matriz de índices tamaño h x m y un mapa de colores. Cada celda de la matriz de índices corresponde a un pixel de la imagen y contiene un índice a un color concreto del mapa de colores. Por ejemplo, para una imagen en color de 8 bits hay 256 posibles colores; cada celda de la matriz de índices tiene un valor entero entre 0 y 255 que es un índice a uno de los 256 colores descritos en el mapa de colores. Al trabajar en MatLab se deben considerar múltiples factores como la manera en la que se carga una imagen, el formato correcto, guardar la información de diferentes maneras, como desplegar una imagen, conversiones entre diferentes formatos de imágenes, etc. FORMATOS DE TRABAJO EN MATLAB - Imagen de Intensidad (Imagen en escala de grises) Representa una imagen como una matriz, donde cada elemento tiene un valor que se corresponde a cuan brillante u oscuro debería ser coloreado el píxel en la posición correspondiente. Existen dos formas de representar el número que a su vez representa la brillantez del píxel. La clase double, asigna un número flotante (número con decimales), entre 0 y 1 a cada píxel. El valor 0 corresponde al Negro y el 1 al Blanco. La otra clase es la uint8 la cual asigna un entero entre 0 y 255 para representar la brillantez de un píxel. El valor 0 corresponde al Negro y 255 al Blanco. La clase uint8 requiere aproximadamente un octavo de almacenamiento comparado con lo que requiere la clase double. Sin embargo, debe considerarse el hecho que muchas funciones matemáticas pueden aplicarse únicamente con la clase double. - Imagen Binaria 5 Guía 1 Este formato de imagen también guarda una imagen como una matriz pero un píxel de la misma únicamente tiene dos posibles colores Blanco o Negro (y nada entre ellos). Este formato de imagen asigna 0 para el Negro y 1 para el Blanco. - Imagen Indexada Es una forma práctica de representar las imágenes a color. Una imagen indexada guarda una imagen como dos matrices. La primera matriz tiene el mismo tamaño que la imagen y un numero para cada píxel. La segunda matriz se conoce como Mapa de Color (Colormap) y su tamaño puede diferir del de la imagen. Los números en la primera matriz indican el número a usar en la matriz Mapa de Color. Por ejemplo, si se considera una matriz 3 por 3: >> W=[1 2 3; 2 3 2; 3 2 1] ; y un mapa de color asociado de longitud 3: >> mapa = [1 0 0; 0 1 0; 0 0 1] ; donde la primera fila (primera tripleta) es rojo, la segunda verde y la última azul. Entonces, >> W=[1 2 3; 2 3 2; 3 2 1]; >> mapa = [1 0 0; 0 1 0; 0 0 1]; >> image(W) >> colormap(mapa) El mapa de colores es una matriz que tiene tres columnas, una por cada color básico (rojo, verde y azul o RGB) y una fila por cada posible color. Para el ejemplo de 256 colores, el mapa de colores sería una matriz de tamaño 256 x 3. Cada fila del mapa de colores describe un color concreto y contiene tres números en punto flotante, con un valor entre 0 y 1, que dan las cantidades de rojo, verde y azul que tiene el color. Así, por ejemplo, si la fila 6 contiene los valores [0.062745 0.031373 0] ello indica que, en ese mapa de colores, el color número 6 no contiene azul y contiene intensidades pequeñas de rojo y verde. Muchas imágenes en blanco y negro se almacenan con un mapa de 256 colores (niveles de gris), pero en este caso, cada nivel contiene las mismas cantidades RGB, es decir, las tres celdas de cada fila contienen el mismo valor. La instrucción utilizada para el trabajo con el mapa de colores en mapa es colormap(m), la cual permite cambiar el mapa de colores que se utiliza en la representación. En general, m es una matriz con tres columnas, de modo que la pésima fila determina las proporciones, en la escala RGB, del i-ésimo color utilizado. Para más comodidad, MATLAB dispone de una serie de mapas de colores predefinidos, que se pueden imponer mediante colormap(mapa), donde mapa puede tomar uno de los valores siguientes: 6 Guía 1 - Imagen RGB (Truecolor) Este es otro formato para imágenes a color. Se presenta en la forma de un arreglo de mxnx3 de clases uint8, uint16, single, o double cuyos valores de píxel especifican valores de intensidad. Este representa una imagen con tres matrices de tamaños que concuerdan con el de la imagen. Cada matriz corresponde a uno de los colores básicos Rojo, Verde o Azul y da establecen cuanto de cada uno de estos colores debe ser usado en un determinado píxel. - Imagen Múltiples-Frames Cuando se requiere hacer estudios de secuencias de imágenes, este formato es eindicado. Por ejemplo en imágenes médicas donde se requiere el estudio de secuencias de cortes transversales, longitudinales, etc.. CONVERSIÓN ENTRE FORMATOS DE TRABAJO DE IMAGENES Para convertir imágenes entre los diferentes formatos disponibles, MatLab con su 7 Guía 1 Image Processing Toolbox cuentan con una serie de comandos que facilitan realizar tales procedimientos: El comando mat2gray es útil si se tiene una matriz que representa una imagen pero los valores que representan la escala de grises no son adecuados. El comando mat2gray automáticamente re-escala todas las entradas a valores que se encuentren entre 0 y 255 (si se utiliza uint8) o 0 y 1 ( si se utiliza double). LECTURA DE ARCHIVOS Las imágenes que desean ser procesadas, normalmente se encuentran en la forma de un archivo, mientras que el trabajo en MatLab se desarrolla con una imagen vista como una matriz. Estas imágenes una vez procesadas deben ser guardadas en un formato de imagen que sea compatible con otros programas, tal como JPEG, TIFF, etc,. La función imread lee imágenes que se encuentren en cualquiera de los formatos de archivo de gráficos de imágenes, con cualquier profundidad de bit. La mayoría de las imágenes utiliza 8 bits para guardar los valores de los píxel. Como ya se explico, cuando estos son guardados MatLab los guarda como clase uint8. Para formatos de archivo que soportan información de 16 bits, PNG y TIFF por ejemplo, MatLab guarda las imágenes como clase uint16. Para imágenes indexadas, imread siempre lee el mapa de color dentro de una matriz de clase double, aunque el mismo arreglo de la imagen sea clase uint8 o uint16. LECTURA DE MÚLTIPLES IMÁGENES DE UN ARCHIVO GRAFICO MatLab soporta archivos gráficos con diferente formato, tales como HDF y TIFF, que pueden contener múltiples imágenes. Por defecto, imread importa solo la primera imagen de un archivo de este tipo. Para importar las imágenes adicionales desde el archivo, se debe utilizar la sintaxis soportada por el formato del archivo. Por ejemplo, cuando se usan archivos TIFF, se puede utilizar un valor índice con imread 8 Guía 1 identifica la imagen dentro del archivo que se requiere importar. Así, este ejemplo lee una serie de 8 imágenes de un archivo TIFF y guarda las imágenes en un arreglo de 4 dimensiones. Se puede utilizar imfinfo para determinar cuantas imágenes han sido guardadas en el archivo: >> rm=uint8(zeros(128,128,1,8)); >> for frame = 1:8 >> [rm(:,:,:,frame),map]=imread(‘rm.tif’,frame); >> end DESPLEGADO DE IMÁGENES EN MATLAB No todos los comandos para el desplegado de una imagen requieren tener Image Processing Toolbox. Tal es el cado se los siguientes comandos: A veces la imagen no puede ser desplegada en escala de grises aunque haya sido previamente convertida a una imagen en escala de grises. Es entonces que se puede hacer uso del comando colormap(gray) para “forzar” a MatLab a usar una escala de grises al momento de desplegar una imagen. Si el MatLab tiene el Image Processing Toolbox instalado, es recomendable en lugar de utilizar los comandos anteriores, el comando imshow Procedimiento 9 Guía 1 NOTA : Etiquete con explicaciones cada una de las partes de las instrucciones que utilizo en la práctica, en MatLab, luego del ; en una instrucción se coloca % y posteriormente se puede escribir sin que perjudique la ejecución de la instrucción. Si hay un salto de línea, se debe volver a colocar el carácter anterior. Esto le será útil como una buena técnica de estudio para el parcial práctico. PARTE I. Binarización de una imagen. >> clear >> close all >> Ima= imread('sp01.gif'); >> figure(1), imshow(Ima); >> ImaFil = Ima(100,:); >> ImaCol = Ima(:,256); >> figure(2), imshow(ImaFil); >> figure(3), imshow(ImaCol); >> max(max(Ima)) ¿Cual es el resultado obtenido?, Un número aproximadamente igual a la mitad de este será utilizado para declarar la variable x. >> syms x >> x=128; >> ImaBin1=Ima>x >> ImaBin2=Ima<x >> figure(4), imshow(ImaBin1); >> figure(5), imshow(ImaBin2); Visualice ambas figuras y establezca la diferencia entre ellas. PARTE II. Mapa de Colores, imread, imshow e imwrite. >> clear >> close all 1 Guía 1 >> imabmp1=imread('Noies.bmp'); >> imatif1=imread('Nena.tif'); >> imajpg1=imread('Castell.jpg'); >> imabmp2=imread('H_24.bmp'); >> imatif2=imread('Hombro.tif'); >> imajpg2=imread('Aneuri.jpg'); Verifique como aparece cada una de estas imágenes, como matrices o arreglos de matrices en el Workspace. Comente cada una de ellas. Proceda de la siguiente manera: >> [indimabmp1,map]=rgb2ind(imabmp1,255); En este punto verifique como ha cambiado el Workspace. Intente presentar la imagen obtenida en diferentes mapas de colores así: >> imshow (indimabmp1), colormap(cool); >> imshow (indimabmp1), colormap(spring); >> imshow (indimabmp1), colormap(pink); Ahora inténtelo con el mapa de color asignado, de la siguiente manera: >> imshow (indimabmp1), colormap(map); Realice una nueva conversión: >> indimabmp1gr = ind2gray(indimabmp1,map); Muestre el resultado >> imshow (indimabmp1gr); Vuelva a realizar las pruebas intentando mostrar la imagen antes convertida con los Mapas de Colores utilizados anteriormente. ¿Qué resultado obtuvo?. Guarde la imagen original. >> imwrite (indimabmp1gr,'Noies.bmp'); Cambie el mapa de color de las imágenes cargadas, y guárdelas en su directorio de trabajo. PARTE III. Lectura de una imagen Multiframe. El Toolbox de Procesamiento de Imágenes provee soporte para guardar múltiples imágenes en un mismo arreglo. Cada imagen separada es lo que se conoce como Frame. Primero se ha de crear un arreglo en cuatro dimensiones que permitirá que en él sean arreglados cada uno de los Frames. >> mri = uint8(zeros(128,128,1,27)); % preallocate 4-D array 1 Guía 1 donde, 128 x 128 es la medida en píxels de cada una de las imágenes en los Frames y 27 es el número de Frames que la componen. >> for frame=1:27 >> [mri(:,:,:,frame),map] = imread('mri.tif',frame); >> end Con la etapa anterior, se extraen todos los Frames los cuales pueden desplegar ser desplegados individualmente de la siguiente manera: >> figure;imshow(mri(:,:,:,6),map); >> figure;imshow(mri(:,:,:,12),map); >> figure;imshow(mri(:,:,:,24),map); O si se quiere desplegar todo el conjunto a la vez, unicamente hace falta: >> montage(mri,map); PARTE IV. Histograma de una imagen. Limpiar el workspace y cerrar todas las ventanas abiertas >> clear >> close all Cargar un demo del Image Processing de MatLab >> load clown Presentar la imagen y su mapa de color asociado >> figure(1), imshow(X,map),colorbar; >> axis on ; >> title('IMAGEN ORIGINAL EN COLOR'); Presentar la imagen en blanco y negro: >> i = (1:256)'/256; >> mapbn = [i i i]; >> figure(2), imshow(X,mapbn),colorbar; >> axis on >> title('IMAGEN EN BLANCO Y NEGRO'); Mejorar el contraste de la imagen >> ColorMax = max(X(:)); >> Y = X/ColorMax*256; >> figure(3), imshow(Y,mapbn), colorbar; >> axis on, title('IMAGEN CON MEJORA DE CONTRASTE'); Presentar el histograma de las imágenes, notando las diferencias entre ambos. 1 Guía 1 >> figure(4),subplot(2,1,1),imhist(X,mapbn); >> figure(4),subplot(2,1,2),imhist(Y,mapbn); Presentar la imagen original con múltiples mapas de colores, que sirven de referencia en la misma imagen: >> figure(5), imshow(Y,flag), colorbar; >> figure(6), imshow(Y,hot), colorbar; >> figure(7), imshow(Y,autumn), colorbar; >> figure(8), imshow(Y,winter), colorbar; Análisis de resultados • • • ¿Qué es una imagen TrueColor? • ¿Cómo puede conseguirse una imagen indexada partiendo de una imagen TrueColor?. Presente un ejemplo. • Desarrolle el siguiente procedimiento, e indique que diferencias encuentra entre las dos imágenes que se correspondan en color y la razón de estas diferencias. ¿Qué es un histograma y que ayuda a determinar? Defina las siguientes clases utilizadas en el Image Processing Toolbox: uint8, uint16, double, logical >> [X,map] = imread('Gaudi.bmp'); >> figure(1), imshow(X,map) >> title('IMAGEN ORIGINAL CON SU PROPIO MAPA DE COLOR'); i = (1:256)'/256; >> mapred1= [i zeros(256,1) zeros(256,1)]; >> mapgre1= [zeros(256,1) i zeros(256,1)]; >> mapblu1= [zeros(256,1) zeros(256,1) i]; >> figure(2), imshow(X,mapred1) >> title('IMAGEN ROJO 1'); >> figure(3), imshow(X,mapgre1) >> title('IMAGEN VERDE 1'); >> figure(4), imshow(X,mapblu1) >> title('IMAGEN AZUL 1'); >> mapr= [ones(256,1) zeros(256,1) zeros(256,1)]; mapred2=mapr.*map ; >> mapg= [zeros(256,1) ones(256,1) zeros(256,1)];mapgre2=mapg.*map ; >> mapb= [zeros(256,1) zeros(256,1) ones(256,1)];mapblu2=mapb.*map ; 1 Guía 1 >> figure(5), imshow(X,mapred2) >> title('IMAGEN ROJO 2'); >> figure(6), imshow(X,mapgre2) >> title('IMAGEN VERDE 2'); >> figure(7), imshow(X,mapblu2) >> title('IMAGEN AZUL 2'); investigación complementaria • Investigue la instrucción o el conjunto de estas, que permitirían obtener un conjunto de filas de una imagen y poderlo visualizar posteriormente. • Investigue la instrucción o el conjunto de estas, que permitirían obtener un conjunto de columnas de una imagen y poderlo visualizar posteriormente. • Investigue el comando imfinfo, identifique cada uno de los datos que proporciona y su utilidad. • En que se diferencian las imágenes guardadas en diferentes modalidades en el formato .BMP, es decir, si se tienen imágenes de 16 bits, de 24 bits, de 32 bits. • ¿Que es un archivo .m y en que se diferencia de un archivo .mat.? Información adicional - www.us.es/edan/asignaturas/ CN3/BREVES%20APUNTES%20MATLAB.pdf - www.iit.upco.es/palacios/matlab/ - www.mathworks.com/access/helpdesk/help/toolbox/images/images.shtml 1