C++ OpenCV 图像处理

我将为你介绍 C++ 中使用 OpenCV 进行常见图像处理操作的详细指南,涵盖亮度/对比度调整、滤波、阈值处理、形态学操作等实用技术。以下内容基于 OpenCV 4.x,假设你已配置好开发环境。

1. 基础环境和代码框架

确保已包含 OpenCV 头文件并链接库:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    // 读取图像
    Mat image = imread("example.jpg"); // 替换为你的图像路径
    if (image.empty()) {
        cout << "无法读取图像!" << endl;
        return -1;
    }

    // 显示原始图像
    namedWindow("Original Image", WINDOW_AUTOSIZE);
    imshow("Original Image", image);
    waitKey(0);

    // 后续处理代码将放在这里
    destroyAllWindows();
    return 0;
}

2. 常见图像处理操作

(1) 亮度和对比度调整

调整图像的亮度和对比度通过线性变换实现:new_pixel = alpha * pixel + beta

  • alpha 控制对比度(>1 增强,<1 减弱)。
  • beta 控制亮度(正值增亮,负值变暗)。
Mat adjusted_image;
double alpha = 1.5; // 对比度
int beta = 50;      // 亮度
image.convertTo(adjusted_image, -1, alpha, beta);
imshow("Brightness/Contrast Adjusted", adjusted_image);
waitKey(0);
imwrite("adjusted_image.jpg", adjusted_image);

(2) 图像平滑(滤波)

平滑用于去除噪声,常用方法包括高斯模糊和中值模糊:

  • 高斯模糊:适合去除高斯噪声。
Mat gaussian_blur;
GaussianBlur(image, gaussian_blur, Size(5, 5), 0); // 5x5 核
imshow("Gaussian Blur", gaussian_blur);
waitKey(0);
  • 中值模糊:适合去除椒盐噪声。
Mat median_blur;
medianBlur(image, median_blur, 5); // 5x5 核
imshow("Median Blur", median_blur);
waitKey(0);

(3) 阈值处理

阈值处理用于图像分割,将像素值与阈值比较,生成二值图像。

Mat gray, thresh;
cvtColor(image, gray, COLOR_BGR2GRAY); // 转换为灰度图
threshold(gray, thresh, 100, 255, THRESH_BINARY); // 阈值 100
imshow("Threshold", thresh);
waitKey(0);
  • 常用类型:THRESH_BINARY(二值化)、THRESH_OTSU(自动阈值)。

(4) 边缘检测

Canny 算法是常用的边缘检测方法:

Mat edges;
Canny(gray, edges, 100, 200); // 低阈值 100,高阈值 200
imshow("Canny Edges", edges);
waitKey(0);
  • 提示:先应用模糊(如高斯模糊)可减少噪声对边缘检测的干扰。

(5) 形态学操作

形态学操作(如膨胀和腐蚀)用于处理二值图像,增强或去除特征。

  • 腐蚀:缩小白色区域。
Mat eroded;
Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
erode(thresh, eroded, kernel);
imshow("Eroded Image", eroded);
waitKey(0);
  • 膨胀:扩大白色区域。
Mat dilated;
dilate(thresh, dilated, kernel);
imshow("Dilated Image", dilated);
waitKey(0);
  • 其他操作:morphologyEx 支持开运算、闭运算等。

(6) 颜色空间转换

将图像从 BGR 转换为其他颜色空间(如 HSV、灰度)以便特定处理:

Mat hsv;
cvtColor(image, hsv, COLOR_BGR2HSV);
imshow("HSV Image", hsv);
waitKey(0);

(7) 直方图均衡化

增强图像对比度,适用于灰度图像:

Mat equalized;
equalizeHist(gray, equalized);
imshow("Equalized Image", equalized);
waitKey(0);

3. 综合示例

以下代码结合多种处理,展示图像处理的完整流程:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    Mat image = imread("example.jpg");
    if (image.empty()) {
        cout << "无法读取图像!" << endl;
        return -1;
    }

    // 灰度转换
    Mat gray;
    cvtColor(image, gray, COLOR_BGR2GRAY);

    // 高斯模糊
    Mat blurred;
    GaussianBlur(gray, blurred, Size(5, 5), 0);

    // 边缘检测
    Mat edges;
    Canny(blurred, edges, 100, 200);

    // 形态学操作:膨胀
    Mat dilated;
    Mat kernel = getStructuringElement(MORPH_RECT, Size(3, 3));
    dilate(edges, dilated, kernel);

    // 显示结果
    imshow("Original", image);
    imshow("Gray", gray);
    imshow("Blurred", blurred);
    imshow("Edges", edges);
    imshow("Dilated Edges", dilated);
    waitKey(0);

    // 保存结果
    imwrite("dilated_edges.jpg", dilated);

    destroyAllWindows();
    return 0;
}

4. 注意事项

  • 性能优化:处理大图像时,尽量使用高效算法,避免频繁拷贝 Mat
  • 颜色格式:OpenCV 默认 BGR 格式,注意与 RGB 的转换(如与 matplotlib 交互时)。
  • 参数调试:如 Canny 的阈值、模糊核大小等,需根据图像调整。
  • 内存管理Mat 自动管理内存,但大循环操作像素时建议优化代码。

5. 进阶建议

  • 轮廓检测:使用 findContours 查找图像中的对象轮廓。
vector<vector<Point>> contours;
findContours(edges, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
drawContours(image, contours, -1, Scalar(0, 255, 0), 2);
  • 图像变换:如 warpAffine(旋转、平移)、warpPerspective(透视变换)。
  • 特征检测:尝试 SIFT、ORB 等特征提取算法。
  • 参考 OpenCV 官方文档:https://docs.opencv.org/4.x/

如果你需要针对特定任务(如目标检测、图像分割)的代码或更深入的讲解,请告诉我!

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注