Estás en:   ArielOrtiz.com > Programación avanzada > Proyecto final: Combinación de imágenes

Proyecto final: Combinación de imágenes

Objetivos

Durante esta actividad, los alumnos serán capaces de:

Esta actividad promueve las siguientes habilidades, valores y actitudes: análisis y síntesis, capacidad de resolver problemas, creatividad, y uso eficiente de la informática y las telecomunicaciones.

Descripción

Esta actividad puede ser elaborada de manera individual o en parejas.

Escribe un programa en gcc para Linux que permita realizar la combinación de dos imágenes BMP de 24-bits por pixel, usando el algoritmo de disolución alfa.

Para ello, primeramente deberás implementar una biblioteca de enlace dinámico (shared object) que permita manipular en memoria imágenes BMP de 224 colores.

Posteriormente, deberás desarrollar tres versiones diferentes del algoritmo de combinación de imágenes y medir sus respectivos tiempos de ejecución:

  1. Usando sólo C99 estándar.
  2. Usando la biblioteca OpenMP.
  3. Usando instrucciones instrínsicas SIMD para el procesador x86.

Las tres versiones deben estar disponibles desde el mismo código fuente, gracias al uso de directivas condicionales del preprocesador de C. Al momento de correr el Makefile, se debe poder indicar qué versión particular de ejecutable se desea generar, tal como se realizó en clase.

El programa ejecutable debe correr desde la línea de comando. Debe recibir como argumentos el factor de intensidad (un entero entre 0 y 255), el nombre de los dos archivos de entrada (las imágenes de frente y fondo) y el nombre del archivo de salida (imagen combinada):

./combina <intensidad> <entrada1.bmp> <entrada2.bmp> <salida.bmp>

Por ejemplo, suponiendo que se tienen las siguientes dos imágenes (disponibles en este archivo: bitmaps.tar.gz):

chavas.bmp
flor.bmp

Si el programa se corre así:

./combina 155 chavas.bmp flor.bmp salida1.bmp

El resultado sería la siguiente imagen:

salida1.bmp

Como segundo ejemplo, si el programa se corre así:

./combina 77 chavas.bmp flor.bmp salida2.bmp

El resultado ahora sería:

salida2.bmp

Si se detecta algún error, el programa debe terminar con un mensaje descriptivo del problema. Los posibles errores incluyen:

Información adicional

A continuación se describe el algoritmo a implementar.

Alpha Dissolution Image Combination Algorithm

Los detalles para implementar este algoritmo usando instrucciones instrínsicas SIMD para la arquitectura x86 se describen a continuación:

Paso Descripción Instrucciones
intríniscas
1. Copia de memoria a un registro XMM (128-bit) los siguientes ocho bytes de la imagen de frente. _mm_loadl_epi64
2. Desempaca en paraleo los ocho bytes del punto anterior, convirtiéndolos en ocho palabras de 16 bits. _mm_set1_epi8
_mm_unpacklo_epi8
3. Multiplica en paralelo las ocho palabras de 16 bits por alfa, descartando las partes altas del resultado. _mm_set1_epi16
_mm_mullo_epi16
4. Divide en paralelo las palabras de 16 bits resultantes del punto anterior entre 256 usando corrimientos. _mm_srli_epi16
5. Reptite los pasos 1 al 4 para la imagen de fondo, pero modificando el paso 3 para que en su lugar se multiplique por (255 − alfa).
6. Suma en paralelo las ocho palabras de 16 bits obtenidas en el paso 4, más las ocho palabras de 16 bits obtenidas en el paso 5. _mm_add_epi16
7. Empaca el resultado del punto anterior usando saturación sin signo, convirtiendo las palabras de 16 bits a bytes. _mm_packus_epi16
8. Almacena en memoria los 8 bytes resultantes. _mm_storel_epi64

La siguiente tabla muestra la estructura de un archivo BMP de 24 bits por pixel (adaptada del documento Graphics File Formats):

Offset Tipo Descripción
0 char[2] Número mágico: los caracteres "BM".
2 uint32_t Tamaño del archivo en bytes.
18 uint32_t Ancho de la imagen en pixeles.
22 uint32_t Alto de la imagen en pixeles.
28 uint16_t Número de bits por cada pixel. Debe ser 24.
30 uint32_t Compresión. Debe ser 0 para indicar que no hay compresión alguna.
54 uint8_t[N] El arreglo con los pixeles del bitmap, donde N = Ancho * Alto * 3.

¿Qué se debe entregar?

Elabora un reporte de por lo menos 200 palabras donde describas los resultados obtenidos de las mediciones y las conclusiones a las que llegaste. Incluye también una gráfica (de barras, de líneas, etc.) en donde se puedan observar claramente las diferencias en las mediciones y las mejoras (speedup) obtenidas. El reporte se debe presentar como un documento en formato PDF llamado reporte.pdf. Asegúrate de incluir tu nombre y matrícula.

Coloca en un archivo llamado combinacion.zip el directorio que contenga todos los archivos fuente (inclyendo archivos Makefile) de tu proyecto así como el archivo report.pdf.

NOTA: Cada archivo fuente de C debe incluir en la parte superior un comentario con el nombre y matrícula de los autores. Por ejemplo:

/*
 +------------------------------------------
 | Nombre:    María Expropiación Petronila 
 | Matrícula: 1166666
 | Actividad: Proyecto final: Combinación de imágenes.
 | Fecha:     14 de mayo, 2010.
 +------------------------------------------
 */

Usando Sistema de Entrega de Tareas Automatizado, entrega el archivo combinacion.zip. No se aceptan proyectos por ningún otro medio.

Fecha límite: Viernes, 14 de mayo.

Evaluación

Esta actividad será evaluada usando los siguientes criterios:

100 La actividad cumple con todos los requerimientos.
-10 No se incluyó en comentario los datos de los autores.
10 El programa fuente produce errores al momento de compilarlo.
50-90 El programa tiene algunos errores a tiempo de ejecución.
DA La solución es un plagio.
© 1996-2010 por Ariel Ortiz Ramírez (ariel.ortiz@itesm.mx)
Desarrollado en Django | Licencia de Creative Commons | XHTML válido | CSS válido