《OpenCV3编程入门》学习笔记5 Core组件进阶(四)图像对比度、亮度值调整

第5章 Core组件进阶

5.4 图像对比度、亮度值调整

5.4.1 理论依据

1.算子:一般图像处理算子都是一个函数,接受一个或多个输入图像,并产生输出图像
2.算子一般形式:在这里插入图片描述
3.点操作(point operators):仅根据输入像素值计算输出像素值,这类算子包括亮度(brightness)和对比度(contrast)调整、颜色矫正(color correction)、变换(transformations)
4.两种最常用的点操作是乘上一个常数(对应对比度调节)以及加上一个常数(对应亮度值调节)
(1)公式如下:在这里插入图片描述(具体到像素:在这里插入图片描述
(2)f(x)表示源图像像素,g(x)表示输出图像像素,a控制图像对比度(被称为增益gain),b控制图像亮度(被称为偏置bias)

5.4.2 示例程序

#include
#include
#include
using namespace cv;
using namespace std;

//全局函数声明
static void on_ContrastAndBright(int, void *);
//全局变量声明
int g_nContrastValue;//对比度值
int g_nBrightValue;//亮度值
Mat g_srcImage, g_dstImage;

int main()
{
	//[1]输入图像
	g_srcImage = imread("love.jpg");
	if (!g_srcImage.data) { printf("读取图片错误,请确定目录下是否有imread函数指定图片存在~!"); return false; }
	g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type());

	//[2]设定对比度和亮度初值
	g_nContrastValue = 80;
	g_nBrightValue = 80;
	
	//[3]创建效果图窗口
	namedWindow("[效果图窗口]");

	//[4]创建轨迹条
	createTrackbar("对比度:", "[效果图窗口]", &g_nContrastValue, 300, on_ContrastAndBright);
	createTrackbar("亮  度:", "[效果图窗口]", &g_nBrightValue, 200, on_ContrastAndBright);

	//[5]进行回调函数初始化
	on_ContrastAndBright(g_nContrastValue, 0);
	on_ContrastAndBright(g_nBrightValue, 0);

	//[6]按下"q"键时,程序退出

	while(char(waitKey(1))!='q'){ }
	return 0;
}
//改变图像对比度和亮度值的回调函数
static void on_ContrastAndBright(int, void *)
{
	//创建窗口
	namedWindow("[原始图窗口]");
	//三个for循环,执行运算g_dstImage(i,j)=a*g_srcImage(i,j)+b
	for (int x = 0; x < g_srcImage.rows; x++)
	{
		for (int y = 0; y < g_srcImage.cols; y++)
		{
			for (int c = 0; c < 3; c++)
			{
				g_dstImage.at<Vec3b>(x, y)[c] = saturate_cast<uchar>((g_nContrastValue*0.01)*(g_srcImage.at<Vec3b>(x, y)[c]) + g_nBrightValue);
				//saturate_cast模板函数,用于溢出保护,原理:if(data<0) data=0; else if(data>255) data=255;
				//a的取值为0.0-3.0的浮点值,但轨迹条一般取整数,将对比度值nContrastValue参数设为0到300,式子中乘以0.01
			}
		}
	}
	//显示图像
	imshow("[原始图窗口]", g_srcImage);
	imshow("[效果图窗口]", g_dstImage);
}

你可能感兴趣的:(OpenCV)