Está en la página 1de 2

Ejercicios de programación con matrices

En este boletín se plantean una serie de ejercicios de manipulación de imágenes en


escala de grises.

Habitualmente, cuando una imagen se carga en la memoria del ordenador, la imagen se


almacena en una matriz en la que cada elemento de la misma representa un píxel de la
imagen. En el caso de una imagen en escala de grises, cada elemento de la
matriz almacenaría valores entre 0 y 255, de modo que el valor 0 representaría el negro,
el 255
el blanco, y cualquier otro valor intermedio un gris de mayor o menor intensidad
en función de dicho valor.

Para poder probar con imágenes reales los ejercicios que se plantean y comprobar
el resultado obtenido, se da el código de dos funciones, una para leer imágenes (cargarlas
de disco y almacenarlas en memoria en una matriz) y otra para guardarlas en disco.

Los prototipos de estas dos funciones son:

int leer_imagen( char nombre_fichero[],


int imagen[][MAX_ANCHO],
int *ancho, int *alto);

guardar_imagen( char nombre_fichero[],


int imagen[][MAX_ANCHO],
int ancho, int alto);

Ambas funciones trabajan con imágenes en formato pgm (Portable Gray Map). Para
visualizar este tipo de imágenes en el entorno Linux puede utilizarse la aplicación xv.
En el caso de trabajar con Windows puede utilizarse el programa gratuito IrfanView, el
cual puede descargarse de la dirección http://www.iti.upv.es/~rllobet/prg

La función leer_imagen recibe como parámetros el nombre del fichero que contiene la
imagen, una matriz de enteros y dos punteros a enteros. Esta función leerá la imagen del
fichero especificado y almacenará la misma en la matriz imagen. Además almacenará
en las referencias ancho y alto las dimensiones de la imagen leída. Por último la función
devolverá un 1 si todo ha ido correctamente o un 0 en caso de que se haya producido
algún error durante la lectura (nombre de fichero incorrecto, fichero con formato
incorrecto o imagen demasiado grande).

La función escribir_imagen recibe los mismos parámetros que leer_imagen, pero


en este caso ancho y alto no son punteros sino variables enteras, ya que ahora
no será necesario modificar su contenido. Esta función almacena en el fichero
especificado la imagen contenida en la matriz imagen. Devuelve 1 si todo ha ido
correctamente o 0 si se
ha producido algún error durante la escritura a disco.

En la dirección http://www.iti.upv.es/~rllobet/prg puede encontrarse el fichero imagen.c


en el que aparece el código de estas funciones, así como un pequeño ejemplo en el que
se hace uso de las mismas. En esa misma dirección existen imágenes de ejemplo
en formato pgm.
Valiéndose de las funciones del ejemplo anterior, implementar otra serie de funciones
que nos permitan:

1. Obtener el negativo de una imagen.

2. Aumentar la luminosidad de una imagen en un porcentaje dado. Cada píxel de la


imagen debe incrementarse de acuerdo al porcentaje establecido (que se pasará
como parámetro). Tened en cuenta que el valor final de cada píxel debe de ser
255 como máximo.

3. Umbralizar una imagen. A partir de una imagen y un valor de umbral entre 0 y


255, poner a blanco todos los pixeles que tengan un valor de gris igual superior
al umbral y a negro el resto.

4. Girar una imagen 180 grados..

5. Suavizar una imagen aplicando un filtro de media. Para ello, cada píxel (i,j) de la
nueva imagen se obtiene a partir de la media aritmética de los píxeles que se
encuentran en la imagen original en una submatriz de tamaño WxW centrada en
(i,j). A la hora de calcular la media no tener en cuenta los puntos de la submatriz
que queden fuera de la imagen original. El valor de W deberá ser un parámetro
más de la función.

6. Dada una imagen y una cadena de caracteres, crear otra imagen en la que se
“esconda” dicha cadena de caracteres. Para esconder el texto dentro de la
imagen utilizar el siguiente algoritmo:
- El primer píxel de la imagen se sustituye por un valor entero que indique la
longitud del texto.
- Los píxeles 10, 20, 30, ... , longitud_texto * 10 se sustituyen por cada uno de
los caracteres (su código ASCII).
Tened en cuenta que longitud_texto * 10 deberá ser menor que ancho * alto.

7. Dada una imagen con un texto oculto, mostrar dicho texto.

También podría gustarte