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

2019-04-15 16:22发布

一、 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对象。 应用示例代码如下: #include 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 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 mergesrc这样的Mat型容器对象中,则使用第二种定义方法下的merge()函数。       第一个参数填对象名mergedst,第二个参数填通道合并后的矩阵。相较第一种定义方法来说,本定义方法无需说明需合并矩阵的个数,默认合并容器对象内所有元素。因此可以通过更改容器对象内元素的个数来改变合并矩阵的个数。 应用示例代码如下: #include 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 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 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中的两种方法均可以 效果截图如下: