在C++中处理图像:CImg库与STB Image库
图像处理是计算机图形学、计算机视觉和网络技术中的关键任务之一。C++本身没有内置的位图图像处理工具,但存在许多第三方库。本文将介绍两个流行且易于使用的库:CImg(用于高级处理)和STB Image(用于快速加载/保存常见格式)。
1. CImg:通用的图像处理库
CImg(C++模板图像处理库)是一个仅头文件(header-only)库,提供了丰富的图像加载、显示、滤波和分析功能。它支持BMP、JPEG、PNG、TIFF等格式(需要额外库如libpng、libjpeg的支持)。
安装与配置
从官方网站下载最新版本。然后只需包含头文件:
#include "CImg.h"using namespace cimg_library;CImg基本操作
以下示例演示了加载、调整大小和应用高斯滤波:
#include "CImg.h"#include <iostream>
int main() { // 加载图像(支持BMP、JPG、PNG等) CImg<unsigned char> img("input.jpg"); // 调整大小为400x300 CImg<unsigned char> resized = img.resize(400, 300); // 应用高斯模糊(半径3) CImg<unsigned char> blurred = resized.get_blur(3.0f); // 保存结果 blurred.save("output.jpg"); std::cout << "图像处理完成!" << std::endl; return 0;}CImg的其他功能
- 滤镜:模糊、锐化、中值滤波、形态学操作。
- 色彩转换:转换为灰度、HSV、Lab色彩空间。
- 直方图:绘制和均衡化。
- 绘图:在图像上绘制线条、圆形、文字。
- 显示:内置显示窗口(Linux需X11支持,Windows需WinAPI支持)。
2. STB Image:快速加载与保存
STB Image 是Sean Barrett开发的一组单头文件库,用于读取/写入PNG、JPG、BMP、GIF等格式的图像。主要优势在于简洁和速度。无需安装,只需包含stb_image.h和stb_image_write.h文件。
配置
从GitHub下载文件。使用时,在恰好一个.cpp文件中定义宏STB_IMAGE_IMPLEMENTATION:
#define STB_IMAGE_IMPLEMENTATION#include "stb_image.h"
#define STB_IMAGE_WRITE_IMPLEMENTATION#include "stb_image_write.h"示例:加载PNG并保存为JPG
#include <iostream>
#define STB_IMAGE_IMPLEMENTATION#include "stb_image.h"#define STB_IMAGE_WRITE_IMPLEMENTATION#include "stb_image_write.h"
int main() { int width, height, channels; // 加载图像(返回RGB/RGBA格式的像素数组) unsigned char* img = stbi_load("input.png", &width, &height, &channels, 3); if (!img) { std::cerr << "图像加载失败!" << std::endl; return -1; } // 保存为JPEG,质量90 stbi_write_jpg("output.jpg", width, height, 3, img, 90); // 释放内存 stbi_image_free(img); std::cout << "转换完成!" << std::endl; return 0;}