索引地址:系列索引
在OpenCV4入门教程010:颜色空间 中简单介绍了通道的概念。有时为了更好的观察一些图像材料的特征,需要对RGB三个颜色的分量进行分别的显示和调整,通过OpenCV的split和merge方法可以很方便的达到目的。
分离通道split()函数:用于将一个多通道数组分离成几个单通道数组,这里的array按语境翻译为数组或阵列。
函数原型:
1 2 void split (const Mat& src, Mat* mvbegin) ;void split (InputArray m, OutputArrayOfArrays mv) ;
第一个参数:src或者m填我们需要进行分离的多通道数组; 第二个参数:mv填 输出数组 或者 输出的vector容器。 测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include <opencv2/opencv.hpp> using namespace cv;int main (int argc,char ** argv) { std::vector<Mat> channels; Mat imageBlueChannel; Mat imageGreenChannel; Mat imageRedChannel; Mat srcImage = imread ("1.jpg" , 1 ); if (!srcImage.data) { std::cout << "图像读入失败!" << std::endl; exit (1 ); } split (srcImage, channels); imageBlueChannel = channels.at (0 ); imageGreenChannel = channels.at (1 ); imageRedChannel = channels.at (2 ); imshow ("Original" , srcImage); imshow ("<1>Blue channel" , imageBlueChannel); imshow ("<2>Green channel" , imageGreenChannel); imshow ("<3>Red channel" , imageRedChannel); waitKey (0 ); return 0 ; }
测试结果:
合并通道merge()函数:split()函数的逆向操作——将多个数组合并成一个多通道数组,将给定的这些孤立的单通道数组合并成一个多通道数组,从而创建一个由多个单通道阵列组成的多通道阵列。
函数原型:
1 2 void merge (const Mat* mv, size_tcount, OutputArray dst) ;void merge (InputArrayofArrays mv,OutputArray dst) ;
第一个参数:mv,填需要被合并的输入矩阵 或 vector容器的阵列; 第二个参数:count,当mv为一空白C数组时,代表输入矩阵的个数,显然必须大于1; 第三个参数:dst,即输出矩阵,和mv[0]具有相同的尺寸和深度,并且通道的数量是矩阵阵列中通道的总数。 测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #include <opencv2/opencv.hpp> using namespace cv;int main (int argc, char **crgv) { Mat imageBlueChannel; Mat imageGreenChannel; Mat imageRedChannel; Mat mergeImage; Mat srcImage = imread ("1.jpg" , 1 ); std::vector<Mat> channels; split (srcImage, channels); imageBlueChannel = channels.at (0 ); imageGreenChannel = channels.at (1 ); imageRedChannel = channels.at (2 ); imshow ("Blue" , imageBlueChannel); imshow ("Green" , imageGreenChannel); imshow ("Red" , imageRedChannel); merge (channels, mergeImage); imshow ("Result" , mergeImage); waitKey (0 ); return 0 ; }
测试结果:
最后结果是合并三个通道的结果,可以测试只合并一两个通道的结果。