Análisis del Código Fuente - RaulDiazR/Image-Processing GitHub Wiki
Procesamiento de Imágenes BMP en Paralelo
Este proyecto realiza transformaciones sobre imágenes BMP (como inversión, desenfoque y conversión a escala de grises), aprovechando procesamiento paralelo con MPI y OpenMP para mejorar el rendimiento en lotes grandes de imágenes.
main.c
Descripción General
Este archivo es el punto de entrada del programa. Coordina la ejecución paralela distribuida del procesamiento de imágenes:
- MPI se utiliza para repartir el trabajo entre distintos procesos.
- OpenMP permite paralelizar operaciones internas por hilos.
Funcionalidades Clave
- Lectura de argumentos: Recoge configuración como tamaño del kernel, ruta de entrada y salida, y cantidad de imágenes.
- Inicialización MPI/OpenMP: Define número de procesos e hilos.
- Cálculo de promedio de tamaños: Se estima el tamaño medio de imágenes para planificar almacenamiento.
- Verificación de espacio libre: Se comprueba que haya suficiente espacio en cada nodo para guardar las imágenes transformadas.
- Procesamiento paralelo: Cada proceso MPI recibe una porción del total de imágenes, que procesa en paralelo con hilos.
- Estadísticas e informe final: El proceso maestro imprime métricas como número de lecturas/escrituras y tiempo total.
Funciones Auxiliares
formatNumberWithCommas
: Formatea números con separadores de miles.get_free_space_bytes
: Devuelve el espacio libre en disco.calcular_promedio_tamano_imagenes
: Calcula el tamaño promedio de imágenes en un directorio.
image_processing.h
Descripción General
Este archivo define las estructuras de encabezado BMP y declara las funciones para transformar imágenes BMP.
Estructuras
BMPHeader
: Contiene datos del encabezado BMP como tamaño total del archivo, tipo, y posición del inicio de datos de píxeles.DIBHeader
: Incluye información detallada como ancho, alto, resolución, y profundidad de color de la imagen.
Funciones Declaradas
Estas funciones permiten transformaciones básicas y eficientes sobre imágenes BMP:
invertirHorizontalGrises
: Refleja horizontalmente una imagen en escala de grises.invertirHorizontalColor
: Refleja horizontalmente una imagen en color.invertirVerticalGrises
: Refleja verticalmente una imagen en escala de grises.invertirVerticalColor
: Refleja verticalmente una imagen en color.convertirAGrises
: Convierte una imagen a escala de grises.aplicarDesenfoqueIntegral
: Aplica desenfoque con un kernel variable utilizando imágenes integrales.
Estas funciones están optimizadas para grandes volúmenes de datos e incluyen paralelización con OpenMP donde aplica.
image_processing.c
Descripción General
Este archivo implementa las funciones declaradas en image_processing.h
, encargadas del procesamiento efectivo de imágenes BMP. Utiliza acceso a bajo nivel a los píxeles, cálculo de padding, y paralelismo para alto rendimiento.
Funciones Implementadas
convertirAGrises
Descripción: Convierte una imagen BMP de 24 bits a escala de grises.
Proceso:
-
Lee cabeceras BMP.
-
Verifica que sea de 24 bits.
-
Calcula el padding por fila.
-
Procesa cada píxel con:
gray = 0.21*R + 0.72*G + 0.07*B;
-
Guarda la imagen resultante.
Optimización: Paralelizada con #pragma omp parallel for
.
invertirHorizontalGrises
Descripción: Refleja horizontalmente una imagen en escala de grises.
Proceso:
- Lee la imagen y cabeceras.
- Invierte horizontalmente cada fila.
- Aplica la fórmula de gris y guarda la imagen.
Optimización: Uso de OpenMP para paralelismo por fila.
invertirHorizontalColor
Descripción: Refleja horizontalmente una imagen BMP en color.
Proceso:
- Lee y guarda la cabecera.
- Recorre cada fila intercambiando los píxeles de izquierda a derecha.
- No se alteran valores RGB.
- Escribe el resultado.
Optimización: Paralelismo con OpenMP.
invertirVerticalGrises
Descripción: Refleja verticalmente una imagen en escala de grises (la última fila pasa a ser la primera, etc).
Proceso:
-
Lee la imagen en memoria.
-
Copia las filas de abajo hacia arriba.
-
Calcula el valor gris con:
gray = 0.21*R + 0.72*G + 0.07*B;
-
Guarda la imagen.
Optimización: Paralelismo por fila con OpenMP.
invertirVerticalColor
Descripción: Refleja verticalmente una imagen BMP en color, manteniendo los valores RGB.
Proceso:
- Lee la imagen.
- Calcula padding y tamaño de fila.
- Copia las filas en orden invertido (de abajo hacia arriba).
- Escribe el resultado.
Optimización: Usa OpenMP para paralelizar por fila.
aplicarDesenfoqueIntegral
Descripción: Aplica desenfoque eficiente mediante imágenes integrales, para promediar valores RGB en regiones rectangulares rápidamente.
Proceso:
-
Lee la imagen de entrada y copia encabezados.
-
Calcula el padding.
-
Crea matrices de suma acumulada
sumR
,sumG
,sumB
. -
Para cada píxel
(x, y)
:sum[x][y] = val + sum[x-1][y] + sum[x][y-1] - sum[x-1][y-1];
-
Define el radio de desenfoque
r = kernelSize / 2
. -
Para cada píxel:
- Calcula los límites de la región a promediar.
- Calcula el promedio RGB.
- Escribe en el buffer de salida.
-
Escribe imagen final a disco.
Optimización: Bucle principal paralelizado con OpenMP (#pragma omp parallel for
).
Notas Finales
- Todas las funciones usan formato BMP de 24 bits (sin compresión).
- Se gestionan cabeceras manualmente para asegurar compatibilidad.
- El código está optimizado para procesar grandes volúmenes de imágenes rápidamente mediante paralelismo distribuido y multihilo.
- Se registran estadísticas de rendimiento (lecturas, escrituras, tiempo).