本系列代码托管于:https://github.com/chintsan-code/opencv4-tutorials

本篇使用的项目为:channels_split_merge

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, const char** argv) {
	Mat src = imread("../sample/lena512color.bmp");
	if (src.empty()) {
		cout << "could not load image..." << endl;
		return -1;
	}
	imshow("src", src);
	// split
	vector<Mat> channels;
	split(src, channels);
	imshow("B", channels[0]);  //单通道图像
	imshow("G", channels[1]);
	imshow("R", channels[2]);
	// merge
	Mat dst;
	channels[0] = 0;
	channels[1] = 0;
	merge(channels, dst);
	imshow("dst", dst); // 三通道,但是B、G通道都为0	
	//mixChannels
	int from_to[] = { 0,2,1,1,2,0 }; // 第1个通道交换至第3个通道,第2个通道不交换,第3个通道交换至第1个通道
	mixChannels(&src, 1, &dst, 1, from_to, 3);
	imshow("mixchannels", dst);

	waitKey(0);
	destroyAllWindows();
	return 0;
}

split:分离图像通道

void split(InputArray m, OutputArrayOfArrays mv);
  • m:输入的多通道图像
  • mv:输出的通道集合,可以使用vector<Mat>接住

merge:合并多个单通道图像为一个多通道图像

void merge(InputArrayOfArrays mv, OutputArray dst);
  • mv:输入的通道集合,所有的通道必须具有相同的尺寸和深度(depth)
  • dst:输出结果

split和merge不止可以用于拆分、合并多通道图像,也可以处理多通道Mat对象。

mixChannels:将输入图像的通道按指定规则复制到输出

void mixChannels(const Mat* src, size_t nsrcs, Mat* dst, size_t ndsts, const int* fromTo, size_t npairs);
  • src:输入图像集合,可以为多张图像,但必须有相同的尺寸和深度(depth)
  • nsrcs:src的数量
  • dst:输出图像集合,尺寸和深度和输入一致
  • ndsts:dst的数量
  • fromTo:复制的规则
  • npairs:fromTo中有多少对规则