图像对比度,亮度调整
图像对比度,指不同像素间的差值,差值越大,对比度越大.
图像亮度,对于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
2 #include
3
4 using namespacestd;5 using namespacecv;6
7 Mat src, dst;8 const char * contrast_bar = "对比度";9 const char * bright_bar = "亮度";10 const char * window_name = "效果图";11 intcontrast_value;12 intbright_value;13 int max_contrast = 200; //最大对比度,为2倍
14 int max_bright = 100; //最大偏置
15 intchannels;16 static void adjustContrastAndBright(int, void *);17
18 intmain()19 {20 src = imread("D:/xiaobai.png");21 if(src.empty()) {22 cout << "could not load image..." <
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(row, col);53 //saturate_cast 限制结果在0-255之间
54 dst.at(row, col) = saturate_cast(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(row, col)[0];//blue
60 float g = src.at(row, col)[1]; //green
61 float r = src.at(row, col)[2]; //red62 //调整
63 dst.at(row, col)[0] = saturate_cast(b * contrast_value * 0.01 +bright_value);64 dst.at(row, col)[1] = saturate_cast(g * contrast_value * 0.01 +bright_value);65 dst.at(row, col)[2] = saturate_cast(r * contrast_value * 0.01 +bright_value);66 }67 }68 imshow(window_name, dst);69 }
原始图像
效果图