Está en la página 1de 10

Apndiasdace E

Tratamiento de imgenes en
MATLAB
E.1.

Lectura de una imagen

MATLAB puede leer imgenes almacenadas mediante la funcin imread.


Los tipos de imgenes que pueden cargarse son .jpg, .png, .bmp, .raw. Por
ejemplo el cdigo siguiente permite la carga de una imagen en una variable de
MATLAB.
>f=imread(frissell.jpg);
>f=imread(d:\imagenes\frissell.jpg); % En Windows
>f=imread(/home/user/frissell.jpg); %En linux

Una vez leda la imagen hay que mostrarla en pantalla, para ello se recurre
a la funcin imshow . El cdigo de la figura E.1 ilustra como se hace. Se debe
tener cuidado con la funcin imshow ya que si la imagen es demasiado grande
para ser mostrada en pantalla, la funcin la filtra y submuestrea hasta dejarla
en dimensiones manejables.

E.2.

Obteniendo informacin de la imagen

Si se desea obtener informacin de la imagen como sus dimensiones, el tipo


de dato y el tamao en bytes, se puede recurrir a las funciones size y whos.
El ejemplo siguiente ilustra el resultado de emplear la funcin size.
Cuando se carga una imagen, MATLAB crea una variable, la cual contiene
indexadas tres matrices, una matriz por cada mapa de color. As, el cdigo
siguiente ilustra el uso de la funcin size para obtener las dimensiones de la
variable que almacena la imagen.
>f=imread(frissellBW.png); %Lectura de la imagen
>[M,N]=size(f)

313

APNDICE E. TRATAMIENTO DE IMGENES EN MATLAB

314

f=imread(frissellBW.png);
figure(1)
imshow(f)

Figura E.1: Cdigo para mostrar una imagen. La imagen es cortesia de Toni
Frissell, fotgrafa y cuyo trabajo puede ser encontrado en http://www.culturainquieta.com/es/fotografia/item/1610-toni-frissell.html.

ans =
520x446x3

Note que las dimensiones devueltas son 520 446 3, esto es, son tres
planos, cada plano representa a un color, ya sea, rojo, verde o azul. Cada plano
se maneja como una matriz de 520 renglones por 446 columnas.
Si se desea ms informacin como la cantidad de bytes de almancenamiento
requerido y el tipo de dato, se usa la funcin whos. El cdigo siguiente ilustra
el uso de esta funcin.
>f=imread(frissellBW.png); %Lectura de la imagen
>whos f
>
Name
Size
Bytes
Class
f
446x500x3
669000
uint8

Note que la funcin whos nos entrega el nombre de la variable, las dimensiones de variable y el tipo de dato que es entero sin signo de 8 bits. Esto ltimo
implica que los grises van de 0 a 255.

E.3. FUNCIONES PARA CAMBIO DE ESPACIO DE COLOR


Funciones MATLAB

rgb2lab
rgb2ntsc
rgb2xyz
rgb2ycbcr
rgb2gray

315

Ejemplo: RGB a YUV

lab2rgb
ntsc2rgb
xyz2rgb
ycbcr2rgb
lab2xyz

Cuadro E.1: Algunas funciones MATLAB para cambio entre modelos de color.

E.3.

Funciones para cambio de espacio de color

Algunas funciones de MATLAB para cambiar de formatos de color se muestran en tabla del cuadro E.1.

E.4.

Conversin RGB a YUV

Comienza convirtiendo la imagen desde su modelo de color RGB a otro


llamado YUV YCbCr. Este espacio de color es similar al que usan los sistemas
de color para televisin PAL y NTSC, pero es mucho ms parecido al sistema
de televisin MAC (Componentes Analgicas Multiplexadas).
Este espacio de color YUV tiene tres componentes:
La componente Y, o luminancia (informacin de brillo); es decir, la imagen
en escala de grises.
La componente U o Cb que es la diferencia del azul, es decir se relativiza
la imagen entre azul y rojo.
La componente V o Cr que la diferencia del rojo, es decir, se relativiza la
imagen entre verde y rojo
La componentes U y V son mejor conocidas como crominancia o informacin
de color.
Las ecuaciones que realizan este cambio de base de RGB a YUV son las
siguientes:
Y
U
V

=
=
=

0.257 R
0.148 R
0.439 R

+ 0.504 G +
0.291 G +
0.368 G

0.098 B
0.439 B
0.071 B

+ 16
+ 128
+ 128

(E.1)

Al respecto se debe considerar que intervalo de valors para las componentes


RGB es [0, 255]. Luego, obsrvese que las tres componentes toman como valor
mnimo el 16. El canal de luminancia (canal Y) tiene como valor mximo el
235, mientras que los canales de crominancia toman un valor mximo de 240.

APNDICE E. TRATAMIENTO DE IMGENES EN MATLAB

316

imagenRGB=imread(bebes-bajo-agua-11.jpg);
figure(1)
imshow(imagenRGB)
imagenYUV=rgb2ycbcr(imagenRGB);
figure(2)
imshow(imagenYUV)

Figura E.2: Esquema del modelo RGB y Esquema del modelo YUV.
Todos estos valores caben en un byte haciendo redondeo al entero ms prximo.
Durante esta fase no hay prdida significativa de informacin ya que se considera
que tal redondeo introduce un pequeo margen de error imperceptible para el
ojo humano.
Las ecuaciones para el cambio inverso se pueden obtener despejando de las
anteriores y se obtienen las siguientes:
R = 1.164 (Y 16) + 1.596 (V 128)
G = 1.164 (Y 16) 0.813 (V 128) 0.391 (U 128)
B = 1.164 (Y 16)
+ 2.018 (U 128)
(E.2)
El lector debe considerar que estas ecuaciones estn en continua investigacin, por lo que se pueden encontrar en libros y en la red otras ecuaciones
distintas pero con coeficientes muy parecidos.
La figura E.2 ilustra un par de cubos con los componentes de color RGB y
YUB respectivamente. El cdigo MATLAB usado para generar estas imgenes
se muestra en la misma figura

E.5.

Conversin RGB a gris

La conversin del modelo RGB a una escala de grises de blanco a negro


obedece a la respuesta cromtica de los sensores en el ojo humano1 y se da
1 En el ojo huma hay aproximadamente 6 millones de receptores de color -conos- y 134
millones de receptores en blanco y negro -bastones-. En total se promedian 140 millones de

E.6. CAPUTRA DE FOTOS EN MATLAB

317

mediante la frmula siguiente:


gris = 29.9 %_rojo + 58.7 %_verde + 11.4 %_azul

(E.3)

Curiosamente, esos porcentajes corresponden con los porcentajes de conos


sensores al rojo, los conos sensores al verde y los conos sensores al azul. El cdigo
en MATLAB que implementa la frmula es:
>f=imread(frissellBW.png); %Lectura de la imagen
>imagenBW=uint8(f(:,:,1)*0.299+f(:,:,2)*0.587+f(:,:,3)*0.114);
>figure (2)
>imshow(imagenBW); %Exhibicin de la imagen

Hay una funcin que simplifica el hecho de acordarse de los porcentajes, esta
funcin es rgb2gray y su uso es como sigue:
>f=imread(frissellBW.png); %Lectura de la imagen
>imagenBW=rgb2gray(f); %Conversin a grises
>figure (2)
>imshow(imagenBW); %Exhibicin de la imagen

E.6.

Caputra de fotos en MATLAB

Previamente, asegrese de conectar su webcam a la PC y de haber iniciado


MATLAB. Entonces buscamos ahora los adaptadores de video que MATLAB
reconoce como isntalados en la computadora: teclee en la ventana de comandos
la funcin imaqhwinfo.
>imaqhwinfo
ans=
InstalledAdaptors: {matrox winvideo}
MATLABVersion: 7.13 (R2011b)
ToolboxName: Image Acquisition Toolbox
ToolboxVersion: 4.2 (R2011b)

Ntese que la funcin ha detectado los adaptadores Matrox y WinVideo.


En este caso se usar el adaptador WinVideo por lo que se desea obtener
informacin de ste: teclee la siguiente linea en la ventana de comandos la linea
siguiente:
>vidInfo=imaqhwinfo(winvideo,1)
ans=
DefaultFormat: YUY2_160x120
DeviceFileSupported: 0
DeviceName: Chicony USB 2.0 Camera
DeviceID: 1
ObjectConstructor: videoinput(winvideo, 1)
SupportedFormats: {1x5 cell}
receptores.

318

APNDICE E. TRATAMIENTO DE IMGENES EN MATLAB

Note que el formato por defecto es YUY2_160X120. Veamos que otros


formatos de imagen hay en la estructura SupportedFormats.
>vidInfo.SupportedFormats
ans=
YUY2_160x120 YUY2_176x144 YUY2_320x240 YUY2_352x288 YUY2_640x480

El siguiente paso es la creacin de un objeto de video de entrada del


tipo winvideo. Esto se hace utilizando la funcin videoinput (adaptor_name
, device_id, supported_format). Donde adaptor_name es una cadena que
identifica el adaptador que se va a utilizar: matrox o winvideo. devide_id
es un nmero entero que identificar al dispositivo que se va a utilizar, supported_format es el formato de imagen deseado.
>vidObj=videoinput(winvideo,1,YUY2_320x240)
ans=
Summary of Video Input Object Using Chicony USB 2.0 Camera.
Acquisition Source(s): input1 is available.
Acquisition Parameters: input1 is the current selected source.
10 frames per trigger using the selected source.
YUY2_320x240 video data to be logged upon START.
Grabbing first of every 1 frame(s).
Log data to memory on trigger.
Trigger Parameters: 1 immediate trigger(s) on START.
Status: Waiting for START.
0 frames acquired since starting.
0 frames available for GETDATA.

Para el caso de que solamente haya formatos YUY, se puede forzar a retornar
imgenes en formato RGB mediante la siguiente lnea:
set(vidObj,ReturnedColorSpace,rgb);

Para visualizar la foto, abra una ventana de previsualizacion con la funcin


preview .
preview(vidObj);

Una vez creado el objeto de video y creado un puerto de imagen, ya se puede


empezar a realizar la captura de fotogramas. Para sto se utiliza la funcin
frame=getsnapshot(vidObj), que devuelve un fotograma, es decir, una matriz
de pixeles.
foto = getsnapshot(vidObj);

E.7. CAPTURA ITERACTIVA DE UNA REGIN POLIGONAL

319

%
%Recupera una imagen del disco
imagenRGB=imread(jane_do.jpg);
imagenBW=rgb2gray(imagenRGB);
figure(1)
imshow(imagenBW)
%Captura una regin
h=impoly; %Captura una regin
resume(h); %reasume ejecucion
%Crear la nmscara
BW = createMask(h)
figure(2)
imshow(BW)
whos BW

Figura E.3: Programa para el marco de una zona sobre una imagen y la generacin de una mscara basada en esa zona.
Entonces la cmara se enciende y toma una foto en el formato dado. As, si
el formato elegido es RGB, entonces foto es una matriz de 320x240x3. Para
visualizar esta foto use la funcin imshow .
imshow(foto)

Para borrar el objeto de video, primero hay que vaciar los datos de la foto
con la funcin flushdata y luego ya se puede borrar objeto de video con la
funcin delete.
flushdata (vidObj);
delete(vidObj);

E.7.

Captura iteractiva de una regin poligonal

Una tarea que resulta muy potente es el marcado de una regin sobre una
imagen. Si la captura puede realizarse en forma controlada por algn usuario,

APNDICE E. TRATAMIENTO DE IMGENES EN MATLAB

320

entonces es posible realizar algn procesamiento sobre esa regin elegida. La


funciones MATLAB que permite realizar esta captura son:}
handle=impoly: Permite realizar el marcado de una regin sobre la ltima imagen mostrada con la funcin imshow. El marco se realiza indicando
los vrtices de un polgono no regular sobre la respectiva imagen. El polgono puede cerrar marcando el ltimo vrtice sobre el primero. El handle
es un nmero que identifica a una estructura con el algoritmo de marcado
y la lista de vrtices capturados.
resume(h): La funcin impoly congela al intrprete de comandos de
MATLAB. Con esta funcin se reasume la ejecucin de un programa o
script.
mascara_BW=createMask(handle): crea una imagen del mismo tamao
que la imagen original. Esta imagen solamente tiene pixeles negros -dentro
del polgono- y pixeles blancos -fuera del polgono-.
El cdigo de la figura E.3 ilustra el proceso de captura de una regin en una
imagen en escala de grises y la generacin de la respectiva mscara. Al final del
cdigo la funcin whos BW regresa el siguiente resultado.
>whos BW
>
Name
BW

Size
1192x1611

Bytes
1920312

Class
logical

Ntese que el tipo de dato correspodiente a la imagen BW no es un


nmero.

E.8.

Procesamiento por bloques

En MATLAB y en particular en Image Processing Toolbox existe el concepto bloques distintos2 los cuales son particiones rectangulares que dividen
a una imagen en seciones de m por n. La caja de herramientas crea los
Bloques distintos superponindose en la matriz de la imagen a partir de la
esquina superior izquierda, sin que se solapen. Si los bloques no se ajustan exactamente sobre la imagen, la caja de herramientas crea bloques distintos que
rebasan a la imagen y agregndoles ceros de relleno sobre los mrgenes inferior
y derecho.
La funcin blkproc es la engargada de generar estos bloques distintos.
blkproc extrae, uno por uno, los bloques distintos y los pasa a una funcin que
el usuario especifica. Esta funcin debe recibir el bloque y devolver un bloque
de las mismas dimensiones aunque no necesariamente dle mismo tipo de dato.
Entoncesblkproc ensambla de nuevo los bloques retornados por la funcin
para recrear una imagen de salida.
2 El concepto en ingls es Distinct Blocks y puede encontrarse en https://nf.nci.org.au/facilities/software/Matlab/toolbox/images/block8.html

E.9. OTRAS FUNCIONES

321

Figura E.4: Imagen de 15 por 30 dividida en bloques de 4 por 8 con solapamientos de 1 por 2. Imagen provista de https://nf.nci.org.au/facilities/software/Matlab/toolbox/images/block9.html

Por ejemplo, la siguiente linea aplica la funcin dct2 a una imagen:


espectro=blkproc(imagenBW,[8,8],@dct2)

La funcin blkproc tambin permite definir bloques distintos que se


solapan unos con otros, es decir, que el usuario puede especificar renglones y
columnas extra de pixeles fuera del bloque y cuyos valores son considerados
cuando se invoca a la funcin de procesamiento. la figura E.4 ilustra muestra
una matriz de 15 por 30 para la cual se ha elegido generar bloques distintos
de 4 por 8 con un solapamiento de 1 por 2, es decir, cada bloque tiene un
rengln arriba y abajo de solapamiento y 2 columnas a izquierda y derecha de
sopalamiento.
Para indicar este solpamiento, el usuario debe proveer un argumento adicional a la funcin blkproc. Por ejemplo, para procesar los bloques en la
figura E.4 con la funcin myfunc, el usuario invoca:
B = blkproc(A,[4 8],[1 2],@myfun)

E.9.

Otras funciones

bskfun
arrayfunc: http://www.mathworks.com/help/matlab/ref/arrayfun.html

322

APNDICE E. TRATAMIENTO DE IMGENES EN MATLAB