8.更正曝光不足的图像(图像的对比度和亮度及轨迹条) --- O
本文作者:小嗷
微信号: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
- saturate_cast<uchar style="margin-top: 0px;">(value)确保值大小范围为0~255之间</uchar>
- Mat new_image = Mat::zeros( image.size(), image.type() ); 创建一张跟原图像大小和类型一致的空白图像、像素值初始化为0
- Mat.at<vec3b style="margin-top: 0px;">(y,x)[index]=value 给每个像素点每个通道赋值</vec3b>
3.1 createTrackbar()函数
createTrackbar()函数用来创建一个可以调节输入变量值的滑动条,并将改控件依附于指定的窗口上。在使用时需要和一个回调函数配合使用。其原型如下:
CV_EXPORTS int createTrackbar(const string& trackbarname, const string& winname,int* value, int count,TrackbarCallback onChange = 0,void* userdata = 0);
参数
- const string& trackname: 滑动条名字
- const string& winname: 想要把该滑动条依附到的窗口名字,在程序中可能该窗口名称由namedWindow()声明。
- int* value: 创建滑动条时,滑动条的初始值
- int count: 滑动条的最大值,即所有滑动条的数据变动都要在0-count之间,滑动条最小值为0
- TrackbarCallback onChange = 0: 这是指的回调函数,每次滑动条数据变化时都对该函数进行回调
- 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);
参数
- const string& trackbarname: 滑动条名称
- 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.感想- 本人是抱着玩一玩的心态,学习opencv(其实深度学习没有外界说的这么高深,小嗷是白板,而且有工作在身并且于代码无关)
- 大家可以把我的数学水平想象成初中水平,毕竟小嗷既不是代码靠吃饭又不是靠数学吃饭,毕业N年
- 写文章主要是为了后人少走点弯路,多交点朋友,一起学习
- 如果有好的图像识别群拉我进去QQ:631821577
- 就我一个白板,最后还是成的,你们别怕,慢慢来把
分享可以无数次,转载成自己文章QQ邮箱通知一下,未经授权请勿转载。
- 邮箱:631821577@qq.com
- QQ群:736854977
- 有什么疑问公众号提问,下班或者周六日回答,ths