C++图像处理:库综述与实践示例
图像处理是现代编程中的关键任务之一,应用范围从计算机视觉到图形编辑器。在C++中,有多个强大的库可用于加载、处理和保存图像。本文将介绍三种流行的工具:CImg、OpenCV和stb_image。它们各有特点、优势和应用领域。
1. CImg库
CImg(C++图像处理库)是一个轻量级、跨平台的图像处理库。它以单个头文件(CImg.h)的形式分发,非常适合快速原型开发和小型项目。CImg支持BMP、JPEG、PNG、TIFF等格式,但需要安装额外的库(例如libpng或libjpeg)才能使用这些格式。
主要功能:
- 加载、显示和保存图像。
- 滤镜(模糊、锐化、中值滤波)。
- 几何变换(旋转、缩放、翻转)。
- 色彩空间处理(RGB、HSV、Lab)。
- 绘制基本图形(线条、圆形、文本)。
示例:加载图像并应用模糊效果
#include "CImg.h"using namespace cimg_library;
int main() { // 加载图像 CImg<unsigned char> image("input.jpg");
// 应用高斯模糊(半径3) CImg<unsigned char> blurred = image.get_blur(3);
// 保存结果 blurred.save("output_blurred.jpg");
return 0;}这段代码展示了CImg的极简风格:一行加载,一行处理,一行保存。库会自动管理内存。
2. OpenCV库
OpenCV(开源计算机视觉库)是C++计算机视觉和图像处理领域的事实标准。它包含超过2500个优化算法,支持GPU加速,广泛应用于工业解决方案、机器人技术和科学研究。OpenCV支持JPEG、PNG、TIFF、WebP等多种格式。
主要功能:
- 加载、显示和录制视频/图像。
- 滤波、形态学操作、阈值处理。
- 目标检测(人脸、车辆)通过Haar级联或深度学习。
- 相机标定、立体视觉。
- 机器学习(SVM、KNN、神经网络)。
示例:调整大小并转换为灰度图
#include <opencv2/opencv.hpp>using namespace cv;
int main() { // 加载彩色图像 Mat image = imread("input.jpg", IMREAD_COLOR); if (image.empty()) { return -1; }
// 转换为灰度图 Mat gray; cvtColor(image, gray, COLOR_BGR2GRAY);
// 将尺寸缩小一半 Mat resized; resize(gray, resized, Size(), 0.5, 0.5, INTER_LINEAR);
// 保存结果 imwrite("output_gray_resized.jpg", resized);
return 0;}OpenCV使用Mat类表示图像。所有操作通过静态函数或方法执行。该库需要预先安装,但提供了最大的灵活性和性能。
3. stb_image库
stb_image是Sean Barrett开发的一组单头文件库的一部分。它专门用于加载和保存图像,不包含处理功能。支持JPEG、PNG、BMP、GIF、PS