1. 程式人生 > 其它 >OpenCV 多通道影象混合

OpenCV 多通道影象混合


//-----------------------------------【標頭檔案包含部分】---------------------------------------
//	描述:包含程式所依賴的標頭檔案
//------------------------------------------------------------------------------------------------                                                                                     
#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