【OpenCV学习笔记】十二、图像的对比度和亮度调整及图像通道的分离与合并

这一章讲了如下内容:

1.图像对比度及亮度调整

2.图像通道的分离与合并

先上ppt:

【OpenCV学习笔记】十二、图像的对比度和亮度调整及图像通道的分离与合并_第1张图片


【OpenCV学习笔记】十二、图像的对比度和亮度调整及图像通道的分离与合并_第2张图片


【OpenCV学习笔记】十二、图像的对比度和亮度调整及图像通道的分离与合并_第3张图片


【OpenCV学习笔记】十二、图像的对比度和亮度调整及图像通道的分离与合并_第4张图片


【OpenCV学习笔记】十二、图像的对比度和亮度调整及图像通道的分离与合并_第5张图片


【OpenCV学习笔记】十二、图像的对比度和亮度调整及图像通道的分离与合并_第6张图片

代码1:图像对比度与亮度调整

///图像对比度调整与亮度调整
//逻辑:遍历每个像素,对每个像素的每个通道进行g(i,j) = a*f(i,j)+b的操作。
//结合滑动条,两个滑动条的位置分别对应公式中a和b.注意溢出保护(saturate_cast方法)
#include "opencv2/opencv.hpp"

using namespace cv;

#define WIN_NAME "输出图像" //宏定义
Mat srcImg;
Mat dstImg;
int Contrase_Value = 20;
int Bright_Value = 20;

void OnChange(int, void*)
{
	for (int i = 0; i < srcImg.rows; i++)
	{
		for (int j = 0; j < srcImg.cols; j++)
		{
			dstImg.at(i, j)[0] = saturate_cast(Contrase_Value * 0.01 * srcImg.at(i, j)[0] + Bright_Value);
			dstImg.at(i, j)[1] = saturate_cast(Contrase_Value * 0.01 * srcImg.at(i, j)[1] + Bright_Value);
			dstImg.at(i, j)[2] = saturate_cast(Contrase_Value * 0.01 * srcImg.at(i, j)[2] + Bright_Value);
		}
	}
	//定义“原图”窗口,显示原图,CV_WINDOW_NORMAL:正常大小显示,用户可改变大小窗口
	namedWindow("原图", CV_WINDOW_NORMAL);
		imshow("原图", srcImg);
	imshow(WIN_NAME, dstImg);
}

void main()
{
	srcImg = imread("1.jpg");
	dstImg = Mat::zeros(srcImg.size(), srcImg.type());
	//Mat::zeros(); //将矩阵元素都置为0
	//Mat::ones(); //将矩阵元素都置为1
	//定义WIN_NAME窗口,显示输出图像,CV_WINDOW_NORMAL:正常大小显示,用户可改变大小窗口
	namedWindow(WIN_NAME, CV_WINDOW_NORMAL);

	//定义调整对比度的滑动条
	createTrackbar("对比度", WIN_NAME, &Contrase_Value, 300, OnChange, 0);
	//定义调整亮度的滑动条
	//同对比度滑动条依附于同一个窗口,且共用一个OnChange函数
	createTrackbar("亮   度", WIN_NAME, &Bright_Value, 200, OnChange, 0);

	OnChange(Contrase_Value, 0); //回调函数初始化(使得WIN_NAME窗口一开始就有图像)
	OnChange(Bright_Value, 0);

	waitKey(0);
}

运行结果:



代码2:图像通道分离与合并

///图像通道分离与合并
//通道分离(split函数),通道合并(merge函数)
#include "opencv2/opencv.hpp"

using namespace cv;

void main()
{
	Mat img = imread("2.jpg");
	Mat dst;
	vector channels;

    //通道分离,将图像通道分离存入Mat类型的vector容器channels中
	split(img, channels);
	Mat blueChannel = channels.at(0);//同channels[0]
	Mat greenChannel = channels.at(1);
	Mat redChannel = channels.at(2);

    //imshow("blue", blueChannel);
	//imshow("green", greenChannel);
	//imshow("red", redChannel);
    
    //通道合并,将channels中图像的三个通道,合并进图像dst中,dst同原图一样.
	merge(channels, dst);

	imshow("dst", dst);
	
    waitKey(0);
}

运行结果:




你可能感兴趣的:(OpenCV学习笔记)