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;
}
结果对比如下: