1.通道分离函数split
OpenCV提供split函数将多通道的矩阵分离成单通道矩阵,原型如下:
void cv::split (const Mat & src,
Mat * mvbegin
)
参数src是输入的图像;
参数mvbegin是指向Mat类型的指针,在这里,表示存储分离出来的多通道的Mat数组;
该函数的实现公式为:
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;
}
- 运行结果
显然,src第(0,0)元素的BRG值被分离到channels数组的每一个元素的第一个值,
下面是抽离出来的单通道显示图片,以及最后的聚合图片
蓝色通道
绿色通道
红色通道
聚合图片
由于是单通道,所以显示出来的都是灰度图,对比不是那么明显,下面,我们修改一下程序,来实现一个对比明显的版本
以蓝色为例—— - 源程序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;
}
- 运行结果
加入一个元素全0的background合成多通道,似乎直观了很多。
4. 总结
分离通道主要用于特定通道特定用途的运算,比如说,傅里叶变换等。