OpenCV基础(四)---图像对比度,亮度调整

图像对比度,亮度调整

图像对比度,指不同像素间的差值,差值越大,对比度越大.

图像亮度,对于RGB图像,亮度最大为(255,255,255),最暗为(0,0,0).

调整公式如上,f(x)为源图像,g(x)为输出图像

       α为增益,用于设置图像对比度

       β为偏置,用于调整图像亮度

函数介绍:createTrackbar()

这里创建了两个滑动条,用于调整α,β

函数原型: int createTrackbar(const String& trackbarname, const String& winname,
              int* value, int count,
              TrackbarCallback onChange = 0,
              void* userdata = 0);

参数说明:

const String& trackbarname:滑动条的名字

const String& winname:窗口的名称,该窗口将用作创建的滑动条的父窗口

int* value:值可选指针,指向一个整型变量,其值反映滑块的位置。创建时,滑块位置由该变量定义

int count:滑块的最大位置。最小位置总是0。

TrackbarCallback onChange = 0:指针指向每次滑块改变位置时要调用的函数。这个函数的原型应该是void Foo(int,void\*);,其中第一个参数是trackbar位 置,第二个参数是用户数据(参见下一个参数)。如果回调是空指针,则不调用回调,只更新值

void* userdata = 0: 作为回调函数传递的用户数据。它可以在不使用全局变量的情况下处理trackbar事件

代码演示

 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3 
 4 using namespace std;
 5 using namespace cv;
 6 
 7 Mat src, dst;
 8 const char * contrast_bar = "对比度";
 9 const char * bright_bar = "亮度";
10 const char * window_name = "效果图";
11 int contrast_value;
12 int bright_value;
13 int max_contrast = 200;    //最大对比度,为2倍  
14 int max_bright = 100;   //最大偏置
15 int channels;
16 static void adjustContrastAndBright(int, void *);
17 
18 int main()
19 {
20     src = imread("D:/xiaobai.png");
21     if (src.empty()) {
22         cout << "could not load image..." << endl;
23         return false;
24     }
25     imshow("xiaobai", src);
26     dst = Mat::zeros(src.size(), src.type());
27     channels = src.channels();  //获取图像通道数
28     contrast_value = 100;  //设置初始对比度   
29     bright_value = 0;   //设置初始亮度
30 
31     namedWindow(window_name, CV_WINDOW_AUTOSIZE);
32 
33     //创建轨迹条
34     createTrackbar(contrast_bar, window_name, &contrast_value, max_contrast, adjustContrastAndBright);
35     createTrackbar(bright_bar, window_name, &bright_value, max_bright, adjustContrastAndBright);
36     
37     //调用回调函数
38     adjustContrastAndBright(contrast_value, 0);
39     adjustContrastAndBright(bright_value, 0);
40 
41     waitKey(0);
42     return 0;
43 }
44 
45 static void adjustContrastAndBright(int, void *)
46 {
47     switch (channels)
48     {
49     case 1:
50         for (int row = 0; row < src.rows; row++)
51             for (int col = 0; col < src.cols; col++){
52                 float v = src.at<uchar>(row, col);
53                 // saturate_cast 限制结果在0-255之间
54                 dst.at<uchar>(row, col) = saturate_cast<uchar>(v * contrast_value * 0.01 + bright_value); //调整
55         }
56     case 3:
57         for (int row = 0; row < src.rows; row++)
58             for (int col = 0; col < src.cols; col++) {
59                 float b = src.at<Vec3b>(row, col)[0];// blue
60                 float g = src.at<Vec3b>(row, col)[1]; // green
61                 float r = src.at<Vec3b>(row, col)[2]; // red            
62                 //调整
63                 dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b * contrast_value * 0.01 + bright_value);
64                 dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g * contrast_value * 0.01 + bright_value);
65                 dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r * contrast_value * 0.01 + bright_value);
66             }
67     }
68     imshow(window_name, dst);
69 }

原始图像

效果图

       

 

猜你喜欢

转载自www.cnblogs.com/zmm1996/p/10662502.html