Autores: Gonzalo Luzardo, Vanessa Cedeo y Javier Tibau
Una imagen digital es una representacin bidimensional de una imagen a partir de una matriz numrica de puntos de color. Cada elemento de la matriz representa lo que se denomina un pxel de la imagen. A las imgenes digitales se las suele caracterizar por su altura y anchura en pixeles y por su profundidad de color (bits para representar el color), que determina el nmero de colores distintos que se pueden almacenar en cada pixel, y por lo tanto, en gran medida, la calidad del color de la imagen. Cada pixel representa un punto de color en la imagen en un formato especfico, ya sea en niveles de gris o de color en formato RGB donde cada pixel es representado por una tripleta de nmeros que representa un color. Las siguientes grficas ilustran dos imgenes, la primera de ellas en escala de grises y la segunda a colores, en la cual podemos observar la representacin numrica de cada pixel en una porcin de la imagen.
Como se puede apreciar en la imagen en escala de grises, cada pixel est representado por un nmero que indica el nivel de gris presente en esa posicin de la imagen. Por otro lado, en la imagen a colores, cada pixel est representado por su tripleta RGB, que representa el color en formato RGB presente en esa posicin de la imagen. En esta tarea van a trabajar con imgenes en escala de grises; en donde cada elemento de la matriz de datos almacena un valor entero que va de 0 a 255, el cual representa el nivel de gris presente en dicha posicin de la imagen, siendo 0 el nivel ms oscuro y 255 el ms claro. Lectura de imgenes digitales en SciLab Para leer imgenes digitales, SciLab posee herramienta especial llamada SciLab Image and Video Processing toolbox (http://siptoolbox.sourceforge.net/), que no viene instalada por defecto. Para instalarla siga los siguientes pasos: 1. En SciLab abra el Administrador de mdulos ATOMS en Applications/Administrador de mdulos ATOMS.
2. En el Administrador de mdulos ATOMS, seleccione la categora Image Processing.
3. Seleccione SciLab Image and Video Processing toolbox y presione el botn Instalar
4. Espere mientras se finaliza la instalacin y luego cierre y abra nuevamente SciLab. Una vez instalado el SciLab Image and Video Processing toolbox puede utilizar todos los comandos que permiten trabajar con imgenes digitales. Para leer una imagen digital y extraer su informacin matricial utilice el comando imread('ruta_de_la_imagen'). Por ejemplo, para leer la informacin de la imagen en escala de grises lenagray.png, primero cambie el directorio de trabajo actual (File/Cambiar directorio actual) a la carpeta donde contiene la imagen a ser leda y luego ejecute en consola el siguiente cdigo. -->imagen = imread('lenagray.bmp'); (No olvide colocar el ; si no quiere ver todo el contenido de la matriz en pantalla) Puede visualizar en la ventana grfica de SciLab una imagen leda con el comando imshow(imagen).Por ejemplo para visualizar la imagen leda anteriormente, ejecute el siguiente cdigo: -->imshow(imagen); As mismo, puede revisar el contenido de cada elemento de la matriz conociendo su ubicacin fila x columna en la matriz. Por ejemplo, para leer la informacin del pixel en la posicin 100x164 de la imagen, ejecute en consola el siguiente cdigo: -->imagen(100,164) ans = 176 Llene la siguiente tabla con los valores correspondientes a los niveles de gris almacenados en la porcin definida de la imagen leda: COLUMNA POSICIN 164 165 166 167 168 F I L A
Existen dos tipos de imgenes con las que SciLab puede trabajar: escala de grises y a colores. SciLab lee el contenido de la imagen y extrae una matriz de pixeles numrica de dos dimensiones, la cual coincide con el alto y ancho de la imagen leda. Cada elemento fila x columna de la matriz representa un pixel, y en particular en las de escala de grises, su valor es un entero de 8 bits sin signo (uint8) y representa el nivel de gris presente en dicha posicin que puede tomar un valor de 0 (negro) a 255 (blanco) como mximo. En s, para SciLab esta matriz representa la imagen digital leda.
Manipulaciones bsicas de una imagen digital con SciLab La manipulacin de una imagen digital se la realiza mediante manipulaciones en su matriz de pixeles, por ejemplo, para rotar la imagen 90 grados debe realizar la transpuesta de la matriz. Pruebe el siguiente ejemplo que muestra la imagen anterior rotada. -->imrotada=imagen'; imshow(imrotada); Ya que las imgenes son matrices, podemos realizar operaciones como sumas y restas de imagenes. Considere las siguientes imgenes:
lenagray.bmp lenagraynoface.bmp espol.bmp Escriba el cdigo en SciLab que permita obtener los resultados deseados: Cdigo SciLab Resultado esperado
TIP: Considere el hecho de que cada valor del pixel de la imagen no puede sobrepasar de 255
TIP: Oscurecer una imagen es disminuir el valor de cada pixel por un factor
Otra operacin que se puede realizar con matrices es la extraccin de una sub-matriz y la concatenacin de matrices. Por ejemplo, note que en la imagen, la seccin del rostro se encuentra entre las filas 103 a 193 y columnas 102 a 180:
Escriba el cdigo necesario que permita crear las siguientes imgenes: Imagen Cdigo:
//Extraiga la submatriz correspondiente y luego concatene //para crear la imagen final solicitada
//Extraiga la submatriz correspondiente, cree una nueva //matriz procesando esta submatriz y luego concatene las //matrices correspondientes para crear la imagen final //solicitada
Un aspecto interesante de SciLab, es que le permite crear imgenes a travs mediante la especificacin de una matriz de valores enteros de 8 bits sin signo. Por ejemplo, el siguiente cdigo: -->imgris=uint8(ones(256,256)*128);imshow(imgris); -->imwrite(imgris,'gray.bmp'); Mostrar la siguiente imagen gris:
Note la utilizacin de las instrucciones uint8() y imwrite(). Acuda a la ayuda local de SciLab (F1) o a la ayuda en lnea en http://help.scilab.org/ e investigue el funcionamiento de esa instruccin. Responda las siguientes preguntas: Qu hace la instruccin uint8() y cmo se debe utilizar (sintaxis)?
Qu hace la instruccin imwrite() y cmo se debe utilizar (sintaxis)?
Por qu debe usar esta instruccin dentro del cdigo mostrado anteriormente el cual permita crear la imagen gris?
Escriba el cdigo en SciLab que permita crear las siguientes imgenes: Cdigo Cdigo Cdigo
Ancho: 252 pixeles Alto:252 pixeles
Ancho: 252 pixeles Alto:252 pixeles
Ancho: 252 pixeles Alto:252 pixeles
Manipulaciones a nivel de pxeles Para manipular la imagen a nivel de pixeles debe manipular de forma individual los valores de los elementos de la matriz que la representa. Por ejemplo para hacer un marco blanco de un grosor de 4 pixeles que rodee el rostro de la persona que aparece en la imagen de prueba, debe cambiar el valor de dichos pixeles a 255. El siguiente cdigo realiza este procesamiento: -->imagen = imread('lenagray.bmp'); -->imagen(103:193,102:106)=255; -->imagen(103:193,180:184)=255; -->imagen(103:107,102:184)=255; -->imagen(193:197,102:184.)=255; -->imwrite(imagen,'lenaface.bmp'); -->imshow(imagen);
Pegue la imagen que se genera
La manipulacin individual de cada pxel de una imagen, por lo general, se la realiza a mediante un recorrido en la imagen utilizando dos lazos, uno para las filas y otro para las columnas: for i=1:M //filas for j=1:N //columnas //Manipulacin imagen(i,j)=procesar(imagen(i,j)); end end
La instruccin procesar() representa el procesamiento que se le har al pixel ubicado en la posicin ixj
NOTA: Por cuestiones de optimizacin se debe realizar el recorrido de una matriz fila por fila (como en el cdigo anterior) y NO columna por columna.
Un tipo de manipulacin a nivel de pixel es la denominada umbralizacin de imgenes, la cual consiste en darle el valor de 255 a un pixel cuyo valor se encuentra por encima de un umbral y 0 si se encuentra por debajo. La imagen a continuacin fue obtenida a partir de la umbralizacin de la imagen de prueba con un valor de umbral de 128, esto es, valores e pxeles por encima de este valor se fijan en 255 y por debajo en 0.
Perceptualmente esta manipulacin le aplica un efecto de caricaturizado a la imagen original. Complete el cdigo en SciLab que permita crear esta imagen. imagen = imread('lenagray.bmp'); [M N]=size(imagen); //Dimensiones de la imagen umbral=128; for i=1:M //filas for j=1:N //columnas //Manipulacin
end end imshow(imagen); imwrite(imagen,'caricatura.bmp');
Otro efecto comn en el mundo del procesamiento de imgenes es la deteccin de bordes. Una forma muy sencilla de realizarlo es generar una imagen la cual reste dos pixeles consecutivos de la misma fila, luego pasar un umbral, el cdigo para este procesamiento sera el siguiente: //Lectura de la imagen imagen = imread('figuras.bmp'); [M N]=size(imagen); bordes=uint8(zeros(M,N)); //Imagen blanca for i=1:M //filas for j=1:(N-1) //columnas //Manipulacin bordes(i,j) = abs((imagen(i,j+1)-imagen(i,j)));
end end imshow(bordes); Resultado
Como puede observar el resultado es la deteccin de bordes verticales en la imagen. Conteste las siguientes preguntas: Por qu razn el algoritmo puede detectar los bordes verticales?
Escriba un algoritmo para detectar los bordes horizontales
Considere la imagen espol2.bmp. Escriba un algoritmo que permita obtener los bordes horizontales y verticales de la imagen tal y como se muestra en el resultado esperado.
TIP: La imagen del resultado esperado es la suma de la imagen de la deteccin de borde vertical mas la de deteccin de borde horizontal
Conclusiones Escriba las conclusiones relacionadas al trabajo que ha realizado.