先上代码
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/video.hpp>
using namespace cv;
using namespace std;
//全局函数
bool MultiChannelBlending();
//main
int main(int argc, char** argv)
{
system("color 9F");
if (MultiChannelBlending())
{
cout << "运行成功!" << endl;
}
waitKey(0);
return 0;
}
bool MultiChannelBlending() {
vector<Mat> channels;
Mat blueChannel;
Mat srcImage;
srcImage = imread("700levi.jpg");
Mat logoImage;
logoImage = imread("logo.jpg", 0);
if (!srcImage.data || !logoImage.data)
{
cout << "读入图片失败" << endl;
}
//把一个三通道图像转换为三个单通道图像
split(srcImage, channels);
//蓝色通道部分
blueChannel = channels.at(0);//这里返回的是蓝色通道的引用
//加权操作
addWeighted(blueChannel(Rect(200, 200, logoImage.cols, logoImage.rows)), 0.2, logoImage, 0.8, 0, blueChannel(Rect(200, 200, logoImage.cols, logoImage.rows)));
//将三个单通道重新合并成一个多通道
merge(channels, srcImage);
//显示效果图
namedWindow("蓝色通道");
imshow("蓝色通道", srcImage);
srcImage = imread("700levi.jpg");
logoImage = imread("logo.jpg", 0);
if (!srcImage.data || !logoImage.data)
{
cout << "读入图片失败" << endl;
}
//把一个三通道图像转换为三个单通道图像
split(srcImage, channels);
//绿色通道部分
blueChannel = channels.at(1);//这里返回的是绿色通道的引用
//加权操作
addWeighted(blueChannel(Rect(200, 200, logoImage.cols, logoImage.rows)), 0.2, logoImage, 0.8, 0, blueChannel(Rect(200, 200, logoImage.cols, logoImage.rows)));
//将三个单通道重新合并成一个多通道
merge(channels, srcImage);
//显示效果图
namedWindow("绿色通道");
imshow("绿色通道", srcImage);
srcImage = imread("700levi.jpg");
logoImage = imread("logo.jpg", 0);
if (!srcImage.data || !logoImage.data)
{
cout << "读入图片失败" << endl;
}
//把一个三通道图像转换为三个单通道图像
split(srcImage, channels);
//红色通道部分
blueChannel = channels.at(2);//这里返回的是红色通道的引用
//加权操作
addWeighted(blueChannel(Rect(200, 200, logoImage.cols, logoImage.rows)), 0.2, logoImage, 0.8, 0, blueChannel(Rect(200, 200, logoImage.cols, logoImage.rows)));
//将三个单通道重新合并成一个多通道
merge(channels, srcImage);
//显示效果图
namedWindow("红色通道");
imshow("红色通道", srcImage);
return true;
}
效果
解析
这个例程主要是对之前学的东西的使用,主要用了:
1、基本的图形读取显示
2、颜色通道分离和通道合并
3、感兴趣区域ROI
4、线性混合操作