opencv入门之四Trackbar图像对比度亮度值调整
Posted Haven_zhf
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了opencv入门之四Trackbar图像对比度亮度值调整相关的知识,希望对你有一定的参考价值。
参考网站:
http://blog.csdn.net/poem_qianmo/article/details/21479533
1、轨迹条(Trackbar)
createTrackbar函数(创建轨迹条)
注意:它会和一个回调函数配合使用
C++: int createTrackbar(conststring& trackbarname, conststring& winname, int* value,
int count, TrackbarCallback onChange=0, void* userdata=0);
第一个参数:trackbarname,轨迹条的名字
第二个参数:winname,填窗口的名字,表示轨迹条会依附到哪个窗口上
第三个参数:value,一个指向整型的指针,表示滑块的位置。
第四个参数:count,表示滑块可以达到的最大值。
第五个参数:onChange,默认值为0,是一个指向回调函数的指针,每次滑块改变时都会进行回调。并且这个函数原型必须为:
void XXXXX(int,void*);第一个参数:轨迹的位置。第二个参数:用户数据。
第六个参数:userdata,如果第三个参数value实参是全局变量的话,就不用管了。
//创建轨迹条
createTrackbar("对比度:",
"【效果图窗口】",
&g_nContrastValue, 300,
ContrastAndBright );
// g_nContrastValue为全局的整型变量,ContrastAndBright为回调函数的函数名(即指向函数地址的指针)
例子看回参考网站,这里就不具体描述了。例子是关于一个演示用轨迹条来控制轮廓检测的例子。
2、getTrackbarPos函数
获取当前轨迹条的位置。
C++: int getTrackbarPos(conststring& trackbarname, conststring& winname);
第一个参数:trackbarname,表示轨迹条的名字。
第二个参数:winname,表示轨迹条的父窗口的名称。
3、亮度、对比度的调整
这是最常用的点操作(点算子):
第一个参数:f(x),表示原图像像素
第二个参数:g(x),表示输出图像像素
第三个参数:a,增益(需要满足a>0),常常别用来控制图像的对比度
第四个参数:b,偏置,常常被用来控制图像的亮度
由于这个运算是对RGB图像进行运算的,每个像素都有3个值,因此需要用3个循环来解决问题:(我在思考能不能把它优化呢?)
1 //三个for循环,执行运算 new_image(i,j) =a*image(i,j) + b 2 for(int y = 0; y < image.rows; y++ ) 3 { 4 for(int x = 0; x < image.cols; x++ ) 5 { 6 for(int c = 0; c < 3; c++ ) 7 { 8 new_image.at<Vec3b>(y,x)[c]= saturate_cast<uchar> 9 ((g_nContrastValue*0.01) * (image.at<Vec3b>(y,x)[c]) + g_nBrightValue); 10 } 11 } 12 }
4、综合实践
//*************************轨迹条来控制图像对比度、亮度值调整示例程序**************************** //***********************************【头文件包含部分】***************************************** // 描述:包含程序所依赖的头文件 //********************************************************************************************** #include "opencv2/core/core.hpp" #include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include <iostream> //***********************************【命名空间声明部分】***************************************** // 描述:包含程序所使用的命名空间 //********************************************************************************************** using namespace cv; using namespace std; //***********************************【全局变量、函数声明部分】***************************************** // 描述:全局变量、函数声明 //********************************************************************************************** int g_nContrastValue; //对比度值 int g_nBrightValue; //亮度值 Mat g_srcImage, g_dstImage; static void ContrastAndBright( int, void* ); //***********************************【main()函数部分】***************************************** // 描述:控制台应用程序的入口函数,我们的程序从这里开始 //********************************************************************************************** int main() { //【0】初始化、配置 system("color 5F"); //【1】读取图像 g_srcImage = imread( "pic1.jpg" ); if(!g_srcImage.data){ printf("Oh,damm,读取g_srcImage图像错误!!!!"); return false; } g_dstImage = Mat::zeros( g_srcImage.size(), g_srcImage.type() ); //【2】设定对比度和亮度的初值 g_nContrastValue = 80; g_nBrightValue = 80; //【3】创建窗口 namedWindow("【效果图窗口】",1); //【4】创建轨迹条 createTrackbar("对比度:", "【效果图窗口】", &g_nContrastValue, 300, ContrastAndBright); createTrackbar("亮 度:", "【效果图窗口】", &g_nBrightValue, 200, ContrastAndBright); //【5】调用回调函数 ContrastAndBright( g_nContrastValue, 0 ); ContrastAndBright( g_nBrightValue, 0 ); //【6】输出一些帮助信息 cout<<endl<<"嗯,好了,请调整滚动条观察图像效果!!!\n\n" <<"\t按下“q”键时,程序退出!!!\n" <<"\n\n\t\t\t\tby"; //【7】按下“q”键时,程序退出 while( char(waitKey(1)) != ‘q‘ ){} return 0; } //***********************************【ContrastAndBright( int, void* )h函数部分】***************************************** // 描述:改变图像对比度和亮度值的回调函数 //********************************************************************************************** static void ContrastAndBright( int, void* ) { //【1】创建窗口 namedWindow( "【原始图窗口】", 1 ); //【2】三个for循环,执行 g_dsImage(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); } } } //【3】显示图像 imshow("【原始图窗口】", g_srcImage); imshow("【效果图窗口】", g_dstImage); }
以上是关于opencv入门之四Trackbar图像对比度亮度值调整的主要内容,如果未能解决你的问题,请参考以下文章
opencv中如何调整图像亮度和对比度,以及亮度和对比度调整的原理
opencv4opencv视频教程 C++ 7手动调整图像亮度与对比度 g(i, j) = αf(i, j) + β(点操作与邻域操作概念)