3基于opencv的对比度_亮度调整_轨迹条Trackbar

来源:互联网 发布:哪个运营商的4g网络快 编辑:程序博客网 时间:2024/06/07 12:03

 

一、对比度和亮度公式 

a称为对比度,b称为亮度

1.1改变图像的对比度和亮度时,要对图像的每一个通道分别进行处理,比如RGB通道,要分别对R,G,B三个通道单独处理。

1.2对图像三个通道的每一个像素处理,代码如下:

//三个for循环,执行运算 new_image(i,j) =a*image(i,j) + b 

for (int y = 0;y < image.rows; y++)

{

   for (int x = 0;x < image.cols; x++)

   {

      for (int c = 0;c < 3; c++)

      {

         new_image.at<Vec3b>(y,x)[c] =saturate_cast<uchar>((g_nContrastValue*0.01)*(image.at<Vec3b>(y,x)[c]) + g_nBrightValue);

      }

   }

}

对比度:g_nContrastValue

亮度:g_nBrightValue

Ø  为了访问图像的每一个像素,我们使用这样的语法:image.at<Vec3b>(y,x)[c]。其中,y是像素所在的行, x是像素所在的列, c是R、G、B(对应0、1、2)其中之一。

Ø  因为我们的运算结果可能超出像素取值范围(溢出),还可能是非整数(如果是浮点数的话),所以我们要用saturate_cast对结果进行转换,以确保它为有效值。

Ø  这里的a也就是对比度,一般为了观察的效果,取值为0.0到3.0的浮点值,但是我们的轨迹条一般取值都会整数,所以在这里我们可以,将其代表对比度值的nContrastValue参数设为0到300之间的整型,在最后的式子中乘以一个0.01,这样就可以完成轨迹条中300个不同取值的变化。所以在式子中,我们会看到saturate_cast<uchar>((g_nContrastValue*0.01)*(image.at<Vec3b>(y,x)[c] ) + g_nBrightValue )中的g_nContrastValue*0.01。

 

二、轨迹条Trackbar函数

 

Matg_ScrImage, g_ScrImageboxFilter, g_ScrImageBlur, g_ScrImageGaussianBlur;

static voidon_boxFilter(int,void*);//回调函数

int main()

{

intboxFiltervalue; //轨迹条当前值

 

namedWindow("【效果图boxFilter");

createTrackbar("内核值","【效果图boxFilter",&boxFiltervalue, 50, on_boxFilter); //创建轨迹条函数,50最大值

   on_boxFilter(boxFiltervalue,0); //回调函数

waitKey(0);

   return NULL;

}

static voidon_boxFilter(int,void*)

{

boxFilter(g_ScrImage,g_ScrImageboxFilter, -1, Size(boxFiltervalue, boxFiltervalue)); //方框滤波

   imshow("【效果图boxFilter",g_ScrImageboxFilter); //显示

  

}

三、完整示例程序

//-----------------------------------【程序说明】---------------------------------------------- 

//  程序名称::【OpenCV入门教程之四】创建Trackbar&图像对比度、亮度值调整配套博文源码 

// VS2010  OpenCV版本:2.4.8 

//  2014318 Create by浅墨 

//------------------------------------------------------------------------------------------------ 

 

 

//-----------------------------------【头文件包含部分】--------------------------------------- 

//     描述:包含程序所依赖的头文件 

//---------------------------------------------------------------------------------------------- 

#include <opencv2/core/core.hpp> 

#include<opencv2/highgui/highgui.hpp> 

#include"opencv2/imgproc/imgproc.hpp" 

#include <iostream> 

 

//-----------------------------------【命名空间声明部分】--------------------------------------- 

//     描述:包含程序所使用的命名空间 

//-----------------------------------------------------------------------------------------------   

using namespacestd;

using namespacecv;

 

 

//-----------------------------------【全局函数声明部分】-------------------------------------- 

//     描述:全局函数声明 

//----------------------------------------------------------------------------------------------- 

static voidContrastAndBright(int,void *);

 

//-----------------------------------【全局变量声明部分】-------------------------------------- 

//     描述:全局变量声明 

//----------------------------------------------------------------------------------------------- 

intg_nContrastValue; //对比度值 

intg_nBrightValue;  //亮度值 

Matg_srcImage, g_dstImage;

//-----------------------------------main( )函数】-------------------------------------------- 

//     描述:控制台应用程序的入口函数,我们的程序从这里开始 

//----------------------------------------------------------------------------------------------- 

int main()

{

   //改变控制台前景色和背景色 

   system("color5F");

 

   //读入用户提供的图像 

   g_srcImage =imread("pic1.jpg");

   if(!g_srcImage.data) { printf("Ohno,读取g_srcImage图片错误~\n");returnfalse; }

   g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type());

 

   //设定对比度和亮度的初值 

   g_nContrastValue =80;

   g_nBrightValue =80;

 

   //创建窗口 

   namedWindow("【效果图窗口】", 1);

 

   //创建轨迹条 

   createTrackbar("对比度:","【效果图窗口】", &g_nContrastValue, 300, ContrastAndBright);

   createTrackbar("  度:","【效果图窗口】", &g_nBrightValue, 200, ContrastAndBright);

 

   //调用回调函数 

   ContrastAndBright(g_nContrastValue,0);

   ContrastAndBright(g_nBrightValue,0);

 

   //输出一些帮助信息 

   cout << endl<< "\t嗯。好了,请调整滚动条观察图像效果~\n\n"

      << "\t按下“q”键时,程序退出~!\n"

      << "\n\n\t\t\t\tby浅墨";

 

   //按下“q”键时,程序退出 

   while (char(waitKey(1))!='q') {}

   return0;

}

 

 

//-----------------------------ContrastAndBright( )函数】------------------------------------ 

//     描述:改变图像对比度和亮度值的回调函数 

//----------------------------------------------------------------------------------------------- 

static voidContrastAndBright(int,void *)

{

 

   //创建窗口 

   namedWindow("【原始图窗口】", 1);

 

   //三个for循环,执行运算 g_dstImage(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);

         }

      }

   }

 

   //显示图像 

   imshow("【原始图窗口】", g_srcImage);

   imshow("【效果图窗口】", g_dstImage);

}


参考内容:

http://www.cnblogs.com/mq0036/p/5902104.html

 

阅读全文
0 0
原创粉丝点击