調整圖像亮度和對比的方式,計算表達是如下:
\[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;
}
結果對比如下:

