opencv3.0学习笔记【10/14】contrast、brught调节

时间:2022-02-18 21:42:54
公式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);
}