OpenCV通道分離split()和通道合併merge()

在OpenCV中split()函數用於將一個多通道數組分離成幾個單通道數組;

merge()函數是split()函數的逆向操作,將多個數組合併成一個多通道的數組。通過組合一些給定的單通道數組,將這些孤立的單通道數組合並組合成一個多通道的數組,從而創建出一個由多通道陣列組成的多通道陣列。

一、代碼:

//------------------------------------------------------------------------------------------------
//多通道分離split()函數和多通道混合merge()函數
//----------------------------【頭文件、命名空間包含部分】--------------------------------

//----------------------------描述:包含程序所使用的頭文件和命名空間
#include <opencv2/opencv.hpp>
//#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
//#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;


//----------------------------【全局變量聲明部分】----------------------------
//描述:全局函數聲明
bool MultiChannelBlending();


//----------------------------【main函數】----------------------------
int main()
{
	if (MultiChannelBlending())
	{
		cout << "運行成功" << endl;
	}
	
	//按任意鍵退出
	waitKey(0);

	return 0;
}


//----------------------------【MultiChannelBlending()函數】----------------------------
//描述:多通道混合的實現函數
bool MultiChannelBlending()
{
	//定義相關變量
	Mat srcImage;
	Mat logoImage;
	vector<Mat> channels;
	Mat imageBlueChannel;    //定義藍色通道

	//讀入圖片
	srcImage = imread("F:\\TuPian\\dotasrc.jpg");
	if (srcImage.data == NULL)
	{
		cout << "讀取源圖像錯誤!" << endl;
	}

	logoImage = imread("F:\\TuPian\\dota_logo.jpg",0); //參數0表示讀入灰度圖像
	if (logoImage.data == NULL)
	{
		cout << "讀取logo錯誤!" << endl;
	}

	//利用split()函數將一個3通道圖像轉換成3個單通道圖像
	split(srcImage, channels);    // 分離彩色通道

	//將原圖的藍色通道引用返回給imageBlueChannel,注意是引用,相當於兩者等價,修改其中一個另一個跟着變
	imageBlueChannel = channels.at(0);    //channels.at(1)是綠色通道,channels.at(2)是紅色通道

	//將原圖的藍色通道的(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)));
	//void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype = -1);
	//dst = src1[I]*alpha + src2[I]*beta + gamma;

	//利用merge()函數將3個通道重新合成一個三通道
	merge(channels, srcImage);

	//顯示效果圖
	const char* name = "遊戲原畫+logo藍色通道";
	cv::namedWindow(name);
	cv::imshow(name, srcImage);

	return true;
}

二、結果:

 

參考: 參考:《OpenCV3編程入門》毛星雲、冷雪飛等編著,電子工業出版社,2018年11月第19次印刷,p125-130。

 

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