图像的亮度和对比度调节
亮度和对比度调整的理论依据
首先我们给出算子的概念。一般的图像处理算子都是一个函数,它接受一个或多个输入图像,并产生输出图像。下式给出了算子的一般形式:
或者
今天我们所讲解的图像亮度和对比度的调整操作,其实属于图像处理变换中比较简单的一种——点操作(pointoperators)。点操作有一个特点,仅仅根据输入像素值(有时可加上某些全局信息或参数),来计算相应的输出像素值。这类算子包括亮度(brightness)和对比度(contrast)调整,以及颜色校正(colorcorrection)和变换(transformations)。
最两种常用的点操作(或者说点算子),很显然,是乘上一个常数(对应对比度的调节)以及加上一个常数(对应亮度值的调节)。用公式表示出来就是这样:
#include <opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include"opencv2/imgproc/imgproc.hpp" #include <iostream> using namespace std; using namespace cv; void colorReduce(const Mat& image, Mat& outImage, int g_nContrastValue, int g_nBrightValue) { int nr = image.rows; int nc = image.cols; outImage.create(image.size(), image.type()); if (image.isContinuous() && outImage.isContinuous()) { nr = 1; nc = nc*image.rows*image.channels(); } for (int i = 0; i<nr; i++) { const uchar* inData = image.ptr<uchar>(i); uchar* outData = outImage.ptr<uchar>(i); for (int j = 0; j<nc; j++) { *outData++ = saturate_cast<uchar>((g_nContrastValue*0.01)*(*inData++) + g_nBrightValue); } } } int g_nContrastValue; //对比度值 int g_nBrightValue; //亮度值 Mat g_srcImage,g_dstImage; int main( ) { //GaussianBlur(); //改变控制台前景色和背景色 system("color 5F"); //读入用户提供的图像 g_srcImage= imread( "D:\\sky.jpg"); if(!g_srcImage.data ) { printf("Oh,no,读取g_srcImage图片错误~!\n"); return false; } g_dstImage= Mat::zeros( g_srcImage.size(), g_srcImage.type() ); //设定对比度和亮度的初值 g_nContrastValue=80; g_nBrightValue=80; //创建窗口 namedWindow("【效果图窗口】", 1); auto ContrastAndBright = [](int,void*) { //创建窗口 namedWindow("【原始图窗口】", 1); colorReduce(g_srcImage, g_dstImage, g_nContrastValue, g_nBrightValue); //显示图像 imshow("【原始图窗口】", g_srcImage); imshow("【效果图窗口】", g_dstImage); }; //创建轨迹条 createTrackbar("对比度:", "【效果图窗口】",&g_nContrastValue,300, ContrastAndBright); createTrackbar("亮 度:","【效果图窗口】",&g_nBrightValue,200, ContrastAndBright); waitKey(0); return 0; }
看到这个式子,我们关于图像亮度和对比度调整的策略就呼之欲出了。
其中:
- 参数f(x)表示源图像像素。
- 参数g(x) 表示输出图像像素。
- 参数a(需要满足a>0)被称为增益(gain),常常被用来控制图像的对比度。
- 参数b通常被称为偏置(bias),常常被用来控制图像的亮度。
而更近一步,我们这样改写这个式子:
其中,i 和 j 表示像素位于第i行 和 第j列 。
那么,这个式子就可以用来作为我们在OpenCV中控制图像的亮度和对比度的理论公式了。
posted on 2017-07-28 16:50 zyz913614263 阅读(1902) 评论(0) 编辑 收藏 举报