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

2018-05-20  本文已影响325人  小嗷_a2e2

本文作者:小嗷

微信号: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邮箱通知一下,未经授权请勿转载。

上一篇下一篇

猜你喜欢

热点阅读