C++图像处理:库概述与实践示例
数字图像处理是现代编程的关键任务之一。C++中有几个强大的库,可以加载、修改、分析和保存图像。在本文中,我们将介绍三种最流行的工具:CImg(轻量且简单)、OpenCV(计算机视觉的行业标准)和GraphicsMagick(用于高性能转换)。
1. CImg — 用于基本操作的轻量级库
CImg(C++模板图像处理库)是一个头文件库,无需安装额外的DLL。它非常适合学习项目和快速原型开发。支持BMP、PNG、JPEG、TIFF格式(通过外部编解码器)。
安装
只需下载CImg.h文件并将其包含到项目中。要处理JPEG/PNG,还需要libjpeg、libpng和zlib。
示例:加载、颜色反转和保存
#include "CImg.h"using namespace cimg_library;
int main() { // 加载图像 CImg<unsigned char> img("input.jpg"); // 反转颜色(像素 = 255 - 像素) CImg<unsigned char> inverted = 255 - img; // 应用高斯模糊(半径3) CImg<unsigned char> blurred = img.get_blur(3); // 保存结果 inverted.save("inverted.jpg"); blurred.save("blurred.jpg"); return 0;}2. OpenCV — 强大的计算机视觉框架
OpenCV(开源计算机视觉库)是识别、目标检测和复杂图像处理任务的事实标准。支持数百种算法、视频处理、神经网络。它是跨平台的。
安装
在Ubuntu上:sudo apt install libopencv-dev。在Windows上——通过vcpkg或官方安装程序。
示例:边缘检测(Canny)和调整大小
#include <opencv2/opencv.hpp>using namespace cv;
int main() { // 读取图像 Mat img = imread("photo.jpg"); if (img.empty()) return -1; // 转换为灰度 Mat gray; cvtColor(img, gray, COLOR_BGR2GRAY); // 使用Canny算法进行边缘检测 Mat edges; Canny(gray, edges, 50, 150); // 调整大小为300x300 Mat resized; resize(img, resized, Size(300, 300)); // 保存和显示 imwrite("edges.jpg", edges); imshow("Original", img); waitKey(0); return 0;}3. GraphicsMagick — 快速转换和批量处理
GraphicsMagick 是ImageMagick的一个分支,专注于稳定性和性能。用于批量转换、调整大小、水印。支持超过200种格式。
安装
通过包管理器:sudo apt install graphicsmagick。对于C++,需要libgraphicsmagick++-dev库。
示例:缩小图像并转换为PNG
#include <Magick++.h>using namespace Magick;
int main() { InitializeMagick(nullptr); // 加载图像 Image image("input.tiff"); // 将宽度缩放至800像素 image.scale(Geometry("800x")); // 旋转90度 image.rotate(90); // 设置JPEG质量(如果输出格式为JPEG) image.quality(85); // 保存为PNG image.write("output.png"); return 0;}库比较
- CImg — 简单入门,最少