【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);
}
时间: 2024-08-27 21:43:23

【opencv入门之四】Trackbar、图像对比度、亮度值调整的相关文章

【OpenCV入门教程之六】 创建Trackbar &amp; 图像对比度、亮度值调整(转)

本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/21479533 作者:毛星云(浅墨)    邮箱: [email protected] 写作当前博文时配套使用的OpenCV版本: 2.4.8 这篇文章中我们一起学习了如何在OpenCV中用createTrackbar函数创建和使用轨迹条,以及图像对比度.亮度值的动态调整. 文章首先详细讲解了OpenCV2.0中的新版创建轨迹条的函数c

opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar &amp; 图像对比度、亮度值调整

http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调整 标签: opencvvs2010c++图像处理 2014-03-18 21:43 43189人阅读 评论(99) 收藏 举报  分类: [OpenCV](18)  目录(?)[+] 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qian

学习 opencv---(5) 创建Trackbar(活动条) &amp;图像对比度,亮度值调整

学习如何在opencv 中用trackbar 函数创建和使用 轨迹条,以及图像对比度,亮度值的动态调整 一.OpenCV中轨迹条(Trackbar)的创建和使用 [1]创建轨迹条-----createTrackbar 函数详解 createTrackbar这个函数我们以后会经常用到,它创建一个可以调整的轨迹条,并将轨迹条附加到指定的窗口上,使用起来方便,首先,它往往会和一个回调函数 配合起来使用,先看它的函数原型: 1 int createTrackbar(conststring &tracke

图像对比度、亮度值调整

1 #include<opencv2/opencv.hpp> 2 #include<iostream> 3 4 using namespace std; 5 using namespace cv; 6 7 static void on_ContrastAndBright(int, void *); 8 static void ShowHelpText(); 9 10 int g_nContrastValue; //对比度值 11 int g_nBrightValue; //亮度值

【OPENCV入门之六】非线性滤波(中值滤波、双边滤波)

参考网站: http://blog.csdn.net/poem_qianmo/article/details/23184547 在很多情况下,比如在噪声是散粒噪声而不是高斯噪声时(图像偶尔会出现很大的值的时候),在这种情况下,用高斯滤波器对图像进行模糊的话,噪声是不会被去除的,它们只是转换为更为柔和但仍然可见的散粒.而用非线性滤波会更好些. 1.中值滤波(Median filter)--medianBlur函数 该方法在去除脉冲噪声.斑点噪声(speckle noise).椒盐噪声(salt-a

OpenCV入门教程之七 图像滤波

滤波实际上是信号处理里的一个概念,而图像本身也可以看成是一个二维的信号.其中像素点灰度值的高低代表信号的强弱. 高频:图像中灰度变化剧烈的点. 低频:图像中平坦的,灰度变化不大的点. 根据图像的高频与低频的特征,我们可以设计相应的高通与低通滤波器,高通滤波可以检测图像中尖锐.变化明显的地方:低通滤波可以让图像变得光滑,滤除图像中的噪声. 一.低通滤波 1,blur函数 这个函数是一个平滑图像的函数,它用一个点邻域内像素的平均灰度值来代替该点的灰度. cv::blur(image,result,c

OpenCV入门之寻找图像的凸包(convex hull)

介绍   凸包(Convex Hull)是一个计算几何(图形学)中的概念,它的严格的数学定义为:在一个向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包.  在图像处理过程中,我们常常需要寻找图像中包围某个物体的凸包.凸包跟多边形逼近很像,只不过它是包围物体最外层的一个凸集,这个凸集是所有能包围这个物体的凸集的交集.如下图所示: 在上图中,绿色线条所包围的凸集即为白色图形的凸包.  在opencv中,通过函数convexHulll能很容易的得到一系列点的凸包,比如由点组成的轮廓

OpenCV入门教程之五 图像直方图的应用

正如第4篇文章所说的图像直方图在特征提取方面有着很重要的作用,本文将举两个实际工程中非常实用的例子来说明图像直方图的应用. 一.直方图的反向映射 我们以人脸检测举例,在人脸检测中,我们第一步往往需要先提取图像中皮肤区域来缩小人脸的检测范围,这一般获得皮肤的颜色范围还需要定义阈值并不断的调整,实际中参数太多而不容易控制. 这里我们就可以考虑用直方图的反射映射. 1,收集人脸皮肤样本. 2,拼合样本并计算其颜色直方图. 3,将得到的样本颜色直方图反射映射到待检测的图片中,然后进行阈值化即可. 这里为

系列文章 -- OpenCV入门教程

<OpenCV3编程入门>内容简介&勘误&配套源代码下载 [OpenCV入门教程之十八]OpenCV仿射变换 & SURF特征点描述合辑 [OpenCV入门教程之十七]OpenCV重映射 & SURF特征点检测合辑 [OpenCV入门教程之十六]OpenCV角点检测之Harris角点检测 [OpenCV入门教程之十五]水漫金山:OpenCV漫水填充算法(Floodfill) [OpenCV入门教程之十四]OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑 [Ope