Está en la página 1de 5

Tutorial para el uso de imágenes en Octave

Ing. Luis Vazquez

Resumen

Este artı́culo presenta los formatos y herramientas para el manejo de imágenes que usaremos
en el curso Tratamiento de Imágenes por Computadora. Las funciones y ejemplos presentados son
para Octave y han sido probados con la versión 2.1 bajo Linux, junto con las rutinas en el paquete
imag io octave.zip

1. Formatos de imagen
1.1. PNM
Este formato incluye los formatos de imagen PPM, PGM y PBM. Se utilizan para almacenar
imágenes color RGB, imágenes en escala de gris e imágenes blanco-negro respectivamente. Para cada
uno de los tres formatos hay una versión binaria y otra ASCII. En el primer caso la imagen se codifica
como una secuencia de bits y en el segundo se codifica en un archivo de texto donde se listan los valores
numéricos de cada pixel. Los archivos de PNM pueden se identificados automáticamente por un código
mágico (P[1-6]) en la cabecera de fichero (primera linea).
PBM (Portable BitMap). Almacena imágenes monocromáticas. En el formato binario se usa un
bit para cada pixel y en el ASCII cada pixel se representa con 0 o 1.
Ejemplos de encabezado PBM ASCII:
P1
#Ejemplo PBM
24 12
0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0
....
PGM (Portable GrayMap). Soporta imágenes en escala de gris. Cada pixel se representa con un
byte (P5) o con su valor en ASCII (P2).
Ejemplos de encabezado PGM ASCII:
P2
24 7
15
0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 15 0 0
....
PPM(Portable PixMap). Almacena imágenes color RGB. Se usa un byte (P6) o un número (P3)
para el valor de cada componente (rojo, verde, azul) de cada pixel. Los valores de cada pixel se
codifican intercalando las tres componentes:

R1G1B1R2G2B2, ... etc.

Ejemplos de encabezado PPM ASCII Ejemplos de encabezado PPM binario


P3
4 4 # the image width height P6
15 # maximun value 1024 788
0 0 0 0 0 0 0 0 0 15 0 15 255
0 0 0 0 15 7 0 0 0 0 0 0 ....
...

1
1.2 PNG

1.2. PNG
Su nombre significa Portable Network Graphics. Formato libre diseñado para aplicaciones en
Internet. Los datos de la imagen son almacenados usando un algoritmo de compresión sin pérdida
y con muy buenos rendimientos para una gran variedad de tipos de imágenes.
El formato PNG fue desarrollado originalmente como sustituto de otro formato más viejo y con
menos funcionalidades como es el GIF, cuando en 1995 una empresa patento este popular formato y
anuncio que los programas que implementara este formato deberı́an pagar una tasa por su uso. Sin
embargo el nuevo formato resultante superó ampliamente las capacidades de GIF ası́ como sus posibles
aplicaciones (ver http://www.libpng.org/)

1.3. JPG
Su nombre deriva de Joint Picture Format. Es un formato que usa un algoritmo para compresión
de imágenes con pérdida.
Básicamente la compresión consiste en dividir la imagen en bloques (tı́picamente 8 × 8), hacer una
transformada coseno discreta de los datos en cada bloque, seguida por la selección de los coeficientes
más significativos y la codificación de esto usando compresión estadı́stica sin perdida.
Esta diseñada para obtener buenos rendimientos (calidad/tamaño) con imágenes naturales (fotos)
y sin demasiadas transiciones abruptas (ver http://www.jpeg.org/)

2. Lectura de imágenes en Octave


En Octave las imágenes se representan como matrices. La lectura, escritura y la manipulación de
los planos RGB en imágenes color, se hace con algunas rutinas que forman parte de la distribucion
básica de Octave asi como varias rutinas extra presentes en el paquete imag io octave.zip

2.1. Instalar las rutinas de imag io octave.zip en Octave


Para usar las rutinas de manipulación de imágenes en imag io octave.zip debe bajar el archivo
de la página web del curso, crear un directorio en su HOME (por ejemplo /lib/octave/image) y
volcar los archivos presentes en el paquete dentro de este directorio.

Ejemplo:
> cd ~
> install -d lib/octave/image
> mv imag_io_octave.zip lib/octave; cd lib/octave
> unzip imag_io_octave.zip; mv imafinal/* image/
> rmdir imafinal

Por último se debe modificar la variable de ambiente LOADPATH en Octave para que incluya el
camino a estos nuevos archivos .m . Esto se puede hacer ejecutando en octave el comando:
LOADPATH = [ LOADPATH , "$HOME/lib/octave/image:"];
o copiando esa linea en el archivo de configuracion /.octaverc.

2.2. Rutinas de lectura en imag io octave


readpnm: Lee una imagen con formato PNM en Octave. Es el motor básico para la lectura de
todos los otros formatos, pues las otras rutinas de lecturas usan el programa externo convert
del paquete ImageMagick para convertirlas previamente a un archivo PNM temporal.
[Im, isPpm, maxval] = readpnm(fname)
• fname - nombre del archivo PNM (puede ser PBM, PGM o PPM).
• Im - matriz Octave con los valores de la imagen.
• isPpm - Vale 1 si la imagen es en formato PPM, 0 si es una imagen en niveles de gris.
• maxVal - Valor máximo en la matriz con la imagen.

2
En el caso de una imagen RGB (isPpm=1) si la imagen es de tamaño N × M obtendremos en Im
una matriz con N filas y 3 × M cuyas columnas corresponden a los valores de rojo, verde y azul
de manera intercalada.
readpng: Lee una imagen con formato PNG (necesita ImageMagick).
readjpg: Lee una imagen con formato JPG (necesita ImageMagick).
splitppm: descompone una matriz cuyas columnas contiene los valores intercalados de rojo, verde
y azul en las 3 matrices Red, Green y Azul.
[Red Green Blue] = splitppm(Im)
• Im - matriz Octave con valore RGB intercalados por columnas (tipo PPM).
• Red - componente de rojo.
• Green - componente de verde.
• Azul - componente de azul.

3. Desplegando imágenes en Octave


3.1. Funciones para desplegar imágenes escalares
Estas funciones permiten desplegar una imagen dada por una matriz de valores escalares. Para eso
utilizan un mapa de colores o colormap que define la correspondencia entre los valores de cada pixel
en la imagen y el color que será desplegado.

map=colormap ( cmap ): Instala cmap como nuevo mapa de colores. El colormap cmap debe ser
una matriz de N filas por 3 columnas(R,G,B), siendo N el número de colores en el mapa. En
cada fila se guarda un color con sus valores de intensidad de rojo, verde y azul respectivamente;
codificados por un número entre 0 y 1.
Si se ejecuta colormap ("default") esta función reinicializa al mapa de colores por defecto, que
un mapa en escala de grises con 64 colores.
La función devuelve el nuevo mapa de colores instalado.
cmap=gray(N)): Construye un mapa de colores en escala de grises con el numero de niveles
especificado (N).
cmap=ocean(N)): Construye un mapa de colores con N entradas en tonalidades acuáticas
(variaciones de azules).
cmap=hot(N)): Construye un mapa de colores con N entradas en tonalidades calientes (variaciones
de rojo y amarillo). Es una modificación de la función ocean agregada a Octave por docentes del
curso(1 ).
cmap=hsv(N)): Construye un mapa de colores con N entradas que varı́an sobre los colores
saturados del arco-iris comenzando y terminando en rojo. Agregada a Octave por docentes del
curso (1 ).
image( Im, Zoom): despliega la matriz como una imagen color usando el colormap actual. Los
elementos de la matriz imagen IM deben ser valores entre 1 y la longitud del colormap. Los
valores que estén por debajo de 1 o por encima del número de entradas en el mapa de colores N
se truncan a estos valores antes de desplegar la imagen.
La variable opcional Zoom permite especificar una escala de zoom antes de mostrar la imagen.
Su valor por defecto es 1.
imagesc( Im, Zoom):
Totalmente análoga a la función image solo que en este caso se aplica un cambio de escala a los
valores en la matriz Im de modo que sus valores caen en todo el rango del mapa de colores actual.

(N − 1) ¡ ¢
Imsc = 1 + ∗ Im − min(Im)
(max(Im) − min(Im))
1
Las funciones hot y hsv se definen en los archivos .m que se encuentran en la página del curso dentro de mapascolor.tgz.
Estos archivos deben copiarse en el mismo directorio donde se puso imag io octave.zip

3
3.2 Funciones para desplegar imágenes color RGB

3.2. Funciones para desplegar imágenes color RGB


imshow (R, G, B): Muestra una imagen color a partir de sus componentes RGB. Se deben pasar
las tres matrices R, G, B con valores entre 0 y 1 representando las intensidades de rojo, verde y
azul respectivamente.
Esta función construye e instala su propio mapa de colores (además lo hace de una manera
bastante poco eficiente) a partir de los valores en las 3 matrices.
Ejemplo:
[Im,isPpm, mval]=readpnm("lupin.ppm"); ## leemos imagen
[R,G,B]=splitppm(Im); ## separamos en componentes
imshow(R/255,G/255,B/255); ## mostramos imagen color (RGB)

4. Salvando imágenes en archivos


La forma más simple de guardar una imagen desde octave es usar el comando save para salvar
en un archivo “.dat” la matriz que representa a la imagen y (opcionalmente) el mapa de colores.
Estos datos se pueden recuperar luego con la función load
Ejemplo:
save -binary ‘‘datoImagen.dat’’ Im cmap
......
load ‘‘datoImagen.dat’’
Por otro lado Octave proporciona una función especifica para guardar imágenes en su formato
propio (“img”) ası́ como en formato “ppm” usando el mapa de colores actual.

saveimage (fileName, Im, format, cmap)


• filename - Es el nombre de archivo con que se guardara la imagen.
• Im - Matriz escalar con la imagen. Los valores de esta matriz se consideran como ı́ndices en
el mapa de colores (ver image).
• format - Es un string cuyos posibles valores son:
img Usa el formato imagen de Octave y guarda también el mapa de colores en el archivo.
ppm Guarda la imagen en formato PPM. Si el mapa de colores solo tiene 2 valores y estos
son negro ([0,0,0]) y negro ([0,0,0]) usa el subformato bitmap pbm; si el mapa de
colores tiene las 3 columnas iguales (mapa de grises) utiliza el subformato pgm y sino
usa el formato de color RGB ppm (ver ??)
• cmap - Parámetro opcional que permite especificar un colormap distinto al instalado.
Por último en el paquete imag io octave.zip se agregan otras funciones especializadas que
permiten salvar imágenes en formato PNM, tanto en niveles de gris para el caso escalar (pgm)
como en color combinando las 3 componentes RGB (ppm). Estas funciones pueden considerarse
como las inversas a las presentadas en la sección ??.
• writepgm: Permite salvar una imagen con niveles de gris en formato pgm.
writepgm(fname, Im [, scale=1])
◦ fname - Nombre del archivo a crear.
◦ Im - Matriz con la imagen a escribir en el archivo.
◦ scale - Opcional. Indica con 1 si queremos escalar los valores entre 0 − 255 y con 0 sino.
• writeppm: Salva una imagen color en formato ppm.
writeppm(fname, Im[, scale=1])
◦ fname - Nombre del archivo a crear.
◦ Im - Matriz con la imagen a escribir en el archivo. La columnas deber representar las
componentes R, G, B de manera intercalada, análogamente a como se obtienen con
readpnm. Esta matriz se construye fácilmente con la función mergeppm.
◦ scale - Opcional. Igual que antes indica si queremos escalar los valores de la imagen
entre 0 y 255 antes de guardarla en el archivo.
• mergeppm: Función utilitaria, permite combinar 3 matrices R, G y B del mismo tamaño en
una matriz con las componentes intercaladas por columnas.

4
Im = mergeppm(R, G, B)
◦ Im - matriz con los valores RGB entrelazados (en estilo PPM).
◦ R,G,B - 3 matrices iguales con las componentes rojo, verde y azul de la imagen.
Ejemplo: Leer una image color RGB, intercambiar sus componentes y salvarla con otro nombre.
[Im,isPpm, mval]=readpnm("lupin.ppm");
[R,G,B]=splitppm(Im); # separamos en componentes
clear Im;
Ima=mergeppm(B,R,G); # rearmamos intercambiando (BRG) los colores con mergeppm
disp("Finalmente la escribimos al disco como salad.ppm con los nuevos colores!")
writeppm(’salad.ppm’, Ima, 0); # Escribimos al disco con los nuevos colores!"
disp("Abra la imagen con ImageMagick, GImp, Photoshop o lo que sea");

También podría gustarte