opencv3 学习五 - 合并与分割通道
合并与分割通道
程序如下
#include "opencv2/opencv.hpp"
using namespace cv;
int main()
{
Mat original = imread("girl.jpg",CV_LOAD_IMAGE_COLOR);
Mat splitChannels[3]; // 声明Mat数组,共3个元素,存放分离后的通道
split(original, splitChannels); // 分离original
// 分别显示B,G,R,
imshow("B", splitChannels[0]);
imshow("G", splitChannels[1]);
imshow("R", splitChannels[2]);
waitKey();
// 把 R 通道像素值全部清零,那么这个通道就显示为黑色
splitChannels[2] = Mat::zeros(splitChannels[2].size(), CV_8UC1);
Mat output;
// 把3个通道合并,保存到output中, 然后显示
merge(splitChannels, 3, output);
imshow("Merged", output);
waitKey();
return 0;
}
运行结果如下:
最后的图片就是合并通道后的图片, R 通道全部置零,和上篇博客中最后一幅图效果是一样的。
1. split函数,分离通道
函数原型:
void split(const Mat& src, vector<Mat>& dst);
参数说明:
- src: 原始彩色图像,这里就是original
- dst: 分离后3通道图像保存的Mat数组,这里选择只有3个元素的 splitChannels
2. Mat.zeros 成员函数,生产一个所有元素为零的矩阵
函数原型:
static MatExpr cv::Mat::zeros(Size size, int type);
参数说明:
- size: 生成的Mat的尺寸
- type:生产的Mat的类型,这里用CV_8UC1,表示8bit,uchar,1 个通道。
splitChannels[2] = Mat::zeros(splitChannels[2].size(), CV_8UC1);
这条语句是把分割后的通道splitChannels[2]全部置零。
3. merge函数,合并通道
函数原型:
void cv::merge(const Mat* mv, size_t count, OutputArray dst);
参数说明:
- mv: 待合并的通道
- count: 合并通道数
- dst: 输出的Mat变量