美文网首页
8.更正曝光不足的图像(图像的对比度和亮度及轨迹条) --- O

8.更正曝光不足的图像(图像的对比度和亮度及轨迹条) --- O

作者: 小嗷_a2e2 | 来源:发表于2018-05-20 14:58 被阅读325次

    本文作者:小嗷

    微信号:aoxiaoji

    简书链接:https://www.jianshu.com/u/45da1fbce7d0

    关键词:OpenCV改变图像的对比度和亮度


    1.前言.png 2.简介 2. 简介及用途

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

    4.算子概念

    改变图像的对比度和亮度,属于图像处理点操作。简单来说,对每一个像素点进行加减乘除处理。

    为啥说算子?因为对比一下图像的对比度和亮度处理公式就知道。其实,算子就是图像处理函数的一个通称专业术语,以下为改变图像的对比度和亮度的公式:

    [图片上传中...(image-130f02-1526799414260-11)]

    两个参数 6.a增益 和 7.b编制

    一般称作 增益 和 偏置 参数。我们往往用这两个参数来分别控制对比度和亮度 。

    你可以把 f(x) 看成源图像像素,把 g(x) 看成输出图像像素。

    重要的API

    1. saturate_cast<uchar style="margin-top: 0px;">(value)确保值大小范围为0~255之间</uchar>
    2. Mat new_image = Mat::zeros( image.size(), image.type() ); 创建一张跟原图像大小和类型一致的空白图像、像素值初始化为0
    3. Mat.at<vec3b style="margin-top: 0px;">(y,x)[index]=value 给每个像素点每个通道赋值</vec3b>
    8.图像的对比度和亮度及轨迹条(1)

    3.1 createTrackbar()函数

    createTrackbar()函数用来创建一个可以调节输入变量值的滑动条,并将改控件依附于指定的窗口上。在使用时需要和一个回调函数配合使用。其原型如下:

    CV_EXPORTS int createTrackbar(const string& trackbarname, const string& winname,int* value, int count,TrackbarCallback onChange = 0,void* userdata = 0);

    参数

    1. const string& trackname: 滑动条名字
    2. const string& winname: 想要把该滑动条依附到的窗口名字,在程序中可能该窗口名称由namedWindow()声明。
    3. int* value: 创建滑动条时,滑动条的初始值
    4. int count: 滑动条的最大值,即所有滑动条的数据变动都要在0-count之间,滑动条最小值为0
    5. TrackbarCallback onChange = 0: 这是指的回调函数,每次滑动条数据变化时都对该函数进行回调
    6. void* userdata = 0: 这个是用户传给回调函数的数据,用来处理滑动条数值变动。如果在创建滑动条时,输入value实参是全局变量,则本参数userdata可使用默认值0.

    用途:用来手动调整一些值大小(使用addWeighted函数对图像进行线性混合)

    9.轨迹条.png

    这里需要说明的是滑动条中的回调函数原型必须为:

    void FunctionName(int, void*);

    第一个参数是滑动条位置,第二个参数是userdata即用户数据。回调函数是通过函数指针调用的函数,如果回调是NULL指针表示没有回调函数的调用。

    getTrackbarPos()函数

    这个函数用于获取当前轨迹条的位置并返回,与createTrackbar()函数配合使用。其函数原型如下:

    CVEXPORTSW int getTrackbarPos(const string& trackbarname, const string& winname);

    参数

    1. const string& trackbarname: 滑动条名称
    2. const string& winname: 滑动条所依附窗口的名称

    3.2 图像的对比度和亮度

    这个具体由代码实现,代码上在细说

    用途:调整图像的亮度和对比度,使图像更好的识别

    10.图像对比度图

    注意哦:打个比方,我们自动驾驶时,要识别前方车辆,天气比较暗。我们就需要使用它(图像的对比度和亮度及轨迹条)

    [图片上传失败...(image-6ff63e-1526799414259)]

    [图片上传失败...(image-2d3c8f-1526799414259)]

    [图片上传中...(image-cb550-1526799414259-3)]

    //-----------------------------------【头文件包含部分】---------------------------------------
    //  描述:包含程序所依赖的头文件
    //---------------------------------------------------------------------------------------------- 
    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include "opencv2/imgproc/imgproc.hpp"
    #include <iostream>
    
    //-----------------------------------【命名空间声明部分】---------------------------------------
    //  描述:包含程序所使用的命名空间
    //-----------------------------------------------------------------------------------------------   
    using namespace std;
    using namespace cv;
    
    //-----------------------------------【全局函数声明部分】--------------------------------------
    //  描述:全局函数声明
    //-----------------------------------------------------------------------------------------------
    static void ContrastAndBright(int, void *);
    
    //-----------------------------------【全局变量声明部分】--------------------------------------
    //  描述:全局变量声明
    //-----------------------------------------------------------------------------------------------
    int g_nContrastValue; //对比度值
    int g_nBrightValue;  //亮度值
    Mat g_srcImage, g_dstImage;
    //-----------------------------------【main( )函数】--------------------------------------------
    //  描述:控制台应用程序的入口函数,我们的程序从这里开始
    //-----------------------------------------------------------------------------------------------
    int main()
    {
        //改变控制台前景色和背景色
        system("color 2F");
        // 读入用户提供的图像
        g_srcImage = imread("D://1.jpg");
        if (!g_srcImage.data) { printf("读取g_srcImage图片错误~! \n"); return false; }
        g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type());
    
        //设定对比度和亮度的初值
        g_nContrastValue = 80;
        g_nBrightValue = 80;
    
        //创建窗口
        namedWindow("【效果图窗口】", 1);
    
        //创建轨迹条
        createTrackbar("对比度:", "【效果图窗口】", &g_nContrastValue, 300, ContrastAndBright);
        createTrackbar("亮   度:", "【效果图窗口】", &g_nBrightValue, 200, ContrastAndBright);
    
        //调用回调函数
        ContrastAndBright(g_nContrastValue, 0);
        ContrastAndBright(g_nBrightValue, 0);
    
        //输出一些帮助信息
        cout << endl << "\t运行成功,请调整滚动条观察图像效果\n\n"
            << "\t按下“q”键时,程序退出\n";
    
        //按下“q”键时,程序退出
        while (char(waitKey(1)) != 'q') {}
        return 0;
    }
    
    //-----------------------------【ContrastAndBright( )函数】------------------------------------
    //  描述:改变图像对比度和亮度值的回调函数
    //-----------------------------------------------------------------------------------------------
    static void ContrastAndBright(int, void *)
    {
    
        // 创建窗口
        namedWindow("【原始图窗口】", 1);
    
        // 三个for循环,执行运算 g_dstImage(i,j) = a*g_srcImage(i,j) + b
        for (int y = 0; y < g_srcImage.rows; y++)
        {
            for (int x = 0; x < g_srcImage.cols; x++)
            {
                for (int c = 0; c < 3; c++)
                {
                    g_dstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>((g_nContrastValue*0.01)*(g_srcImage.at<Vec3b>(y, x)[c]) + g_nBrightValue);
                }
            }
        }
    
        // 显示图像
        imshow("【原始图窗口】", g_srcImage);
        imshow("【效果图窗口】", g_dstImage);
    }
    
    

    效果图

    12.效果图 14.感想
    1. 本人是抱着玩一玩的心态,学习opencv(其实深度学习没有外界说的这么高深,小嗷是白板,而且有工作在身并且于代码无关)
    2. 大家可以把我的数学水平想象成初中水平,毕竟小嗷既不是代码靠吃饭又不是靠数学吃饭,毕业N年
    3. 写文章主要是为了后人少走点弯路,多交点朋友,一起学习
    4. 如果有好的图像识别群拉我进去QQ:631821577
    5. 就我一个白板,最后还是成的,你们别怕,慢慢来把
    7.二维码

    分享可以无数次,转载成自己文章QQ邮箱通知一下,未经授权请勿转载。

    • 邮箱:631821577@qq.com
    • QQ群:736854977
    • 有什么疑问公众号提问,下班或者周六日回答,ths

    相关文章

      网友评论

          本文标题:8.更正曝光不足的图像(图像的对比度和亮度及轨迹条) --- O

          本文链接:https://www.haomeiwen.com/subject/anhtjftx.html