在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。