OpenCV-C++ 调整图像亮度和对比度

调整图像亮度和对比的方式,计算表达是如下:

\[g(i, j) = \alpha f(i, j) + \beta \]

\(\alpha>0\)用于控制对比度, \(\beta\)是增益变量;

\(g\)表示调整后的图像,\(f\)表示原始图像;

代码如下:

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

using namespace std;
using namespace cv;

int main(){

    // 读取图像
    Mat src = imread("/home/chen/dataset/lena.jpg");
    if (src.empty()){
        cout << "could not load image." << endl;
        return -1;
    }
    char input_win[] = "src";
    namedWindow(input_win, WINDOW_AUTOSIZE);
    imshow("src", src);

    // 调整亮度和对比度
    double alpha = 1.2;  // 用于调整对比度
    double beta = 30;  // 用于增加亮度

    // 新建目标图像
    Mat dst = Mat::zeros(src.size(), src.type());

    int rows = src.rows;
    int cols = src.cols;

    for (int row = 0; row < rows - 1; row++){
        for (int col = 0; col < cols - 1; col++){
            // 获取像素
            int b = src.at<Vec3b>(row, col)[0];
            int g = src.at<Vec3b>(row, col)[1];
            int r = src.at<Vec3b>(row, col)[2];
            
            // 调整亮度和对比度
            dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(alpha*b + beta);
            dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(alpha*g + beta);
            dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(alpha*r + beta);
        }
    }
    namedWindow("dst", WINDOW_AUTOSIZE);
    imshow("dst", dst);

    waitKey(0);
    return 0;
}

结果对比如下:

posted @ 2021-04-05 22:08  chenzhen0530  阅读(2692)  评论(0编辑  收藏  举报