您的位置:首页 > 运维架构

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

2017-03-14 18:53 756 查看
这一章讲了如下内容:

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

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

先上ppt:













代码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<Vec3b>(i, j)[0] = saturate_cast<uchar>(Contrase_Value * 0.01 * srcImg.at<Vec3b>(i, j)[0] + Bright_Value);
dstImg.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(Contrase_Value * 0.01 * srcImg.at<Vec3b>(i, j)[1] + Bright_Value);
dstImg.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(Contrase_Value * 0.01 * srcImg.at<Vec3b>(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);

4000
//定义调整对比度的滑动条
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<Mat> 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);
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: