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。

 

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