//以f(i,j)代表原像素值,g(i,j)为输出像素的值,α和β为两个参数,
//则可以通过以下公式对图像像素值进行数值运算从而达到调节图像亮度和对比度的目的。
//g(i,j)= αf(i,j)+ β
//其中参数α > 0和β常被称为增益和偏置参数,有时这些参数可以调节图像的对比度和亮度。
//其中i, j分别代表了该像素的行和列。
//使用Mat::zeros()方法初始化目标图像矩阵,与原图像大小和类型相同
//使用at()函数对图像像素值进行遍历
//图像为三通道图像,故使用结构存储每个通道所对应的像素值
//在计算像素值时使用saturate_cast来防止计算出来的图像像素值溢出
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
using namespace std;
using namespace cv;
const int ga1 = 30;
const int gb1 = 100;
int g1;
int g2;
double g3;
Mat image1, image2;
void ont1(int, void*);
void ont2(int, void*);
int main()
{
image1 = imread("F:/2.jpg");
if (image1.data)
cout << "图像存在: " << endl << endl;
else
{
cout << "图像显示不出来! " << endl << endl;
return -1;
}
namedWindow("原图像", WINDOW_NORMAL);
imshow("原图像", image1);
image2 = Mat::zeros(image1.size(), image1.type());
namedWindow("图像调节", WINDOW_NORMAL); //声明轨迹条依附的窗口
g1 = 10; //轨迹条中alpha初始值
g2 = 50; //轨迹条中beta初始值
//在创建的窗体中创建轨迹条并命名
char g1name[50];
char g2name[50];
sprintf_s(g1name, "对比度 %d", ga1);
sprintf_s(g2name, "亮 度 %d", gb1);
//创建对比度调节和亮度调节的轨迹条
createTrackbar(g1name, "图像调节", &g1, ga1, ont1);
createTrackbar(g2name, "图像调节", &g2, gb1, ont2);
//调用回调函数
ont1(g1, 0);
ont2(g2, 0);
waitKey(0);
return 0;
}
void ont1(int, void*)
{
g3 = (double)g1 / 10;
for (int i = 0; i < image2.rows; i++)
{
for (int j = 0; j < image2.cols; j++)
{
for (int k = 0; k < 3; k++)
{
image2.at<Vec3b>(i, j)[k] =
saturate_cast<uchar>(g3*(image1.at<Vec3b>(i, j)[k]));
}
}
}
imshow("图像调节", image2);
}
void ont2(int, void*)
{
for (int i = 0; i < image2.rows; i++)
{
for (int j = 0; j < image2.cols; j++)
{
for (int k = 0; k < 3; k++)
{
image2.at<Vec3b>(i, j)[k] =
saturate_cast<uchar>((image1.at<Vec3b>(i, j)[k])+g2); //saturate_cast防止数据溢出,
}
}
}
imshow("图像调节", image2);
}