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 轨迹条Trackba应用

OpenCV 轨迹条Trackba应用

实例:通过滑动条调节亮度和对比度

opencv中如何调整图像亮度和对比度,以及亮度和对比度调整的原理

opencv4opencv视频教程 C++ 7手动调整图像亮度与对比度 g(i, j) = αf(i, j) + β(点操作与邻域操作概念)

opencv 图像对比度亮度调整