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.
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:
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:
A continuación se describe el algoritmo a implementar.
The following algorithm produces a new sequence called RESULT of size n. FOREi, BACKi and RESULTi represent a specific byte, where i is an integer number in between 0 and n-1. For each byte i from 0 to n-1, do the following:
RESULTi = [FOREi * alpha] / 256 + [BACKi * (255 - alpha)] / 256
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. |
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.
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. |