参考网站:
http://blog.csdn.net/poem_qianmo/article/details/21176257
1、分离颜色通道,split函数
将一个多通道数组分离成几个单通道数组。
split的原型有两个:
1 C++: void split(const Mat& src, Mat*mvbegin); 2 C++: void split(InputArray m,OutputArrayOfArrays mv);
第一个参数:填我们需要进行分离的多通道数组
第二个参数:填函数的输出数组名 或者 vector容器
1 srcImage; 2 Mat imageROI; 3 vector<Mat> channels; 4 srcImage= cv::imread("dota.jpg");
5 // 把一个3通道图像转换成3个单通道图像 6 split(srcImage,channels);//分离色彩通道 7 imageROI=channels.at(0);
8 addWeighted(imageROI(Rect(385,250,logoImage.cols,logoImage.rows)), 9 1.0, 10 logoImage, 11 0.5, 12 0.0, 13 imageROI(Rect(385,250,logoImage.cols,logoImage.rows))); 14 15 merge(channels,srcImage4); 16 17 namedWindow("sample"); 18 imshow("sample",srcImage);
2、合并多通道,merge函数
将多个数组组合合并成一个多道的数组。
其原型有两个:
1 C++: void merge(const Mat* mv, size_tcount, OutputArray dst) 2 C++: void merge(InputArrayOfArrays mv,OutputArray dst)
第一个参数:mv,填需要被合并的输入矩阵
第二个参数:count,当mv为一个空白的C数组时,代表输入矩阵的个数,必须大于1.???不懂
第三个参数:dst,即输出矩阵
1 vector<Mat> channels; 2 Mat imageBlueChannel; 3 Mat imageGreenChannel; 4 Mat imageRedChannel; 5 srcImage4= imread("dota.jpg"); 6 // 把一个3通道图像转换成3个单通道图像 7 split(srcImage4,channels);//分离色彩通道 8 imageBlueChannel = channels.at(0); 9 imageGreenChannel = channels.at(1); 10 imageRedChannel = channels.at(2);
3、综合示例
1 //*************************【头文件包含部分】********************************** 2 //描述:包含程序所有依赖的头文件 3 //******************************************************************************* 4 #include <cv.h> 5 #include <highgui.h> 6 #include <iostream> 7 8 9 //*************************【命名空间声明部分】********************************** 10 //描述:包含程序所使用的命名空间 11 //******************************************************************************* 12 using namespace cv; 13 using namespace std; 14 15 16 //*************************【全局空间声明部分】********************************** 17 //描述:全局函数声明 18 //******************************************************************************* 19 bool MultiChannelBlending_Blue(); 20 bool MultiChannelBlending_Green(); 21 bool MultiChannelBlending_Red(); 22 23 //*************************【main()函数部分】********************************** 24 //描述:控制台应用程序的入口函数,我们的程序从这里开始 25 //******************************************************************************* 26 int main() 27 { 28 system("color 5E"); 29 30 if(MultiChannelBlending_Blue() && MultiChannelBlending_Green() && MultiChannelBlending_Red()) 31 cout<<endl<<"嗯,好了,得出了你需要的混合值图像!!!!"; 32 33 waitKey(0); 34 return 0; 35 } 36 37 38 39 //*************************【MultiChannelBlending()部分】********************************** 40 //描述:多通道混合的实现函数 41 //******************************************************************************* 42 bool MultiChannelBlending_Blue() 43 { 44 //【0】定义相关变量 45 Mat srcImage; 46 Mat logoImage; 47 vector<Mat>channels; 48 Mat imageBlueChannel; 49 Mat imageGreenChannel; 50 51 //【1】读入图片 52 logoImage = imread("dota_logo.jpg",0); 53 srcImage = imread("dota.jpg"); 54 if(!logoImage.data){ printf("oh,no,读取logoImage错误!!!!\n"); return false; } 55 if(!srcImage.data){ printf("oh,no,读取srcImage错误!!!!\n"); return false; } 56 57 //【2】把一个3通道图像转换成3个单通道图像 58 split( srcImage, channels ); //分离彩色通道 59 60 //【3】将原图的蓝色通道引用返回给imageBlueChannel,注意是引用,相当于两者等价,修改其中一个另一个跟着变 61 imageBlueChannel = channels.at(0); //蓝色 62 63 //【4】将原图的蓝色通道的(500,250)坐标处右下方的一块区域和logo图像进行加权操作, 64 // 将得到的混合结果存到imageBlueChannel中 65 addWeighted( imageBlueChannel(Rect(800,350,logoImage.cols,logoImage.rows)), 66 1.0, 67 logoImage, 68 0.5, 69 0, 70 imageBlueChannel(Rect(800,350,logoImage.cols,logoImage.rows)) ); 71 72 //【5】将三个单通道重新合并成一个三通道 73 merge( channels, srcImage ); 74 75 //【6】显示效果图 76 namedWindow("<1>游戏原图+logo蓝色通道"); 77 imshow("<1>游戏原图+logo蓝色通道", srcImage); 78 79 //【7】输出图像 80 imwrite("dota_logoblue.jpg",srcImage); 81 82 return true; 83 } 84 85 bool MultiChannelBlending_Green() 86 {........} 87 88 bool MultiChannelBlending_Red() 89 {........}