參考網站:
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 {........}