调整图像的亮度和对比度—opencv

1.理论基础

                                         g(x) = alpha f(x) + eta

两个参数 alpha > 0 和 eta 一般称作 增益 和 偏置 参数。我们往往用这两个参数来分别控制 对比度 和 亮度 。

你可以把 f(x) 看成源图像像素,把 g(x) 看成输出图像像素。这样一来,上面的式子就能写得更清楚些:

                                                                                                                  g(i,j) = alpha cdot f(i,j) + eta

其中, i 和 j 表示像素位于 第i行 和 第j列 。

其中,α可以调整图像的对比度,β可以调整图像的亮度。

2.代码如下:

 1 #include<iostream>
 2 #include<opencv2/opencv.hpp>
 3 
 4 using namespace std;
 5 using namespace cv;
 6 
 7 int main(int argc, char **argv)
 8 {
 9     Mat src = imread("D:/meinv.jpg");
10     if (!src.data)
11     {
12         printf("Couldn't load the image......");
13         return -1;
14     }
15     namedWindow("源图像", CV_WINDOW_AUTOSIZE);
16     imshow("源图像", src);
17 
18     int height = src.rows;
19     int width = src.cols;
20     int channels = src.channels();
21      
22     Mat dst = Mat::zeros(src.size(),src.type());  //创建一个和原图像大小相同,类型相同,像素值为0的图像。
23     float alpha = 1.5;  //设置参数
24     float beta = 0;
25     
26     //对每个像素点的操作
27     for (int i = 0; i < height; i++)
28     {
29         for (int j = 0; j < width; j++)
30         {
31             if (channels == 3)     //如果是彩色图像
32             { 
33                 dst.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(alpha*(src.at<Vec3b>(i, j)[0]) + beta);
34                 dst.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(alpha*(src.at<Vec3b>(i, j)[1]) + beta);
35                 dst.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(alpha*(src.at<Vec3b>(i, j)[2]) + beta);
36             }
37             else if (channels == 1)  //灰度图像
38             {
39                 dst.at<uchar>(i,j) = saturate_cast<uchar>(alpha*(src.at<uchar>(i, j)) + beta);
40                 
41             }
42         }
43     }
44     imshow("dst_image", dst);
45     waitKey(0);
46     return 0;
47 
48 }

3.显示效果:

(1)原图:

(2)修改后的图像:

还可以改变β的值 观察显示效果

原文地址:https://www.cnblogs.com/carlber/p/9613688.html