• 图像的亮度和对比度调节


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

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

    或者

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

  • 相关阅读:
    Android学习笔记——启动Activity及Activity生命周期
    TransposonPSI——转座子分析的入门自学
    关于 GraPhlAn 的孤独自学
    Javascript 正则表达式 子表达式
    关于set,list,map的理解
    js关于日期的操作
    JDBC和JTA事务区别
    远程调试本地服务或程序
    Fragment的数据传递
    记录自己的第一篇博客
  • 原文地址:https://www.cnblogs.com/zendu/p/7251175.html
Copyright © 2020-2023  润新知