图像的亮度和对比度调节 亮度和对比度调整的理论依据

首先我们给出算子的概念。一般的图像处理算子都是一个函数,它接受一个或多个输入图像,并产生输出图像。下式给出了算子的一般形式:

图像的亮度和对比度调节
亮度和对比度调整的理论依据或者图像的亮度和对比度调节
亮度和对比度调整的理论依据

今天我们所讲解的图像亮度和对比度的调整操作,其实属于图像处理变换中比较简单的一种——点操作(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图片错误~!
"); 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中控制图像的亮度和对比度的理论公式了。