【学习OpenCV4】图像通道的分离、合并与混合方法(C++)

一、图像通道的分离

void split(
	const cv::Mat& image, //输入图像
	vector<Mat>& mv // 输出的多通道序列(n个单通道序列)
);

  输出的多通道序列一般使用 std::vector<Mat> mv; 来存储,mv[0]mv[1]mv[2]、分别对应BGR三个通道。
  
  示例代码:

void MyDemo::channels_Demo(Mat& image) {
	std::vector<Mat> mv;
	split(image, mv);
	imshow("Blue Channel", mv[0]);
	imshow("Green Channel", mv[1]);
	imshow("Red Channel", mv[2]);
}

二、通道的合并

  但是现在显示的相当于是三张单通道的图像,也就相当于三张灰度图像。要想让三张图像恢复直观意义上的色彩,就需要使用下面通道合并的方法了。

  通道的合并需要用到 merge() 函数。

void merge(
	const vector<cv::Mat>& mv, // 输入的多通道序列(n个单通道序列)
	cv::OutputArray dst // 输出图像,包含mv
);

  根据 merge() 函数的定义,我们只需要控制输入的多通道数组 mv[] 中的三个值,就可以实现通道的合并。

  示例代码:

void MyDemo::channels_Demo(Mat& image) {
	std::vector<Mat> mv;
	split(image, mv);
	
	Mat m1,m2,m3;
	mv[1] = 0;
	mv[2] = 0;
	merge(mv, m1);
	imshow("Blue Channel", m1);

	split(image, mv);
	mv[0] = 0;
	mv[2] = 0;
	merge(mv, m2);
	imshow("Green Channel", m2);

	split(image, mv);
	mv[0] = 0;
	mv[1] = 0;
	merge(mv, m3);
	imshow("Red Channel", m3);
}

  我们已经知道如何将图像的三个通道提取出来了,因此我们可以将三个通道进行任意组合,合并出我们想要的图片。

三、通道的混合

  通道的混合也是将三个通道进行任意排列

C++: void mixChannels(const Mat*src, size_t nsrcs, Mat* dst, size_t ndsts, const int* fromTo, size_t npairs)
参数作用
src输入矩阵
nsrcs输入矩阵的个数
dst输出矩阵
ndsts输出矩阵的个数
fromTo序号对向量
void MyDemo::channels_Demo(Mat& image) {
	Mat dst = Mat::zeros(image.size(), image.type());
	int ft[] = { 0,2,1,1,2,0 };//互换1、3通道
	mixChannels(&image,1, &dst,1, ft,3);
	imshow("Mix", dst);
}
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Huffiee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值