一、 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中的两种方法均可以
效果截图如下: