OpenCV之分離顏色通道與混合源代碼分析

該文章來至於我一直很喜歡的博主@淺墨_毛星雲的博客,對其的知識很成就也深感敬佩。

該文鏈接 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);

	//對其他兩個通道的操作,可採用類似的方式


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章