一、对比度、亮度概念普及

1.1对比度

对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,差异范围越大代表对比越大,差异范围越小代表对比越小。对比度对视觉效果的影响非常关键,一般来说对比度越大,图像越清晰醒目,色彩也越鲜明艳丽;而对比度小,则会让整个画面都灰蒙蒙的。高对比度对于图像的清晰度、细节表现、灰度层次表现都有很大帮助。相对而言,对比度对灰度图的影响要比彩图大。

提高图像对比度的方法:让白色区域更亮,黑色区域更暗。

1.2亮度

亮度是一个相对概念,取决于视觉感受。对数字图像而言,提高/降低亮度的方法就是增加/减小像素对应通道的灰度值。

1.3代码中用到的调节公式

                                                                                 g(i,j) = a * f(i,j) + b

f(i,j)是原图像,g(i,j)是调节后的图像,a是对比度拉伸系数,b是对亮度的偏置值。

二、代码

2.1代码如下

#include <opencv2/opencv.hpp>
#include <iostream> using namespace std;
using namespace cv; int iContrastValue = 100;
int iBrightValue = 0; Mat srcImage;
Mat dstImage; //Change the pixel values
void ChangePixelValue(Mat inputImage, Mat outputImage)
{
for (int i = 0; i < inputImage.rows; i++)
for (int j = 0; j < inputImage.cols; j++)
for (int k = 0; k < inputImage.channels(); k++)
outputImage.at<Vec3b>(i, j)[k] = saturate_cast<uchar>(inputImage.at<Vec3b>(i, j)[k] * iContrastValue / 100 + iBrightValue);
imshow("The modified image", dstImage);
} //Change the contrast value
void ChangeContrastValue(int, void*)
{
ChangePixelValue(srcImage, dstImage);
} //Change the bright value
void ChangeBrightValue(int, void*)
{
ChangePixelValue(srcImage, dstImage);
} int main()
{
srcImage = imread("toothless.jpg", 1);
dstImage = Mat::zeros(srcImage.size(), srcImage.type());
if (srcImage.data == 0)
{
cerr << "Image reading error !" << endl;
return -1;
}
namedWindow("The original image", WINDOW_NORMAL);
imshow("The original image", srcImage); //Create two trackbars
namedWindow("The modified image", WINDOW_NORMAL);
createTrackbar("The contrast value", "The modified image", &iContrastValue, 300, ChangeContrastValue, 0);
ChangeContrastValue(iContrastValue, 0);
createTrackbar("The bright value", "The modified image", &iBrightValue, 20, ChangeBrightValue, 0);
ChangeBrightValue(iBrightValue, 0);
waitKey();
return 0;
}

2.2代码经验

2.2.1createTrackbar()函数的使用

参见https://blog.csdn.net/mysee1989/article/details/41379817,较为详细。

2.2.2saturate_cast<>()防溢出函数的使用

一般情况下图像灰度值的范围都在0--255之间(CV_8U),但本程序涉及到乘法、加法等线性运算,数值很容易超出255,造成数据溢出。可用saturate_cast<>()防溢出函数将超出的值拉回范围内。拉回超范围值的原则遵循:超过上限的元素统一赋值为上限值,低于下限的元素统一赋值为下限值。

uchar a = saturate_cast<uchar>(-100); // 低于下限赋值为uchar_min:a = 0
short b = saturate_cast<short>(33333.33333); //高于上限赋值为short_max: b = 32767

2.2.3imshow()函数的放置

程序最后用imshow()函数对调节后的图像进行显示时,一定要将imshow()函数放进滑动条的回调函数内部,否则改变滑动条参数后,虽然图像矩阵的数值也会发生改变,但imshow()并不会载入新的图像矩阵并刷新显示。

注:错误之处,敬请雅正!

C++ Opencv createTrackbar()创建滑动条实现对比度、亮度调节及注意事项的更多相关文章

  1. opencv:创建滑动条

    函数原型: ,); #include <opencv.hpp> using namespace cv; #define WINDOW_NAME "线性混合示例" // ...

  2. python opencv:使用滑动条做调色板

    cv2.getTrackbarPos() 函数的 一个参数是滑动条的名字, 第二个参数是滑动条被放置窗口的名字, 第三个参数是滑动条的默认位置. 第四个参数是滑动条的最大值, 第五个函数是回调函数,每 ...

  3. OpenCV学习笔记——滑动条开关

    由于opencv库中并没有专门为开关而设的函数,可以用滑动条做开关 代码: #include<highgui.h> #include<cv.h> int g_switch_va ...

  4. opencv —— createTrackbar、getTrackbarPos 滑动条的创建和使用

    创建滑动条:createTrackbar 函数 createTrackbar 函数用于创建一个可以调整数值的滑动条,并将滑动条附加在指定的窗口上. int createTrackbar(const s ...

  5. HighGUI图形图像界面初步——滑动条的创建和使用

    ---恢复内容开始--- 滑动条是OpenCV动态调节参数特别好用的一种工具,它依附于窗口而存在.由于OpenCV没有实现按钮功能,所以很多时候,我们可以用仅含0-1的滑动条来实现按钮的按下于弹起效果 ...

  6. python_Opencv_滑动条用法

    前言: 创建一个简单的程序来说明滑动条用法:通过调节滑动条来设定画板颜色. 我们要创建一个窗口来显示显色,还有三个滑动条来设置B,G,R 的颜色. 当我们滑动滚动条是窗口的颜色也会发生相应改变. 默认 ...

  7. 学习 opencv---(5) 创建Trackbar(活动条) &图像对比度,亮度值调整

    学习如何在opencv 中用trackbar 函数创建和使用 轨迹条,以及图像对比度,亮度值的动态调整 一.OpenCV中轨迹条(Trackbar)的创建和使用 [1]创建轨迹条-----create ...

  8. 滑动条 Trackbar[OpenCV 笔记9]

    OpenCV中没有实现按钮的功能,我们可以利用滑动条来实现按钮功能. , ); trackbarname 轨迹条的名字. winname 窗口的名字,轨迹条会依附在这个窗口上. value 一个指向整 ...

  9. Opencv基础课必须掌握:滑动条做调色盘 -OpenCV步步精深

    滑动条做调色盘 我们来想一下这个程序需要什么,首先需要一个窗口显示一切=.=(︿( ̄︶ ̄)︿废话一样): 说到调色盘除了画板也就是窗口(默认为黑色),调色就要涉及三种颜色 红色Red(我们用R表示), ...

随机推荐

  1. 10.spring-boot基于角色的权限管理页面实现

    10.spring-boot基于角色的权限管理页面实现

  2. gcc8.2安装__(沒有成功)

    重要:https://gcc.gnu.org/install/prerequisites.html   官方安装所需要的工具文档 还有就是这篇文章 http://blog.51cto.com/2716 ...

  3. impala操作hase、hive

    impala中使用复杂类型(Hive):    如果Hive中创建的表带有复杂类型(array,struct,map),且储存格式(stored as textfile)为text或者默认,那么在im ...

  4. delphi fastreport 动态加载图片

    (frxReport1.FindObject('picture1') as TfrxPictureView).Picture.LoadFromFile('d:\c.jpg'); frxReport1. ...

  5. Acceptance Test - Business Readable Acceptance Test using - Specflow

    Agenda Benefits Living document Frameworks specflow supports How to integrate it in development cycl ...

  6. PCL-安装

    1.安装定期更新维护的PCL开发包. 通过PPA支持的Ubuntu系统,安装命令为: sudo add-apt-repository ppa:v-launched-jochen-sprickerhof ...

  7. echarts使用踩坑实录之气泡图

    最近想做一个统计文章点击率,评论率和点赞率的功能,听说echarts可以轻易完成它,于是我就选择使用echarts,考虑到我做的模块上文章是没有分类的,所以我的统计是基于一个个点,这一看嘛,感觉散点图 ...

  8. Html与CSS学习书单

    1.Head First HTML与CSS(第二版) 豆瓣详情 这本书非常适合入门学习HTML与CSS它的内容不一定详实,但一定是你入门的首选.作为一本引进 图书翻译尚可.目前豆瓣评分9.3.

  9. LwIP-网络接口管理

    netif      各种类型网络接口的抽象------------------netif.c  netif.h ————netif.h————————————————//网络接口最大物理地址长度,这 ...

  10. es6面向对象

    <script> class user{ constructor(name,age){ this.name=name; this.age=age; } showName(){ alert( ...