OpenCV 多通道影象混合
阿新 • • 發佈:2021-12-13
//-----------------------------------【標頭檔案包含部分】--------------------------------------- // 描述:包含程式所依賴的標頭檔案 //------------------------------------------------------------------------------------------------ #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> //-----------------------------------【名稱空間宣告部分】--------------------------------------- // 描述:包含程式所使用的名稱空間 //------------------------------------------------------------------------------------------------- using namespace cv; using namespace std; //-----------------------------------【全域性函式宣告部分】-------------------------------------- // 描述:全域性函式宣告 //----------------------------------------------------------------------------------------------- bool MultiChannelBlending(); //-----------------------------------【main( )函式】------------------------------------------ // 描述:控制檯應用程式的入口函式,我們的程式從這裡開始 //----------------------------------------------------------------------------------------------- int main() { if (MultiChannelBlending()) { cout << endl << "\n執行成功,得出了需要的影象~! "; } waitKey(0); return 0; } //-----------------------------【MultiChannelBlending( )函式】-------------------------------- // 描述:多通道混合的實現函式 //----------------------------------------------------------------------------------------------- bool MultiChannelBlending() { //【0】定義相關變數 Mat srcImage; Mat logoImage; vector<Mat> channels; Mat imageBlueChannel; //=================【藍色通道部分】================= // 描述:多通道混合-藍色分量部分 //============================================ // 【1】讀入圖片 logoImage = imread("dota_logo.jpg", 0); srcImage = imread("dota_jugg.jpg"); if (!logoImage.data) { printf("Oh,no,讀取logoImage錯誤~! \n"); return false; } if (!srcImage.data) { printf("Oh,no,讀取srcImage錯誤~! \n"); return false; } //【2】把一個3通道影象轉換成3個單通道影象 split(srcImage, channels);//分離色彩通道 //【3】將原圖的藍色通道引用返回給imageBlueChannel,注意是引用,相當於兩者等價,修改其中一個另一個跟著變 imageBlueChannel = channels.at(0); //【4】將原圖的藍色通道的(500,250)座標處右下方的一塊區域和logo圖進行加權操作,將得到的混合結果存到imageBlueChannel中 addWeighted(imageBlueChannel(Rect(500, 250, logoImage.cols, logoImage.rows)), 1.0, logoImage, 0.5, 0, imageBlueChannel(Rect(500, 250, logoImage.cols, logoImage.rows))); //【5】將三個單通道重新合併成一個三通道 merge(channels, srcImage); //【6】顯示效果圖 namedWindow(" <1>遊戲原畫+logo藍色通道"); imshow(" <1>遊戲原畫+logo藍色通道", srcImage); //=================【綠色通道部分】================= // 描述:多通道混合-綠色分量部分 //============================================ //【0】定義相關變數 Mat imageGreenChannel; //【1】重新讀入圖片 logoImage = imread("dota_logo.jpg", 0); srcImage = imread("dota_jugg.jpg"); if (!logoImage.data) { printf("讀取logoImage錯誤~! \n"); return false; } if (!srcImage.data) { printf("讀取srcImage錯誤~! \n"); return false; } //【2】將一個三通道影象轉換成三個單通道影象 split(srcImage, channels);//分離色彩通道 //【3】將原圖的綠色通道的引用返回給imageBlueChannel,注意是引用,相當於兩者等價,修改其中一個另一個跟著變 imageGreenChannel = channels.at(1); //【4】將原圖的綠色通道的(500,250)座標處右下方的一塊區域和logo圖進行加權操作,將得到的混合結果存到imageGreenChannel中 addWeighted(imageGreenChannel(Rect(500, 250, logoImage.cols, logoImage.rows)), 1.0, logoImage, 0.5, 0., imageGreenChannel(Rect(500, 250, logoImage.cols, logoImage.rows))); //【5】將三個獨立的單通道重新合併成一個三通道 merge(channels, srcImage); //【6】顯示效果圖 namedWindow("<2>遊戲原畫+logo綠色通道"); imshow("<2>遊戲原畫+logo綠色通道", srcImage); //=================【紅色通道部分】================= // 描述:多通道混合-紅色分量部分 //============================================ //【0】定義相關變數 Mat imageRedChannel; //【1】重新讀入圖片 logoImage = imread("dota_logo.jpg", 0); srcImage = imread("dota_jugg.jpg"); if (!logoImage.data) { printf("Oh,no,讀取logoImage錯誤~! \n"); return false; } if (!srcImage.data) { printf("Oh,no,讀取srcImage錯誤~! \n"); return false; } //【2】將一個三通道影象轉換成三個單通道影象 split(srcImage, channels);//分離色彩通道 //【3】將原圖的紅色通道引用返回給imageBlueChannel,注意是引用,相當於兩者等價,修改其中一個另一個跟著變 imageRedChannel = channels.at(2); //【4】將原圖的紅色通道的(500,250)座標處右下方的一塊區域和logo圖進行加權操作,將得到的混合結果存到imageRedChannel中 addWeighted(imageRedChannel(Rect(500, 250, logoImage.cols, logoImage.rows)), 1.0, logoImage, 0.5, 0., imageRedChannel(Rect(500, 250, logoImage.cols, logoImage.rows))); //【5】將三個獨立的單通道重新合併成一個三通道 merge(channels, srcImage); //【6】顯示效果圖 namedWindow("<3>遊戲原畫+logo紅色通道 "); imshow("<3>遊戲原畫+logo紅色通道 ", srcImage); return true; }
執行:
參考:
《OpenCV3 程式設計入門》 毛星雲 P127