C++ Opencv createTrackbar()创建滑动条实现对比度、亮度调节及注意事项
一、对比度、亮度概念普及
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()创建滑动条实现对比度、亮度调节及注意事项的更多相关文章
- opencv:创建滑动条
函数原型: ,); #include <opencv.hpp> using namespace cv; #define WINDOW_NAME "线性混合示例" // ...
- python opencv:使用滑动条做调色板
cv2.getTrackbarPos() 函数的 一个参数是滑动条的名字, 第二个参数是滑动条被放置窗口的名字, 第三个参数是滑动条的默认位置. 第四个参数是滑动条的最大值, 第五个函数是回调函数,每 ...
- OpenCV学习笔记——滑动条开关
由于opencv库中并没有专门为开关而设的函数,可以用滑动条做开关 代码: #include<highgui.h> #include<cv.h> int g_switch_va ...
- opencv —— createTrackbar、getTrackbarPos 滑动条的创建和使用
创建滑动条:createTrackbar 函数 createTrackbar 函数用于创建一个可以调整数值的滑动条,并将滑动条附加在指定的窗口上. int createTrackbar(const s ...
- HighGUI图形图像界面初步——滑动条的创建和使用
---恢复内容开始--- 滑动条是OpenCV动态调节参数特别好用的一种工具,它依附于窗口而存在.由于OpenCV没有实现按钮功能,所以很多时候,我们可以用仅含0-1的滑动条来实现按钮的按下于弹起效果 ...
- python_Opencv_滑动条用法
前言: 创建一个简单的程序来说明滑动条用法:通过调节滑动条来设定画板颜色. 我们要创建一个窗口来显示显色,还有三个滑动条来设置B,G,R 的颜色. 当我们滑动滚动条是窗口的颜色也会发生相应改变. 默认 ...
- 学习 opencv---(5) 创建Trackbar(活动条) &图像对比度,亮度值调整
学习如何在opencv 中用trackbar 函数创建和使用 轨迹条,以及图像对比度,亮度值的动态调整 一.OpenCV中轨迹条(Trackbar)的创建和使用 [1]创建轨迹条-----create ...
- 滑动条 Trackbar[OpenCV 笔记9]
OpenCV中没有实现按钮的功能,我们可以利用滑动条来实现按钮功能. , ); trackbarname 轨迹条的名字. winname 窗口的名字,轨迹条会依附在这个窗口上. value 一个指向整 ...
- Opencv基础课必须掌握:滑动条做调色盘 -OpenCV步步精深
滑动条做调色盘 我们来想一下这个程序需要什么,首先需要一个窗口显示一切=.=(︿( ̄︶ ̄)︿废话一样): 说到调色盘除了画板也就是窗口(默认为黑色),调色就要涉及三种颜色 红色Red(我们用R表示), ...
随机推荐
- rest_framework的视图组件继承过哪些类?
- Maven 生成可执行的jar包
maven 默认打包生成的 jar 包是不能够直接运行的,因为带有 main 方法的类信息不会添加到 manifest 中,即打开 jar 文件中的 META-INF/MANIFEST.MF 文件,将 ...
- IDEA集成git方法
一.IDEA集成git方法 首先idea集成git我们需要先下载一个小软件,git bash 地址:https://git-scm.com/downloads .下载好了之后直接下一步下一步傻瓜试 ...
- 快速实现抖音的分享&登录(android)
快速实现抖音分享与第三方登录 准备工作 1.注册抖音的key到抖音开放平台,点击这里查看步骤: 2.集成ShareSDK到Mob官网文档页面查看即可,点击这里查看集成: 业务代码 分享要求: 视频: ...
- ASP.NET MVC4添加区域视图 找到多个与名为“home”的控制器匹配的类型
今天在项目中遇到一个问题,在MVC下想建立一个区域的后台Boss视图,出现了"找到多个与名为“home”的控制器匹配的类型"的问题,希望下面的解决方案能够帮助到大家 这是网站的整体 ...
- Jmeter 聚合报告---测试结果分析
当我们测试完后,最关心就是结果数据了,下面一起来分析Jmeter聚合报告数据. 首先来看下Jmeter的help是如何解释这些含义的. 1.Label - The label of the sampl ...
- log4j-日志记录小结
log4j.properties配置 ### 以系统输出流的方式按照指定的格式在控制台上输出日志信息 ###log4j.appender.stdout=org.apache.log4j.Console ...
- Shell中的数组及其相关操作
http://blog.csdn.net/jerry_1126/article/details/52027539 Shell中数据类型不多,比如说字符串,数字类型,数组.数组是其中比较重要的一种,其重 ...
- Redis的启动及配置
在redis已经安装完成的情况下,进入redis/bin目录下,输入命令: ./redis-server,就可以直接启动redis了,效果如图所示: 但是此时终端无法进行任何操作,按CTRL+c命令, ...
- Visual Studio学习记录
1,一些快捷键记录 1,折叠 ctrl+M+A: 折叠所有代码[官方名:折叠所有大纲提示] ctrl + M + O:折叠全部代码[官方:折叠到定义],但是这个貌似只能折叠代码,xml之类的无效.m+ ...
