Imagenes

10
Apéndice E Tratamiento de imágenes en MATLAB E.1. Lectura de una imagen MATLAB puede leer imágenes almacenadas mediante la función «imread ». Los tipos de imágenes que pueden cargarse son .jpg, .png, .bmp, .raw. Por ejemplo el código 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 leída la imagen hay que mostrarla en pantalla, para ello se recurre a la función «imshow ». El código de la gura E.1 ilustra como se hace. Se debe tener cuidado con la función «imshow » ya que si la imagen es demasiado grande para ser mostrada en pantalla, la función la ltra y submuestrea hasta dejarla en dimensiones manejables. E.2. Obteniendo información de la imagen Si se desea obtener información de la imagen como sus dimensiones, el tipo de dato y el tamaño en bytes, se puede recurrir a las funciones «size» y «whos». El ejemplo siguiente ilustra el resultado de emplear la función «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 código siguiente ilustra el uso de la función «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

description

matlab

Transcript of Imagenes

  • Apndice 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. Porejemplo el cdigo siguiente permite la carga de una imagen en una variable deMATLAB.

    >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 recurrea la funcin imshow. El cdigo de la figura E.1 ilustra como se hace. Se debetener cuidado con la funcin imshow ya que si la imagen es demasiado grandepara ser mostrada en pantalla, la funcin la filtra y submuestrea hasta dejarlaen dimensiones manejables.

    E.2. Obteniendo informacin de la imagen

    Si se desea obtener informacin de la imagen como sus dimensiones, el tipode 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 contieneindexadas tres matrices, una matriz por cada mapa de color. As, el cdigosiguiente ilustra el uso de la funcin size para obtener las dimensiones de lavariable que almacena la imagen.

    >f=imread(frissellBW.png); %Lectura de la imagen

    >[M,N]=size(f)

    313

  • 314 APNDICE E. TRATAMIENTO DE IMGENES EN MATLAB

    f=imread(frissellBW.png);

    figure(1)

    imshow(f)

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

    ans =

    520x446x3

    Note que las dimensiones devueltas son 520 446 3, esto es, son tresplanos, cada plano representa a un color, ya sea, rojo, verde o azul. Cada planose maneja como una matriz de 520 renglones por 446 columnas.

    Si se desea ms informacin como la cantidad de bytes de almancenamientorequerido y el tipo de dato, se usa la funcin whos. El cdigo siguiente ilustrael 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 dimen-siones de variable y el tipo de dato que es entero sin signo de 8 bits. Esto ltimoimplica que los grises van de 0 a 255.

  • E.3. FUNCIONES PARA CAMBIO DE ESPACIO DE COLOR 315

    Funciones MATLAB Ejemplo: RGB a YUV

    rgb2lab lab2rgbrgb2ntsc ntsc2rgbrgb2xyz xyz2rgb

    rgb2ycbcr ycbcr2rgbrgb2gray 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 mues-tran en tabla del cuadro E.1.

    E.4. Conversin RGB a YUV

    Comienza convirtiendo la imagen desde su modelo de color RGB a otrollamado YUV YCbCr. Este espacio de color es similar al que usan los sistemasde color para televisin PAL y NTSC, pero es mucho ms parecido al sistemade televisin MAC (Componentes Analgicas Multiplexadas).

    Este espacio de color YUV tiene tres componentes:

    La componente Y, o luminancia (informacin de brillo); es decir, la imagenen escala de grises.

    La componente U o Cb que es la diferencia del azul, es decir se relativizala imagen entre azul y rojo.

    La componente V o Cr que la diferencia del rojo, es decir, se relativiza laimagen entre verde y rojo

    La componentes U y V son mejor conocidas como crominancia o informacinde color.

    Las ecuaciones que realizan este cambio de base de RGB a YUV son lassiguientes:

    Y = 0.257R + 0.504G + 0.098B + 16U = 0.148R 0.291G + 0.439B + 128V = 0.439R 0.368G 0.071B + 128

    (E.1)

    Al respecto se debe considerar que intervalo de valors para las componentesRGB es [0, 255]. Luego, obsrvese que las tres componentes toman como valormnimo el 16. El canal de luminancia (canal Y) tiene como valor mximo el235, mientras que los canales de crominancia toman un valor mximo de 240.

  • 316 APNDICE E. TRATAMIENTO DE IMGENES EN MATLAB

    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 consideraque tal redondeo introduce un pequeo margen de error imperceptible para elojo humano.

    Las ecuaciones para el cambio inverso se pueden obtener despejando de lasanteriores 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 investi-

    gacin, por lo que se pueden encontrar en libros y en la red otras ecuacionesdistintas pero con coeficientes muy parecidos.

    La figura E.2 ilustra un par de cubos con los componentes de color RGB yYUB respectivamente. El cdigo MATLAB usado para generar estas imgenesse muestra en la misma figura

    E.5. Conversin RGB a gris

    La conversin del modelo RGB a una escala de grises de blanco a negroobedece a la respuesta cromtica de los sensores en el ojo humano1 y se da

    1En el ojo huma hay aproximadamente 6 millones de receptores de color -conos- y 134millones 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 conossensores al rojo, los conos sensores al verde y los conos sensores al azul. El cdigoen 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, estafuncin 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 iniciadoMATLAB. Entonces buscamos ahora los adaptadores de video que MATLABreconoce como isntalados en la computadora: teclee en la ventana de comandosla 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 obtenerinformacin de ste: teclee la siguiente linea en la ventana de comandos la lineasiguiente:

    >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 otrosformatos 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 deltipo winvideo. Esto se hace utilizando la funcin videoinput (adaptor_name, device_id, supported_format). Donde adaptor_name es una cadena queidentifica el adaptador que se va a utilizar: matrox o winvideo. devide_ides un nmero entero que identificar al dispositivo que se va a utilizar, sup-ported_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 retornarimgenes en formato RGB mediante la siguiente lnea:

    set(vidObj,ReturnedColorSpace,rgb);

    Para visualizar la foto, abra una ventana de previsualizacion con la funcinpreview.

    preview(vidObj);

    Una vez creado el objeto de video y creado un puerto de imagen, ya se puedeempezar a realizar la captura de fotogramas. Para sto se utiliza la funcinframe=getsnapshot(vidObj), que devuelve un fotograma, es decir, una matrizde 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 gen-eracin de una mscara basada en esa zona.

    Entonces la cmara se enciende y toma una foto en el formato dado. As, siel formato elegido es RGB, entonces foto es una matriz de 320x240x3. Paravisualizar esta foto use la funcin imshow.

    imshow(foto)

    Para borrar el objeto de video, primero hay que vaciar los datos de la fotocon la funcin flushdata y luego ya se puede borrar objeto de video con lafuncin 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 unaimagen. Si la captura puede realizarse en forma controlada por algn usuario,

  • 320 APNDICE E. TRATAMIENTO DE IMGENES EN MATLAB

    entonces es posible realizar algn procesamiento sobre esa regin elegida. Lafunciones MATLAB que permite realizar esta captura son:}

    handle=impoly: Permite realizar el marcado de una regin sobre la lti-ma imagen mostrada con la funcin imshow. El marco se realiza indicandolos vrtices de un polgono no regular sobre la respectiva imagen. El pol-gono puede cerrar marcando el ltimo vrtice sobre el primero. El handlees un nmero que identifica a una estructura con el algoritmo de marcadoy la lista de vrtices capturados.

    resume(h): La funcin impoly congela al intrprete de comandos deMATLAB. Con esta funcin se reasume la ejecucin de un programa oscript.

    mascara_BW=createMask(handle): crea una imagen del mismo tamaoque la imagen original. Esta imagen solamente tiene pixeles negros -dentrodel polgono- y pixeles blancos -fuera del polgono-.

    El cdigo de la figura E.3 ilustra el proceso de captura de una regin en unaimagen en escala de grises y la generacin de la respectiva mscara. Al final delcdigo la funcin whos BW regresa el siguiente resultado.

    >whos BW

    >

    Name Size Bytes Class

    BW 1192x1611 1920312 logical

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

    E.8. Procesamiento por bloques

    En MATLAB y en particular en Image Processing Toolbox existe el con-cepto bloques distintos2 los cuales son particiones rectangulares que dividena una imagen en seciones de m por n. La caja de herramientas crea losBloques distintos superponindose en la matriz de la imagen a partir de laesquina superior izquierda, sin que se solapen. Si los bloques no se ajustan ex-actamente sobre la imagen, la caja de herramientas crea bloques distintos querebasan a la imagen y agregndoles ceros de relleno sobre los mrgenes inferiory 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 queel usuario especifica. Esta funcin debe recibir el bloque y devolver un bloquede las mismas dimensiones aunque no necesariamente dle mismo tipo de dato.Entoncesblkproc ensambla de nuevo los bloques retornados por la funcinpara recrear una imagen de salida.

    2El concepto en ingls es Distinct Blocks y puede encontrarse en https://nf.nci.org.au/fa-cilities/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 so-lapamientos de 1 por 2. Imagen provista de https://nf.nci.org.au/facilities/soft-ware/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 sesolapan unos con otros, es decir, que el usuario puede especificar renglones ycolumnas extra de pixeles fuera del bloque y cuyos valores son consideradoscuando se invoca a la funcin de procesamiento. la figura E.4 ilustra muestrauna matriz de 15 por 30 para la cual se ha elegido generar bloques distintosde 4 por 8 con un solapamiento de 1 por 2, es decir, cada bloque tiene unrengln arriba y abajo de solapamiento y 2 columnas a izquierda y derecha desopalamiento.

    Para indicar este solpamiento, el usuario debe proveer un argumento adi-cional a la funcin blkproc. Por ejemplo, para procesar los bloques en lafigura E.4 con la funcin myfunc, el usuario invoca:

    B = blkproc(A,[4 8],[1 2],@myfun)

    E.9. Otras funciones

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

  • 322 APNDICE E. TRATAMIENTO DE IMGENES EN MATLAB