opencv调整图像亮度和对比度

时间:2022-03-02 08:41:42

全局变量

Mat adjMat,srcImg;
int bright,constrast;

adjMat为调整后图像,srcImg为调整前图像

bright为调整亮度,从0-300,像素值加上亮度值后减去150,就可以在-150到+150之间调整

contrast为对比度值,从0-300,像素值乘上contrast再乘上0.01后,就可以从0倍到3倍之间调整


main函数里的主要内容

main函数创建了一个显示窗口和两个滑动条,这里两个滑动条用同一个回调函数

namedWindow("亮度和对比度", CV_WINDOW_NORMAL);

createTrackbar("亮度条", "亮度和对比度", &bright, 300, on_brightandcontrast, NULL);
createTrackbar("对比度条", "亮度和对比度", &contrast, 300, on_brightandcontrast, NULL);

createTracker函数参数解释

参数一  滑动条名

参数二  滑动条所在窗口名

参数三  滑动块的位置会自动赋给这个指针指向的变量

参数四  滑动条最大值

参数五  回调函数

参数六  调用回调函数时的额外数据



两个滑动条的回调函数

void on_brightandcontrast(int, void *)
{
	
	for (int i = 0; i < adjMat.rows; ++i)
	{
		for (int j = 0; j < adjMat.cols; ++j)
		{
			for (int c = 0; c < 3; ++c)
			{
				adjMat.at<Vec3b>(i, j)[c] = saturate_cast<uchar>(srcImg.at<Vec3b>(i, j)[c] * contrast*0.01 + bright-150);
				//这里乘上0.01,减去150,为了使结果在合理的范围内
			}
		}
	}
	imshow("亮度和对比度", adjMat);
}

回调函数参数解释

参数一  滑动块的位置,由于设为全局变量,所以不管

参数二  调用时赋予的额外数据,无,不管

saturate_cast<uchar>(int)模板函数,如果参数不超过<>内类型的最大值,返回原值,超过的话返回<>内类型的最大值,这里最大值为255

main函数创建了一个显示窗口和两个滑动条