split(img, channels); merge(channels, dst);
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/abc8730866/article/details/62048979
这一章讲了如下内容:
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);
- //定义调整对比度的滑动条
- 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);
- }
运行结果:
#include "opencv2/opencv.hpp" using namespace cv; void main() { Mat img = imread("lena.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); vector<Mat> channels2; channels2.push_back(redChannel); channels2.push_back(greenChannel); channels2.push_back(blueChannel); merge(channels2, dst); imshow("dst", dst); waitKey(0); }

浙公网安备 33010602011771号