公式g(x)=a*f(x)+b,a为对比度,b为亮度
/////////code///////////////////////////////////////////////////////////////////
#include <iostream> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; static void on_ContrastAndBright(int, void*);//轨迹条的回调函数,参数必须是(int,void*),第一个是滑动条的位置,第二个是额外参数,creatTrackbar的参数六 Mat src, dst; int bright ; int contrast ; int main() { src = imread("C:\\Users\\许蔓延\\Documents\\Visual Studio 2015\\Projects\\Project1\\lena.jpg"); if (!src.data) { printf("读取原图失败"); return false; } dst = Mat::zeros(src.size(), src.type()); int bright = 80; int contrast = 80; namedWindow("亮度和对比度",1); createTrackbar("亮度条", "亮度和对比度", &bright, 1000, on_ContrastAndBright, NULL); createTrackbar("对比度条", "亮度和对比度", &contrast, 1000, on_ContrastAndBright, NULL); //createTracker函数参数解释 // 参数一 滑动条名 // 参数二 滑动条所在窗口名 // 参数三 滑动块的位置会自动赋给这个指针指向的变量 // 参数四 滑动条最大值 // 参数五 回调函数 // 参数六 调用回调函数时的额外数据 on_ContrastAndBright(bright, 0); on_ContrastAndBright(contrast, 0); while (char(waitKey(1)) != 'q') { } return 0; } static void on_ContrastAndBright(int, void *) { namedWindow("原图", 1); for (int i = 0; i < src.rows; i++) { for (int j = 0; j < src.cols; j++) { for (int c = 0; c < 3; c++) { dst.at<Vec3b>(i, j)[c] = saturate_cast<uchar>(src.at<Vec3b>(i, j)[c] * contrast*0.01 + bright );//乘0.01,范围300,则对比度在1到3倍变化,staturate_cast模板函数防止溢出 } } } imshow("原图", src); imshow("亮度和对比度",dst); }