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表示), ...
随机推荐
- 处理ajax数据;数据渲染
当我们用ajax把数据拿到前台,该如何渲染到页面,有以下几种方式: 一:使用字符串拼接的方法 声明一个空变量,然后拼接 var st=""; st+="<div&g ...
- JavaScript并发模型与Event Loop (转载)
并发模型可视化描述 model.svg 如上图所示,Javascript执行引擎的主线程运行的时候,产生堆(heap)和栈(stack),程序中代码依次进入栈中等待执行, 若执行时遇到异步方法,该异步 ...
- 分析easyswoole3.0源码,服务启动为例(一)
swoole已经升级到4了,主要的特性是更好的支持协程,easyswoole也为了更好支持协程推出了es3.我本地环境是php7.2.9 centos7 在github下载最新的3.0的demo.地址 ...
- python rsa 加密
rsa 非对称加密, 公钥加密, 私钥解密, 有公钥无法推导出私钥, 私钥保密 import rsa n = 1024 # n 越大生成公钥, 秘钥及加密解密所需时间就越长 key = rsa.new ...
- node.js 调试 eggs launch.json配置信息
{ // 使用 IntelliSense 了解相关属性. // 悬停以查看现有属性的描述. // 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linki ...
- 51ak带你看MYSQL5.7源码4:实现SQL黑名单功能
博客迁移至: https://www.dboop.com/ 从事DBA工作多年 MYSQL源码也是头一次接触 尝试记录下自己看MYSQL5.7源码的历程 申明:个人Python编程很溜,但是C++还停 ...
- Java Swing实现展示数据,以及过滤排序
public class RelationCostctrTable extends DefaultTableModel { public RelationCostctrTable(Vector< ...
- eclipse汉化包
把eclipse英文汉化成中文,首先我们要知道自己安装的eclipse版本,可以在eclipse的安装目录下找到readme用浏览器打开查看版本,或者用记事本打开.eclipseproduct文件,查 ...
- Chapter6_访问权限控制_类的访问权限
在Java中,访问权限修饰词也可以用于确定库中的哪些类对于该库的使用者是可用的,类既不可以是private也不可以是protected的,对于类的访问权限,只有两种选择:包访问权限或者public.下 ...
- K/3 Cloud移动BOS开发技巧 -- K/3 Cloud多数据中心时如何支持发布到云之家.
我们知道K/3 Cloud和云之家进行集成,在管理中心里面有个设置,移动账套启用,只能支持一个账套启用那么能不能支持两个账套部署到云之家中呢?其实移动BOS平台默认是支持,答案就在发布到云之家的菜单中 ...