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

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. Win10系统,开机后提示Desktp不可用的故障解决方法。

    WIN10桌面位置不可用的故障解决方法 今天电脑开机 (Win10系统).桌面空了,然后就蒙了. 系统并弹出以下框,如下图: 原因可能是因为昨天晚上熬夜测试脚本.网上下载的脚本大多都是有毒的.但是人懒 ...

  2. 探索未知种族之osg类生物---渲染遍历之裁剪一

    前言 上面我们用了四节课的内容,讲解了一些osg概念性的内部原理.希望大家可以再看今天的讲解之前先再仔细的研究一下前四节的内容.这样你就会对整个osg的渲染过程有一个更加清晰的认知,有助于理解下面两个 ...

  3. import os, glob, fnmatch--Python os/glob/fnmatch主要函数总结

    auther: Lart date: 2019-01-17 update: 2019-01-18 09:55:36 --- import os, glob, fnmatch 针对某些操作, 官方推荐这 ...

  4. 关于微信小程序切换获取不到元素的问题

    1.由于公司要实现微信小程序的自动化,所以开始学习python + appium 实现微信小程序自动化.在学习过程中遇到在切换webview后获取不到页面元素的问题,导致无法继续.今天在网上看到一篇关 ...

  5. csu1804

    /* csu 1804 因为define和const总出错,到现在也不明白为什么 不知道define 和 const 出来的 mod 有什么区别 */ #include<iostream> ...

  6. django model设计与实际数据库表的对比

    # 文章class Article(models.Model): title = models.CharField('标题', max_length=70) excerpt = models.Text ...

  7. Appium+Python自动化 4 -appium元素定位

    appium定位app上的元素方式 在前面文章中有介绍,(通过UIautomator工具查看app元素) appium定位app上的元素,可以通过id,name,class这些属性定位到 1.id 定 ...

  8. [Java算法] -- 1. 常用排序之冒泡排序和选择排序

    使用Java语言实现冒泡排序和选择排序 推荐一个数据结构可视化的网站:http://zh.visualgo.net/zh (暂时访问不了) 对排序不太熟悉的朋友,建议去上面的网站学习一下,你将会发现一 ...

  9. Selenium定位iframe动态ID

    Selenium定位iframe动态ID. 126邮箱实例 买了本虫师的书来学习selenium2自动化测试,然后写第一个实例就遇到了一些坑,好在有热心的网友提供了帮助,解决了问题 要学习seleni ...

  10. Spring 出现Could not resolve placeholder问题的解决方法

    项目开发中,使用@value注解获取不到配置文件里面的属性字段. 检查配置文件,在spring的配置文件中有配置读取,如下: <!-- 使用spring自带的占位符替换功能 --> < ...