第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<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
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)+bfor (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);
}