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 }
原始图像
效果图
标签:src,int,value,OpenCV,bright,亮度,对比度,col,row 来源: https://www.cnblogs.com/zmm1996/p/10662502.html