g(x) = alpha f(x) + beta
两个参数 alpha 和 beta 一般称作 增益 和 偏置 参数。用这两个参数来分别控制 对比度 和 亮度 。
其中,α可以调整图像的对比度(>1对比度就增加,<1对比度减弱)
β可以调整图像的亮度。
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
//读入打开图像
Mat src, dst,m1;
src = imread("d:/gg.jpg");
if (src.empty()) {
cout << "加载图像失败" << endl;
}
//设置亮度和对比度
float alpha = 1.2;
float beta = 10;
int height = src.rows;
int width = src.cols;
int td = src.channels();
dst = Mat::zeros(src.size(), src.type());
src.convertTo(m1, CV_32F); //转换为FLOAT
for (int row = 0; row < height; row++) {
for (int col = 0; col < width; col++) {
if (td == 3) {
float b = m1.at<Vec3f>(row, col)[0]; //若不转换,还是使用Vec3b
float g = m1.at<Vec3f>(row, col)[1];
float r = m1.at<Vec3f>(row, col)[2];
dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b*alpha + beta);
dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g*alpha + beta);
dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r*alpha + beta);
}
else if(td==1) {
float v = src.at<uchar>(row, col);
dst.at<uchar>(row, col) = saturate_cast<uchar>(v*alpha + beta);
}
}
}
namedWindow("output", WINDOW_AUTOSIZE);
imshow("output", dst);
waitKey(0);
return 0;
}
saturate_cast()是做一个溢出保护,保证值在0–255之间
初始化一个空白图像:
dst = Mat::zeros(src.size(), src.type());
dst.create(src.size(), src.type());
这两种方法都可以。