OpenCV学习笔记(07):图像通道的分离和混合

时间:2022-12-26 13:23:15

1.通道分离函数split

OpenCV提供split函数将多通道的矩阵分离成单通道矩阵,原型如下:


void cv::split (const Mat & src,
Mat * mvbegin
)

参数src是输入的图像;
参数mvbegin是指向Mat类型的指针,在这里,表示存储分离出来的多通道的Mat数组;

该函数的实现公式为:
OpenCV学习笔记(07):图像通道的分离和混合

2.通道聚合函数merge

merge和split总是成对使用,像是一对形影不离的好基友,函数原型:

void cv::merge(const Mat * mv,
size_t count,
OutputArray dst
)

参数mv 对应指向分离通道的Mat数组;
参数count 表示需要合成的通道数,该通道数需>0,但实际操作过程中发现,count只能取值1,3,4
参数dst表示输出图像

3.一个例子

  • 源代码
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("E:\\1.jpg", IMREAD_COLOR);
src.convertTo(src, CV_32FC3);
src *= 1. / 255;

Mat dst;
Mat channels[3];

cout << "src.at<Vec3f>(0, 0)=" << src.at<Vec3f>(0, 0) << endl;

split(src, channels);

cout << "channels[0].at<float>(0)=" << channels[0].at<float>(0) << endl;
cout << "channels[1].at<float>(0)=" << channels[1].at<float>(0) << endl;
cout << "channels[2].at<float>(0)=" << channels[2].at<float>(0) << endl;

imshow("BLUE", channels[0]);
imshow("GREEN", channels[1]);
imshow("RED", channels[2]);

merge(channels,3,dst);

imshow("MERGE", dst);

waitKey(0);
return 0;
}
  • 运行结果
    OpenCV学习笔记(07):图像通道的分离和混合
    显然,src第(0,0)元素的BRG值被分离到channels数组的每一个元素的第一个值,
    下面是抽离出来的单通道显示图片,以及最后的聚合图片
    蓝色通道
    OpenCV学习笔记(07):图像通道的分离和混合
    绿色通道
    OpenCV学习笔记(07):图像通道的分离和混合
    红色通道
    OpenCV学习笔记(07):图像通道的分离和混合
    聚合图片
    OpenCV学习笔记(07):图像通道的分离和混合
    由于是单通道,所以显示出来的都是灰度图,对比不是那么明显,下面,我们修改一下程序,来实现一个对比明显的版本
    以蓝色为例——
  • 源程序2
#include<opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;

int main()
{
Mat src = imread("E:\\1.jpg", IMREAD_COLOR);
Mat backGround(Size(src.cols, src.rows), CV_32FC3, Scalar(0, 0, 0));
src.convertTo(src, CV_32FC3);
src *= 1. / 255;

Mat dst;
Mat channels[3];
Mat channels1[3];

split(src, channels);
split(backGround, channels1);


addWeighted(channels[0], 1.0, channels1[0], 0.5, 0, channels1[0]);
merge(channels1, 3, backGround);
imshow("BLUE", backGround);


waitKey(0);
return 0;
}
  • 运行结果
    OpenCV学习笔记(07):图像通道的分离和混合

加入一个元素全0的background合成多通道,似乎直观了很多。

4. 总结

分离通道主要用于特定通道特定用途的运算,比如说,傅里叶变换等。