Sei sulla pagina 1di 16

INTRODUCCIN A MATLAB Asignatura: Visin Artificial

Octubre 2007
1. 2. 3. 4. 5. 6. 7. 8. 9. PREFACIO.................................................................................................. 1 SINTAXIS BSICA ..................................................................................... 2 COMANDOS DE CONTROL DE FLUJO.................................................... 3 MANIPULACIN DE MATRICES............................................................... 4 ENTRADA /SALIDA ................................................................................... 5 REPRESENTACIN DE GRFICOS ......................................................... 5 DEFINICIN DE NUEVOS COMANDOS ................................................... 9 IMAGE PROCESSING TOOLBOX ........................................................... 12 REFERENCIAS ........................................................................................ 16

1. Prefacio
Este documento pretende ser una introduccin a MATLAB1, muy breve y muy bsica, dirigida a aquellos alumnos de la asignatura de Visin Artificial de la ESCET que no estn familiarizados con esta herramienta, para que puedan comenzar a utilizarla en el plazo ms breve posible. Dentro de la clasificacin de los lenguajes de programacin, MATLAB (MATrix LABoratory) se puede considerar dentro del grupo de los lenguajes interpretados. Su caracterstica fundamental es que es un lenguaje especializado en la manipulacin de matrices, aunque las versiones ms recientes del lenguaje permitan de una manera restringida la definicin de nuevos tipos abstractos de datos. El documento se ha dividido en una serie de secciones con la intencin de que el lector vaya profundizando en el manejo de la herramienta segn se avanza en la lectura. Es recomendable que segn van apareciendo los comandos, el lector los introduzca en el programa para comprobar el resultado de su ejecucin.

Copyright The MathWorks, Inc.

El arranque de la herramienta MATLAB depende del sistema donde se encuentre instalado. En la mayora de los casos bastar con poner matlab en el intrprete de comandos del sistema operativo para comenzar su ejecucin, o si se trata de un sistema operativo con interfaz grfico, hacer un doble click con el ratn en el icono correspondiente. Una vez que se est ejecutando el programa, aparece el smbolo del prompt, >>, que indica que el usuario puede comenzar a introducir comandos. MATLAB dispone de una ayuda on-line muy completa que se puede invocar en cualquier momento mediante el comando help. Si se quiere consultar la ayuda de una determinada funcin2 basta con escribir help 'nombre de funcin'. Proporcionar una explicacin breve y precisa del tem consultado. Si se desea conocer la versin de la herramienta que se est ejecutando se utiliza el comando version. El comando what obtiene una lista de los ficheros .M3, .MAT4 y .MEX5 del directorio actual. El comando who presenta las variables de la sesin actual y el comando whos da una informacin ms detallada de las variables. El comando cd imprime el directorio donde nos encontramos actualmente. El comando diary habilita o deshabilita respectivamente con on y off la escritura de los comandos de la sesin de trabajo en un fichero. Si no se especifica un nombre alternativo, el nombre por defecto del fichero es el mismo que el del comando. El comando demo permite ejecutar las demostraciones de todos las libreras que haya instaladas.

2. Sintaxis bsica
MATLAB es un lenguaje que distingue entre maysculas y minsculas. No es la misma variable a=1, que A=1+j. Los nombres de los comandos se deben escribir en letras minsculas. Se puede ejecutar un comando del sistema operativo utilizando el carcter '!' y aadiendo a continuacin el comando que se quiera ejecutar. Los comentarios se introducen poniendo el smbolo %. Desde ese punto hasta el final de la lnea, todo lo que se escriba es considerado parte del comentario. Como en todo lenguaje interpretado, cuando se trabaja sobre el prompt del intrprete de MATLAB, el computador calcula inmediatamente la respuesta de cada comando despus de pulsar la tecla return. Si al final de la lnea se ha introducido el carcter ';', el resultado de la ejecucin no se visualiza, pero si el comando se ha escrito sin este carcter, s se visualiza junto con el nombre de las variables involucradas en el resultado. Si se quiere introducir ms de un comando en una misma lnea, basta separarlos con ',' o con ';'. En el primer caso se visualizar el resultado de los comandos, mientras que en el segundo no. Si se desea visualizar el contenido de una variable sin que se escriba el nombre de la misma, basta con utilizar el comando disp. Si es necesario escribir un comando en varias lneas, basta con escribir '...' al final de una lnea y continuar en la siguiente.

Emplearemos indistintamente el trmino funciones o comandos. Un fichero .M es un fichero de texto con comandos de MATLAB 4 Un fichero .MAT es un fichero binario que contiene datos 5 Un fichero .MEX es un fichero ejecutable generado a partir de un compilador de un lenguaje de alto nivel
3

Las operaciones aritmticas tradicionales, suma, resta, multiplicacin y divisin se representan con los operadores clsicos +, -, * y /. Independientemente del tipo de los operandos involucrados en las operaciones aritmticas, enteros, reales o complejos, los clculos siempre se realizan con precisin doble. Tambin, tiene definida la divisin inversa, representada con el operador '\'. Esta operacin es la recproca de la divisin:
c = 3\ 1 c = 0.3333

La asignacin se representa con el carcter '='. Las operaciones de exponenciacin se definen con el operador '^', la transposicin de matrices con '. Con la herramienta MATLAB, no es necesario realizar una definicin explcita de las variables, ni en cuanto al tipo, ni respecto a su dimensin o tamao. Cualquier variable puede ser de tipo integer, real o complex. Los nicos problemas que pueden surgir al manejar variables es la utilizacin de un identificador reservado del lenguaje, o que la utilizacin de un identificador previamente definido por el usuario destruya el significado original del mismo. Por ejemplo, el usuario puede definir las variables sin y cos, pero entonces ya no podr disponer de las funciones trigonomtricas seno y coseno hasta que no se eliminen las nuevas variables con el comando clear. En la tabla al final del apartado 7 aparece una relacin de los comandos de MATLAB utilizados ms frecuentemente en los problemas de control y que el usuario no deber reutilizar para definir nuevos comandos o variables. Hay que hacer una mencin especial al tratamiento que da MATLAB a los nmeros complejos. Si se define un vector o una matriz de nmeros complejos, hay que evitar los espacios en blanco entre la parte real e imaginaria de un elemento, porque si no, MATLAB los considera como dos nmeros distintos. Por ejemplo, sean los nmeros complejos 3+5j y 1-8j. Si se quiere formar un vector a partir de estos 2 nmeros complejos, habra que teclear lo siguiente: a=[3+5*j 1-8*j]. Si se separan en ambos casos la parte real e imaginaria con espacios en blanco, estaramos definiendo realmente un vector de cuatro elementos.

3. Comandos de control de flujo


MATLAB dispone de los comandos for/end y while/end para definir bucles en las ejecuciones, y de los comandos if/then/else/end y switch/case/otherwise/end para establecer ejecuciones alternativas de comandos. Nos remitimos a la ayuda on-line de la herramienta para definir ms exactamente la sintaxis de estos comandos. Si se desea calcular el volumen de las esferas cuyos radios varan entre 5 y 1, bastara con escribir los siguientes comandos:
for r=5:-1:1 vol = (4/3)*pi*r^3; disp([r,vol]) end

El ndice del bucle se va decrementando en cada iteracin en una unidad, desde 5 hasta 1. El clculo de los resultados no comienza hasta que no se introduce el

comando end. En este caso no es necesario introducir el carcter ';' detrs de cada for o end. El comando break finaliza la ejecucin de un bucle for o while. Cuando se utiliza en bucles anidados, slo se interrumpe la ejecucin del bucle donde se encuentre el comando break. En el siguiente ejemplo, break finaliza la ejecucin del bucle ms interno cuando se cumple la condicin j>2*i, pero el bucle ms externo contina hasta que i=6:
for k=1:6 for l=1:20 if l>2*k, break, end end end

4. Manipulacin de matrices
MATLAB es un lenguaje concebido para manejar casi exclusivamente datos de tipo vectorial o matricial. Los vectores y las matrices n-dimensionales se pueden definir enumerando cada uno de sus elementos, o bien mediante el constructor ':'. La definicin de x = [0, 0.1, 0.2, 0.3, 0.4, 0.5] y x = 0:0.1:0.5 son equivalentes, produciendo un vector fila de dimensin 1x6. El transpuesto se puede obtener bien definindolo explcitamente, y=[0; 0.1; 0.2; 0.3; 0.4; 0.5] o bien con el operador de transposicin a partir del vector x, y = x.', generndose un vector columna 6x1. Si se desea calcular el transpuesto conjugado de un vector o una matriz de nmeros complejos, basta con poner y=x'. El constructor ';' se utiliza para delimitar las filas. Se puede acceder al contenido de un elemento del vector indexando el vector sobre el elemento de inters, por ejemplo x(3), o bien acceder a un rango de valores con el modificador ':', x(2:4). Tambin se pueden utilizar los comandos linspace o logspace para generar un vector con una serie de valores dentro de un intervalo, espaciados lineal o logartmicamente. Cuando las variables x e y son del mismo tipo, vector fila o columna, y tienen la misma dimensin, se pueden aplicar los operadores aritmticos. Si no se recuerda las caractersticas de una variable vector o matriz, se pueden utilizar los comandos length y size para consultar respectivamente el nmero de columnas y las dimensiones de la variable. MATLAB considera las variables de tipo string como si fueran vectores fila: v='helado' equivale a v=['h', 'e', 'l', 'a', 'd', 'o']. Las matrices bidimensionales se definen de manera similar a los vectores. Una matriz 3x3 se puede definir como m=[0.1, 0.2, 0.3; 0.4, 0.5, 0.6; 0.7, 0.8, 0.9];, o bien m(1,1)=0.1; m(1,2)=0.2; ... m(3,3)=0.9. Se puede acceder al contenido de una determinada fila o columna con el modificador ':'. Por ejemplo, m(1,:) y m(:,3) son respectivamente la primera fila y la tercera columna de m, y se manejan como vectores. El tamao de un vector o de una matriz se puede aumentar dinmicamente aadiendo un elemento o un vector. As, para aadir un nuevo elemento al vector x basta con poner x = [x, 0.6]. Segn se van ejecutando los comandos, la herramienta guarda en memoria todas las variables que se van utilizando hasta que se abandona MATLAB o hasta que se borran las variables. Para borrar las variables, existe el comando clear. Las operaciones de multiplicacin, divisin y exponenciacin sobre los elementos de las matrices estn definidas anteponiendo el carcter '.' a los respectivos operadores: '.*', './', '.^' '.\'. El comando g=m.^3 es equivalente a

for k=1:3 for l=1:3 g(k,l)=m(k,l)^3; end end

El mismo criterio se aplica a los operadores '.*', './' y '.\'. Suponiendo que m y n sean dos matrices del mismo tamao y dimensin, las variables m y n se puede utilizar en expresiones relacionales y lgicas. Por ejemplo: a) m==n es cierto si m(i,j)=n(i,j) para todos los elementos b) m>=n es cierto si m(i,j)>=n(i,j) para todos los elementos c) m~=n es cierto si m(i,j)~=n(i,j) para al menos uno de los elementos, siendo ~= el operador de diferencia

5. Entrada /Salida
El trasvase de datos hacia o desde MATLAB se puede realizar de varias formas: Mediante teclado o ratn: Se pueden introducir datos a travs del teclado con el comando input. Para leer un nmero, bastara con teclear z=input('Teclee el valor del radio:'). La salida a pantalla se puede realizar con el comando fprintf. Por ejemplo: fprintf('El volumen de la esfera %12.5f.n',vol). El formato es muy similar al utilizado en el lenguaje de programacin C: se imprime en una lnea la cadena de caracteres entre apstrofes y a continuacin el valor de la variable vol con el formato especificado con el modificador que sigue al carcter '%'. Si aparecen dos comandos fprintf de manera consecutiva y en el primero de ellos no aparece '\n', entonces la salida de ambos se imprimir en una sola lnea. Si se desea escribir un valor entero, bastara con poner un 0 a continuacin del punto correspondiente al modificador de formato, %12.0f, o bien utilizar el sufijo correspondiente a un valor decimal 'd'. Leer o escribir los datos en un fichero: La sintaxis y los comandos son muy parecidos a las correspondientes sentencias de entrada/salida del lenguaje C: fopen, fclose, fscanf, sscanf, sprintf, fread o fwrite. Para una descripcin detallada de la sintaxis de los mismos nos remitimos a la ayuda online proporcionada por la herramienta. Los comandos save o load: Se utilizan para almacenar y recuperar las variables en ficheros binarios de datos con extensin .MAT. La sintaxis del comando es save mx m x, almacenndose en el fichero mx.mat las variables m y x. Si posteriormente se quisiera recuperar el contenido de la variable x, bastara con escribir load mx x. Tambin es posible exportar e importar los datos a ficheros de texto con la opcin -ascii.

6. Representacin de grficos
La mayora de una, dos, tres o ms representacin grfica representacin grfica las ecuaciones matemticas expresan complejas relaciones en dimensiones. En ocasiones, tratar de comprenderlas sin su puede convertirse en una tarea imposible. En MATLAB, la de funciones se puede realizar fcilmente y con muy pocos 5

comandos. No obstante, hay que advertir que algunos de los comandos continan activos despus de que se ha dibujado el grfico y pueden intereferir posteriormente con nuevos grficos si no se pone algo de cuidado. El comando bsico para representar grficas es plot. Supongamos que deseamos representar grficamente la funcin y=sin(x)e-0.4x, 0 <=x<=10. Bastara ejecutar el siguiente cdigo:
x=0:0.05:10; y=sin(x).*exp(-0.4*x); plot(x,y) xlabel('x');ylabel('y')

Este cdigo produce la figura:

Figura 1: Ejemplos de representacin grfica con MATLAB

Las etiquetas de los ejes se imprimen con los comandos xlabel y ylabel. Se pueden aadir nuevas opciones al comando plot para cambiar el trazo o el color de la lnea que se dibuja. Tambin se pueden representar funciones grficamente con el comando fplot. El mismo ejemplo que en el visto con el comando plot quedara as:
x=0:0.05:10; fplot('sin(x).*exp(-0.4*x)',[0,10]) xlabel('x');ylabel('y')

En este caso el primer argumento es la funcin que se desea representar, y el segundo el rango de valores para los que se quiere representar la funcin. La funcin a representar debe ir entre comillas. El comando clf borra todo el contenido de la figura, mientras que el comando cla borra las curvas representadas y redibuja los ejes. Se puede aadir una rejilla con el comando grid. Si la magnitud representada en alguno de los ejes de coordenadas necesitara de una escala logartmica, sera posible su representacin con los comandos loglog y semilog en lugar del plot. Tambin es posible hacer una representacin de la funcin en coordenadas polares con el comando polar.

Para representar ms de una curva en un slo grfico, basta con poner sucesivamente todas las funciones que se quieren representar. Por ejemplo, para representar el seno y el coseno en una misma grfica:
x = 0:0.05:5; y = sin(x); z = cos(x); plot(x,y,x,z)

Hay que sealar que las unidades de las funciones trigonomtricas vienen expresadas en radianes, pero los grficos manejan grados. El comando hold on permite el trazado de nuevas curvas manteniendo el contenido del grfico. Este comando tiene un efecto global, y todo nuevo grfico que se cree se dibujar sobre la figura ya existente. Para desactivar esta caracterstica y posibilitar la creacin de nuevas figuras, se utiliza el comando hold off. El siguiente ejemplo utiliza este comando para aadir una nueva curva al grfico. El resultado aparece en la figura 2.
x = 0:0.05:5; y = sin(x); plot(x,y); hold on z = cos(x); plot(x,z,'--') xlabel('x');ylabel('y(-) y z(--)');

Figura 2: Ejemplo de representacin de dos curvas en una sola figura

Otros comandos que permiten informacin adicional en el grfico son el comando title, que aade una etiqueta en la parte superior del grfico, el comando text, que escribe un rtulo en una determinada posicin del grfico, y el comando gtext, que permite la misma accin que el text, pero situndolo manualmente con la ayuda del ratn. Si fuera necesario utilizar ms de un grfico, el comando figure abre una ventana por cada aparicin del mismo. Si se quiere volver a dibujar en alguno de los

grficos definidos previamente, por ejemplo el n basta con activarlo con escribir figure(n). Con el comando close all se eliminan todos los grficos. El comando subplot(m,n,k) crea una matriz de m por n curvas en un slo grfico y dibuja en el situado en la posicin k-sima. Para calcular la posicin, se empieza a contar por filas y despus por columnas desde la esquina superior izquierda de la figura. El siguiente ejemplo produce el grfico de la figura 3.
clear;clf t=0:.3:30; subplot(2,2,1), plot(t,sin(t)),title('SUBPLOT 2,2,1') xlabel('t'); ylabel('sin(t)') subplot(2,2,2), plot(t,t.*sin(t)),title('SUBPLOT 2,2,2') xlabel('t'); ylabel('t.*sin(t)') subplot(2,2,3), plot(t,t.*sin(t).^2),title('SUBPLOT 2,2,3') xlabel('t'); ylabel('t.*sin(t).^2') subplot(2,2,4), plot(t,t.^2.*sin(t).^2),title('SUBPLOT 2,2,4') xlabel('t'); ylabel('t.^2.*sin(t).^2')

Figura 3: Ejemplo de la utilizacin del comando subplot

Finalmente, mencionar que para dibujar grficos con 3 ejes de coordenadas existe el comando plot3.

7. Definicin de nuevos comandos


La ejecucin de los comandos en una ventana es adecuado solamente si la cantidad de texto a teclear es pequea o si se quiere hacer alguna prueba de manera interactiva. Cuando la extensin de los comandos involucrados abarca unas cuantas lneas, es ms recomendable escribir un fichero .M, tambin denominado script. Cuando se ejecuta un script, los comandos del fichero no se visualizan en pantalla. Si se desea activar la visualizacin de los comandos ejecutados, basta con incluir el comando echo on. Para desactivarlo nuevamente habra que incluir echo off. El formato de estos ficheros puede ser simplemente un conjunto de comandos que se ejecutan segn una determinada secuencia, o bien seguir un planteamiento idntico a la definicin de funciones y subprogramas de los lenguajes de programacin clsicos. En este caso, habra que introducir una cabecera donde se utiliza la palabra reservada function junto con el identificador correspondiente a la nueva funcin que se est definiendo y los argumentos de entrada y de salida de la funcin. Veamos un ejemplo para ilustrar esta idea. Se va a definir una funcin que devuelve un solo valor: f ( x) = 2 x 3 + 7 x 2 + 3x 1 x 2 3 x + 5e x

Si el fichero lo denominamos ejemf.m, el contenido del mismo sera:


function y = ejemf(x) y = (2*x.^3+7*x.^2+3*x-1)./(x.^2-3*x+5*exp(-x));

Hay que advertir que el nombre del fichero .M es el mismo que el identificador de la funcin que aparece en el lado derecho de la cabecera. El operador de potenciacin utilizado es el .^, por lo que se puede pasar indistintamente como argumento un escalar o un vector. Una vez que se ha creado el fichero ejemf.m, ya se puede utilizar en la definicin de nuevos comandos. El comando ejemf(3) produce como resultado
y = 502.1384

Si el argumento fuera una matriz, por ejemplo ejemf([3,1;0,-1])el resultado sera tambin una matriz gracias a la utilizacin del operador .^:
ans = 502.1384 -0.2000 -68.4920 0.0568

Para definir ms de un argumento de salida hay que definir un vector en el lado izquierdo de la cabecera de la funcin. Por ejemplo:
function [media,devstd] = media_devstd(x) n=length(x); media = sum(x)/n; devstd = sqrt(sum(x.^2)/n - media.^2);

Si estos comandos se han escrito en el fichero media_devstd.m, al invocar el comando media_devstd con el argumento.
x = [1 5 3 4 6 5 8 9 2 4]; [m, s] = media_devstd(x)

genera
m = 4.70000 s = 2.3685

Tambin se puede utilizar como argumento otro comando ya existente gracias al comando feval. Por ejemplo, sea la funcin

f av =

f(a) + 2f(b) + f(c) 4

donde f(x) es la funcin que se pasa como argumento. El script f_av.m define la funcin anterior:
function wa = f_av(f_name, a, b, c) wa = (feval(f_name,a) + 2*feval(f_name,b) ... + feval(f_name,c))/4; f_name es una variable de tipo string que representa el nombre de la funcin f(x). Si f(x) es la funcin ejemf, definida anteriormente, y=feval('ejemf',x) equivale a y=ejemf(x). La llamada a la funcin z=f_av('ejemf', 1, 2, 3) dara como resultado 89.8976.

MATLAB incorpora un editor de comandos, edit, que realiza tambin tareas de depuracin mediante la definicin de puntos de control en la secuencia de ejecucin del comando que se est editando. Una relacin de comandos ms habituales en las aplicaciones de ingeniera de control con MATLAB se muestra en la siguiente tabla:
Nombre del comando
abs angle ans atan axis c2d clear cla clf close conj conv corrcoef cos

Descripcin Valor absoluto, magnitud compleja Fase o ngulo en radianes Respuesta cuando no se asigna expresin Arco tangente Controla la apariencia y escala de los ejes de coordenadas Conversin de tiempo continuo a tiempo discreto Libera memoria eliminando variables y comandos Borra el contenido de una figura y borra los ejes Borra el contenido de una figura Cierra ventanas donde se han representado grficas Complejo conjugado Convolucin Coeficientes de correlacin Coseno 10

cosh cov decov det diag echo edit eig exit exp expm eye feval figure filter format fplot grid gtext hold i imag inf inv j length linspace log loglog logm logspace log10 max mean median min NaN nyquist ones pi plot plot3 polar poly polyfit polyval polyvalm

Coseno hiperblico Matriz de covarianza Deconvolucin Determinante Matriz diagonal Visualizacin de los comandos de un script Invoca el editor y el depurador de comandos de MATLAB Autovalores y autovectores Salir de MATLAB Funcin exponencial Matriz exponencial Matriz identidad Ejecuta el comando representado por la cadena de caracteres que se pasa como argumento Genera una ventana para dibujar un grfico Operacin de filtrado Formato de salida de los clculos Representacin grfica de funciones Lneas de rejilla Colocacin de una etiqueta en un grfico con ayuda del ratn Conserva el contenido del grfico actual Raz de 1 Parte imaginaria de un nmero complejo Infinito Matriz inversa Idem i Longitud del vector Generacin de un vector espaciado linealmente Logaritmo natural Grfica con ambos ejes representados en escala logartmica Logaritmo matricial Generacin de un vector espaciado logartmicamente Logaritmo en base 10 Valor mximo Valor medio Mediana Valor mnimo No es un valor numrico Respuesta en frecuencia del diagrama de Nyquist Genera un vector o matriz constante de unos Nmero Dibuja un grfico con los ejes en escala lineal Dibuja un grfico con 3 ejes de coordenadas en escala lineal Idem en coordenadas polares Polinomio caracterstico Ajuste polinomial Evala el valor de un polinomio en un punto Idem respecto a una matriz 11

prod quit rand rank real rem residue rlocus roots semilogx semilogy sign sin sinh size sqrt sqrtm ss2tf ss2zp std step subplot sum tan tanh text title trace who xlabel ylabel zeros

Producto de los elementos de un vector Abandonar el programa Generacin de nmeros aleatorios Calcula el rango de una matriz Parte real de un nmero complejo Resto o mdulo Clculo de los residuos de una divisin entre polinomios Diagrama del lugar de las races Calcula las races de un polinomio Grfica con el eje x representado en escala logartmica Grfica con el eje y representado en escala logartmica Funcin signo Funcin seno Seno hiperblico Dimensin de una matriz Raz cuadrada Raz cuadrada matricial Conversin desde el espacio de estados a la funcin de transferencia Conversin desde el espacio de estados a la representacin basada en ceros y en los polos Desviacin estndar Funcin escaln Representacin de varias grficas dentro de una misma ventana Suma de los elementos de un vector Tangente Tangente hiperblica Etiqueta textual en un grfico Ttulo de un grfico Traza de una matriz Visualiza las variables definidas Etiqueta del eje x Etiqueta del eje y Genera un vector o matriz nula

8. Image Processing Toolbox


La toolbox de procesamiento de imgenes es una coleccin de funciones que extienden la capacidad del entorno de desarrollo numrico de MATLAB. Esta librera soporta un amplio rango de operaciones de procesamiento de imgenes, incluyendo: Transformaciones espaciales de imagen Operaciones morfolgicas Operaciones de bloques y vecinos Diseo de filtros y filtrados lineales Transformadas en el dominio de la frecuencia Anlisis de imagen y realzado Operaciones sobre regiones de inters

12

Muchas de las funciones de la toolbox de procesamiento de imgenes son ficheros-M de MATLAB y por tanto podremos ver el contenido de estos cdigos utilizando la llamada:
type nombre_de_la_funcin(parmetros)

Podemos extender las capacidades de la librera escribiendo nuestros propios ficheros-M, o usando la toolbox en combinacin con otras toolboxes, como la de Procesamiento de la Seal o la de Wavelets. La toolbox de procesamiento de imgenes posee unas tiles demostraciones de anlisis y procesamiento de imagen. Estas demos estn localizadas en el subdirectorio: matlabroot\toolbox\images\imdemos donde matlabroot representa el directorio raz de la instalacin de MATLAB. Para ver una de las demos desde el entorno MATLAB podemos llamar a la funcin demo desde el prompt para abrir un interfaz grfico donde elegir la deseada o bien acceder directamente a ella invocndola desde la lnea de comandos.
Nombre de la demo
dctdemo edgedemo firdemo ipss001 ipss02 ipss003 nrfiltdemo qtdemo roidemo

Breve Descripcin Compresin de imagen mediante DCT Deteccin de bordes Filtros FIR Connected components labelling Lgica basada en caractersticas Correccin de iluminacin no uniforme en una imagen Reduccin de ruido usando filtros lineales y no-lineales Descomposicin de rbol cuaternario (Quadtree) Seleccin de ROIs

Para leer un archivo grfico y mostrarlo en pantalla podemos usar las funciones
imread e imshow. I=imread(pout.tif); imshow(I)

13

Podemos chequear la imagen en memoria escribiendo como ya hemos visto


whos con lo que la salida ser: Name Size Bytes I 291x240 69840 Grand total is 69840 elements using 69840 bytes Class uint8 array

La funcin imread ha reconocido el fichero pout.tif como un archivo de formato TIFF vlido y lo ha guardado en la variable I. La funcin imread puede actuar sobre muchos formatos tpicos de imgenes, por lo que se recomienda su consulta mediante la ayuda en lnea help imread. Las funciones imread y imshow leen y muestran las imgenes en MATLAB. Existen varias formas de mostrar una imagen aunque recomendamos el uso de imshow por dar ms funcionalidad con los formatos grficos en MATLAB. Si pout.tif hubiese sido una imagen indexada, la sintaxis apropiada para imread habra sido:
[X,map]=imread(pout.tif);

Siguiendo con el caso anterior, y una vez guardada la imagen en la variable I podramos realizar una ecualizacin del histograma. Mediante la funcin imhist mostraremos el histograma de la imagen que le pasemos como argumento. Si quisiramos conservar la imagen que mostramos en pantalla mediante la funcin imshow haremos una llamada a figure de la siguiente manera:
figure, imhist(I) %Histograma de I en una nueva figura

Si lo hacemos veremos que el rango de intensidades (eje de abscisas) de la imagen es muy estrecho no cubriendo tanto los valores altos como los bajos y perdiendo por tanto contraste. Podemos llamar a la funcin histeq para expandir el histograma y aportando una mejora en el contraste de I gracias al autoajuste que realiza.
I2=histeq(I); %Ecualiza I y le da salida en el array I2

Podemos comprobar la mejora en contraste de la imagen con la funcin imshow(I2), y llamando a la funcin imhist(I2) comprobaremos que ahora el histograma se extiende por todo el rango de valores de intensidad. Una nota aclaratoria en cuanto al uso de imhist es que la forma de distribuir los valores de intensidad de los pxeles a lo largo de su eje de abscisas es que lo har ajustndose al rango de valores de la clase (o class) de la variable que la contenga, siendo para una clase uint8 [0,255], para una uint16 [0,65535] y para una double [0,1]. Para obtener ms control sobre el ajuste de contraste de una imagen podemos utilizar la funcin imadjust que veremos ms adelante. Una funcin bsica en el tratamiento de imgenes es el de poder grabar la imagen una vez procesada. Esto se hace mediante la funcin imwrite.
imwrite(I2,pout.png);

MATLAB reconoce la extensin png como un formato grfico vlido y escribe la imagen almacenada en I2 al disco. Lo har como una imagen de 8-bit por defecto porque en su momento la guardamos como uint8 en memoria. Si I2 se hubiera sido un array de tipo RGB y clase uint8, se habra grabado a disco como imagen de 14

24bpp. Incluso si queremos especificar explcitamente la resolucin podremos usar el parmetro BitDepth con imwrite. Por ejemplo:
imwrite(I2,pout.png,BitDepth,4);

Notar que no todos los formatos de salida soportan las mismas resoluciones por lo que se recomienda leer la ayuda de la funcin imwrite para consultar la lista de bit depths vlida para cada formato. Una vez grabada la imagen podemos chequear las propiedades de esta imagen mediante la funcin imfinfo. Por ejemplo:
imfinfo(pout2.png) ans= Filename:pout2.png FileModDate:03-Jun-1999 15:50:25 FileSize:36938 Format:png FormatVersion:[] Width:240 Height:291 BitDepth:8 ColorType:grayscale ...

La llamada a la funcin leer y mostrar todos los campos de la cabecera del formato del fichero pasado como argumento a la funcin imfinfo. Estos campos son modificables utilizando los parmetros correspondientes a la hora de salvar el fichero con imwrite, como vimos anteriormente. Podemos, con otro ejemplo, adentrarnos con ms profundidad en las posibilidades de las funciones de la Image Processing Toolbox de MATLAB. Borremos todas las variables del espacio de trabajo de MATLAB para abrir, y guardar en la variable I, la imagen rice.tif.
clear, close all I=imread(rice.tif); imshow(I)

Podemos ahora intentar contar el nmero de objetos mediante una simple umbralizacin con la funcin im2bw, que produce una imagen binaria, que aplicando un etiquetado de componentes conexas podremos extraer, al menos, una aproximacin al nmero de objetos presentes en la imagen.

15

BW=im2bw(I,0.5); [A,B]=bwlabel(BW,4); B B= 83

A la funcin bwlabel se le pasa la matriz que contiene la imagen y la conectividad (4 u 8). En el ejemplo, A contendr la imagen y B el nmero de componentes conexas. Una funcin que puede resultar de utilidad es la de imcrop, que realiza un recorte sobre la imagen de forma interactiva. Una vez hecha la llamada, aparecer la imagen como si hubisemos invocado a la funcin imshow pero en este caso el cursor aparecer en forma de cruz para seleccionar una porcin de la imagen y as recortarla.
recorte=imcrop(A);

La seleccin de la imagen recortada ser asignada a la variable recorte que podr ser tratada como si fuese una nueva imagen. Esta funcin se puede utilizar con un segundo parmetro: un vector, que indique las dimensiones de recorte, como por ejemplo:
rect=[15 25 10 10]; roi=imcrop(A,rect);

En este ejemplo se especifican las coordenadas de la esquina superior izquierda (15,25) y la anchura y altura respectivamente.

9. Referencias
[1] D.M. Etter, Solucin de Problemas de Ingeniera con Matlab, 2 Edicin, Prentice Hall, 1997. [2] S. Nakamura: Numerical Analysis and Graphic Visualization with MATLAB, Prentice Hall, 1996. [3] Apuntes de la Image Processing Toolbox de MATLAB de la asignatura de Visin Artificial.

16

Potrebbero piacerti anche