OpenCV中图像通道的分离(split)和混合(merge)

本文详细介绍OpenCV中split()和merge()函数的使用方法,包括C++版本的两个原型,以及如何通过这两个函数实现多通道图像的通道分离与合并。提供了具体的代码示例,展示了如何将多通道矩阵中的通道分成多个单通道,并将单通道图像合并回多通道图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 split()通道分离函数

split()函数的C++版本有两个原型,他们分别是:

C++: void split(const Mat& src,  Mat*mvbegin);          //&为引用操作符

C++: void split(InputArray m, OutputArrayOfArrays mv);

使用cv::split()将多通道矩阵中的通道分成多个单通道。

第一种方法是提供一个指向C风格矩阵的指针,该矩阵包含cv::split()将要保存分离操作结果的cv::Mat对象的指针;

第二种方法是提供一个由cv::Mat对象组成的STL向量,即vector<Mat>对象。

应用示例代码如下:

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat image = imread("test.jpg");
	if (!image.data){
		cout << "read image error" << endl;
		return -1;
	}
	imshow("Orignal", image);

	vector<Mat> channels;
	split(image, channels);
#if 0
	imshow("B", channels.at(0));
	imshow("G", channels.at(1));
	imshow("R", channels.at(2));
#else
	imshow("B", channels[0]);
	imshow("G", channels[1]);
	imshow("R", channels[2]);
#endif
	waitKey(0);
	return 0;
}
//说明上述#if #else #endif中的两种方法均可以

二、 merge()通道合并函数

merge()函数的C++版本有两个原型,他们分别是:

C++: void merge(const Mat* mv, size_t count,  OutputArray dst)

C++: void merge(InputArrayOfArrays mv, OutputArray dst)

cv::merge()是cv::split()的逆运算。

      若待合并通道放在Mat mergedst[ ]这样的数组里面,则使用第一种定义方法下的merge()函数。

      第一个参数填要传入数组的地址,可直接填入数组名mergedst;第二个参数填要合并矩阵的个数,通常情况下图像大都是单通道的灰度图或三通道的真彩图,一般填1或3;最后一个参数填通道合并后的矩阵。

      若待合并通道放在vector<Mat> mergesrc这样的Mat型容器对象中,则使用第二种定义方法下的merge()函数。

      第一个参数填对象名mergedst,第二个参数填通道合并后的矩阵。相较第一种定义方法来说,本定义方法无需说明需合并矩阵的个数,默认合并容器对象内所有元素。因此可以通过更改容器对象内元素的个数来改变合并矩阵的个数。

应用示例代码如下:

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
	Mat image = imread("test.jpg");
	if (!image.data){
		cout << "read image error" << endl;
		return -1;
	}
	imshow("Orignal", image);

	vector<Mat> channels;
	//Mat channels[3];
	split(image, channels);
#if 0
	imshow("B", channels.at(0));
	imshow("G", channels.at(1));
	imshow("R", channels.at(2));
#else
	imshow("B", channels[0]);
	imshow("G", channels[1]);
	imshow("R", channels[2]);
#endif

	Mat mergedst;
#if 0
	Mat mergesrc[3] = { channels[0] , channels[1] , channels[2] };
	merge(mergesrc, 3, mergedst);
#else
	vector<Mat> mergesrc;
	mergesrc.push_back(channels[0]);
	mergesrc.push_back(channels[1]);
	mergesrc.push_back(channels[2]);
	merge(mergesrc, mergedst);
#endif
	imshow("Merged", mergedst);
	waitKey(0);
	return 0;
}
//说明上述#if #else #endif中的两种方法均可以

效果截图如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值