OpenCV之多通道图像混合(例程)

先上代码

#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、线性混合操作

猜你喜欢

转载自blog.csdn.net/sono_io/article/details/124497942