【Opencv】mixChannels()函数的理解

mixChannels()函数的理解

mixChannels()是图像通道处理有关的一个函数,能够实现复杂通道的组合

1. 函数原型

1.1 函数原型(一)

void cv::mixChannels	(	
	InputArrayOfArrays 	src,
	InputOutputArrayOfArrays 	dst,
	const std::vector< int > & 	fromTo 
)	

第一个参数:输入矩阵
第二个参数:输出矩阵
第三个参数:复制列表,表示第输入矩阵的第几个通道复制到输出矩阵的第几个通道
比如 {0,2,1,1,2,0}表示:
src颜色通道0复制到dst颜色通道2
src颜色通道1复制到dst颜色通道1
src颜色通道2复制到dst颜色通道0

如图:
在这里插入图片描述
这里需要注意的是,输入矩阵和输出矩阵的结构必须是预先定义好的。

1.2 函数原型(二)

void cv::mixChannels	
(	
	const Mat * 	src,
	size_t 	nsrcs,
	Mat * 	dst,
	size_t 	ndsts,
	const int * 	fromTo,
	size_t 	npairs 
)	

第一个参数:输入矩阵
第二个参数:输入矩阵的数量
第三个参数:输出矩阵
第四个参数:输出矩阵的数量
第五个参数:复制列表
第六个参数:复制列表的数量

在这个函数原型中,如果输入矩阵和输出矩阵都写1,那么就跟第一种函数原型是一致的了。
如果不为1,就可以实现多个矩阵组合并或者一个矩阵拆分为多个复杂矩阵等功能。

2. 举例说明

2.1 颜色通道交换

这里就使用第一个函数原型进行举例介绍,自定义了一个三通道矩阵,并且把通道0和2进行了交换

Mat m(500, 500, CV_8UC3, Scalar(255, 255, 0));
	Mat m2(500, 500, CV_8UC3);
	vector<Mat> channels;
	split(m, channels);
	imshow("m", m);
	imshow("0", channels.at(0));
	imshow("1", channels.at(1));
	imshow("2", channels.at(2));

	vector<int> fromTo = {0,2,1,1,2,0};
	mixChannels(m, m2, fromTo);
	vector<Mat> channels2;
	split(m2, channels2);
	imshow("/m", m2);
	imshow("/0", channels2.at(0));
	imshow("/1", channels2.at(1));
	imshow("/2", channels2.at(2));
	waitKey(0);

交换前:

在这里插入图片描述
在这里插入图片描述

交换后:
在这里插入图片描述在这里插入图片描述

2.2 四通道矩阵分割

把一个四通道矩阵,使用mixChannels()函数分割成了一个三通道矩阵和一个单通道矩阵,并且具有对应关系:

// bgra[0] -> bgr[2], bgra[1] -> bgr[1],
// bgra[2] -> bgr[0], bgra[3] -> alpha[0]

	Mat bgra(500, 500, CV_8UC4, Scalar(255, 0, 0, 255));
	Mat bgr(bgra.rows, bgra.cols, CV_8UC3);
	Mat alpha(bgra.rows, bgra.cols, CV_8UC1);
	

	Mat out[] = { bgr,alpha };
	int fromTo[] = { 0, 2, 1, 1, 2, 0, 3, 3 };
	
	mixChannels(&bgra, 1, out, 2, fromTo, 4);
	imshow("bgra", bgra);
	imshow("bgr", bgr);
	imshow("alpha", alpha);
	
	

运行结果:
在这里插入图片描述

参考文献

[1] opencv mixChannels()详解:4通道图像分割、HSV通道获取 http://www.pianshen.com/article/4148149685/

  • 14
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值