总结下来,4个步骤:
就是重复:分离,引用返回,加权,合并的操作
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;
bool MultiChannelBlending();
int main()
{
system("color 9F");
if (MultiChannelBlending())
{
cout << endl << "\n运行成功,得出了需要的图像~! ";
}
waitKey(0);
return 0;
}
bool MultiChannelBlending()
{
//【0】定义相关变量
Mat srcImage;
Mat logoImage;
vector<Mat> channels;
Mat imageBlueChannel;
logoImage = imread("C:/Users/离子键/source/repos/Project8/1.jpg", 0);
srcImage = imread("C:/Users/离子键/source/repos/Project8/3.jpg");
if (!logoImage.data) { printf("Oh,no,读取logoImage错误~! \n"); return false; }
if (!srcImage.data) { printf("Oh,no,读取srcImage错误~! \n"); return false; }
split(srcImage, channels);
imageBlueChannel = channels.at(0);
addWeighted(imageBlueChannel(Rect(0, 0, logoImage.cols, logoImage.rows)), 1.0,
logoImage, 0.5, 0, imageBlueChannel(Rect(0, 0, logoImage.cols, logoImage.rows)));
merge(channels, srcImage);
namedWindow(" <1>游戏原画+logo蓝色通道");
imshow(" <1>游戏原画+logo蓝色通道", srcImage);
Mat imageGreenChannel;
//【1】重新读入图片
logoImage = imread("C:/Users/离子键/source/repos/Project8/1.jpg", 0);
srcImage = imread("C:/Users/离子键/source/repos/Project8/3.jpg");
if (!logoImage.data) { printf("读取logoImage错误~! \n"); return false; }
if (!srcImage.data) { printf("读取srcImage错误~! \n"); return false; }
split(srcImage, channels);//分离色彩通道
imageGreenChannel = channels.at(1);
addWeighted(imageGreenChannel(Rect(0, 0, logoImage.cols, logoImage.rows)), 1.0,
logoImage, 0.5, 0., imageGreenChannel(Rect(0, 0, logoImage.cols, logoImage.rows)));
merge(channels, srcImage);
namedWindow("<2>游戏原画+logo绿色通道");
imshow("<2>游戏原画+logo绿色通道", srcImage);
//=================【红色通道部分】=================
// 描述:多通道混合-红色分量部分
//============================================
//【0】定义相关变量
Mat imageRedChannel;
//【1】重新读入图片
logoImage = imread("C:/Users/离子键/source/repos/Project8/1.jpg", 0);
srcImage = imread("C:/Users/离子键/source/repos/Project8/3.jpg");
if (!logoImage.data) { printf("Oh,no,读取logoImage错误~! \n"); return false; }
if (!srcImage.data) { printf("Oh,no,读取srcImage错误~! \n"); return false; }
//【2】将一个三通道图像转换成三个单通道图像
split(srcImage, channels);//分离色彩通道
//【3】将原图的红色通道引用返回给imageBlueChannel,注意是引用,相当于两者等价,修改其中一个另一个跟着变
imageRedChannel = channels.at(2);
//【4】将原图的红色通道的(500,250)坐标处右下方的一块区域和logo图进行加权操作,将得到的混合结果存到imageRedChannel中
addWeighted(imageRedChannel(Rect(0, 0, logoImage.cols, logoImage.rows)), 1.0,
logoImage, 0.5, 0., imageRedChannel(Rect(0, 0, logoImage.cols, logoImage.rows)));
//【5】将三个独立的单通道重新合并成一个三通道
merge(channels, srcImage);
//【6】显示效果图
namedWindow("<3>游戏原画+logo红色通道 ");
imshow("<3>游戏原画+logo红色通道 ", srcImage);
return true;
}
官方源码复制用: