該文章來至於我一直很喜歡的博主@淺墨_毛星雲的博客,對其的知識很成就也深感敬佩。
該文鏈接 http://blog.csdn.net/poem_qianmo/article/details/21176257,作者在其博客中已做了詳細的註釋,我知識針對便於我自己的理解做一些補充和修改。
//-----------------------------------【程序說明】----------------------------------------------
// 程序名稱::【OpenCV入門教程之四】分離顏色通道&多通道圖像混合 配套源碼
// VS2010版 OpenCV版本:2.4.8
// 2014年3月13 日 Create by 淺墨
// 圖片素材出處:dota2原畫 dota2logo
// 配套博文鏈接:http://blog.csdn.net/poem_qianmo/article/details/20537737
// 淺墨的微博:@淺墨_毛星雲
//------------------------------------------------------------------------------------------------
//-----------------------------------【頭文件包含部分】---------------------------------------
// 描述:包含程序所依賴的頭文件
//----------------------------------------------------------------------------------------------
#include <cv.h>
#include <highgui.h>
#include <iostream>
//-----------------------------------【命名空間聲明部分】---------------------------------------
// 描述:包含程序所使用的命名空間
//-----------------------------------------------------------------------------------------------
using namespace cv;
using namespace std;
//-----------------------------------【全局函數聲明部分】--------------------------------------
// 描述:全局函數聲明
//-----------------------------------------------------------------------------------------------
bool MultiChannelBlending();
//-----------------------------------【main( )函數】--------------------------------------------
// 描述:控制檯應用程序的入口函數,我們的程序從這裏開始
//-----------------------------------------------------------------------------------------------
int main( )
{
system("color 5E");//windows相關的操作,改變命令行窗口的顏色
if(MultiChannelBlending( ))
{
cout<<endl<<"嗯。好了,得出了你需要的混合值圖像~";
}
waitKey(0);
return 0;
}
//-----------------------------【MultiChannelBlending( )函數】--------------------------------
// 描述:多通道混合的實現函數
//-----------------------------------------------------------------------------------------------
bool MultiChannelBlending()
{
//【0】定義相關變量
Mat srcImage;//Mat容器類,可以理解爲一個存儲圖像的容器
Mat logoImage;
vector<Mat> channels;//vector容器類
Mat imageBlueChannel;
//=================【藍色通道部分】=================
// 描述:多通道混合-藍色分量部分
//============================================
// 【1】讀入圖片
logoImage= imread("dota_logo.jpg",0);//讀取圖像,0代表灰度圖像
srcImage= imread("dota_jugg.jpg");//讀取圖像,大於0代表真彩圖像,RGB
//進行讀取檢查,讀取正確讀取圖像
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);//分離色彩通道,R,G,B各一個通道
//【3】將原圖的藍色通道引用返回給imageBlueChannel,注意是引用,相當於兩者等價,修改其中一個另一個跟着變
imageBlueChannel= channels.at(0);
//【4】將原圖的藍色通道的(500,250)座標處右下方的一塊區域和logo圖進行加權操作,將得到的混合結果存到imageBlueChannel中
Mat ROI=imageBlueChannel(Rect(500,250,logoImage.cols,logoImage.rows));
addWeighted(ROI,1.0,logoImage,0.5,0,ROI);
//【5】將三個單通道重新合併成一個三通道
merge(channels,srcImage);
//【6】顯示效果圖
namedWindow(" <1>遊戲原畫+logo藍色通道 by淺墨");
imshow(" <1>遊戲原畫+logo藍色通道 by淺墨",srcImage);
//對其他兩個通道的操作,可採用類似的方式