Trabajo con imágenes en C++: revisión de bibliotecas y ejemplos prácticos
El procesamiento de imágenes es una de las tareas clave en la programación moderna, desde la visión por computadora hasta los editores gráficos. En C++ existen varias bibliotecas potentes que permiten cargar, procesar y guardar imágenes. En este artículo analizaremos tres herramientas populares: CImg, OpenCV y stb_image. Cada una tiene sus propias características, ventajas y áreas de aplicación.
1. Biblioteca CImg
CImg (C++ Image Processing Library) es una biblioteca ligera y multiplataforma para el procesamiento de imágenes. Se distribuye como un único archivo de cabecera (CImg.h), lo que la hace ideal para prototipado rápido y proyectos pequeños. CImg admite formatos BMP, JPEG, PNG, TIFF y otros, pero para trabajar con ellos requiere la instalación de bibliotecas adicionales (por ejemplo, libpng o libjpeg).
Características principales:
- Carga, visualización y guardado de imágenes.
- Filtros (desenfoque, nitidez, filtro mediano).
- Transformaciones geométricas (rotación, escalado, reflexión).
- Trabajo con espacios de color (RGB, HSV, Lab).
- Dibujo de primitivas (líneas, círculos, texto).
Ejemplo: cargar una imagen y aplicar desenfoque
#include "CImg.h"using namespace cimg_library;
int main() { // Cargamos la imagen CImg<unsigned char> image("input.jpg");
// Aplicamos desenfoque gaussiano (radio 3) CImg<unsigned char> blurred = image.get_blur(3);
// Guardamos el resultado blurred.save("output_blurred.jpg");
return 0;}Este código demuestra el enfoque minimalista de CImg: una línea para cargar, una para procesar y una para guardar. La biblioteca gestiona la memoria automáticamente.
2. Biblioteca OpenCV
OpenCV (Open Source Computer Vision Library) es el estándar de facto para tareas de visión por computadora y procesamiento de imágenes en C++. Incluye más de 2500 algoritmos optimizados, admite aceleración por GPU y se utiliza activamente en soluciones industriales, robótica e investigación científica. OpenCV trabaja con formatos JPEG, PNG, TIFF, WebP y muchos otros.
Características principales:
- Carga, visualización y grabación de video/imágenes.
- Filtrado, morfología, procesamiento por umbral.
- Detección de objetos (rostros, automóviles) mediante cascadas Haar o aprendizaje profundo.
- Calibración de cámara, visión estéreo.
- Aprendizaje automático (SVM, KNN, redes neuronales).
Ejemplo: cambiar tamaño y convertir a escala de grises
#include <opencv2/opencv.hpp>using namespace cv;
int main() { // Cargamos la imagen a color Mat image = imread("input.jpg", IMREAD_COLOR); if (image.empty()) { return -1; }
// Convertimos a escala de grises Mat gray; cvtColor(image, gray, COLOR_BGR2GRAY);
// Reducimos el tamaño a la mitad Mat resized; resize(gray, resized, Size(), 0.5, 0.5, INTER_LINEAR);
// Guardamos el resultado imwrite("output_gray_resized.jpg", resized);
return 0;}OpenCV utiliza la clase Mat para representar imágenes. Todas las operaciones se realizan a través de funciones estáticas o métodos. La biblioteca requiere instalación previa, pero ofrece la máxima flexibilidad y rendimiento.
3. Biblioteca stb_image
stb_image es parte del conjunto de bibliotecas de un solo archivo de cabecera de Sean Barrett. Está diseñada exclusivamente para cargar y guardar imágenes, sin funciones de procesamiento. Admite los formatos JPEG, PNG, BMP, GIF, PS