3基于opencv的对比度_亮度调整_轨迹条Trackbar
2017-11-17 14:34
225 查看
一、对比度和亮度公式
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
// 2014年3月18日 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_nContrastVa
cd09
lue;
//对比度值
intg_nBrightValue;
//亮度值
Matg_srcImage, g_dstImage;
//-----------------------------------【main( )函数】--------------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始
//-----------------------------------------------------------------------------------------------
int main()
{
//改变控制台前景色和背景色
system("color5F");
//读入用户提供的图像
g_srcImage =imread("pic1.jpg");
if(!g_srcImage.data) { printf("Oh,no,读取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
相关文章推荐
- OpenCV实践之路——TrackBar调整图像的亮度和对比度(OpenCV1和OpenCV2两种版本)
- 基于OpenCV调整图像的对比度和亮度
- OpenCV学习八:图片的亮度对比度调整
- 【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
- OpenCV学习-3:图像亮度和对比度调整
- opencv——轨迹条控制图像对比度与亮度
- 【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
- 【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
- [转]【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
- 基于图像内插值和外插值的亮度/对比度调整及模糊/锐化方法
- 【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
- 【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
- opencv调整图像亮度与对比度
- 【学习OpenCV】图像的亮度/对比度调整
- opencv(10)---对比度亮度调整与通道分离与合并
- OpenCV--调整图像亮度和对比度
- opencv----遍历像素、调整对比度和亮度
- OpenCV学习第七篇:调整图像亮度和对比度
- 用OpenCV实现Photoshop算法(五): 亮度对比度调整
- 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整