opencv学习笔记6——core组件图像叠加与图像混合



#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<iostream>
using namespace cv;
using namespace std;
//图像添加
bool ROI_AddImage()
{
	Mat srcImage1 = imread("2.jpg");
	Mat logoImage = imread("logo1.jpg");
	if (!srcImage1.data)
	{
		printf( "读取srcimgae1错误\n");
		return false;
	}
	if (!logoImage.data)
	{
		printf("读取logoImage错误\n");
		return false;
	}
	//设置ROI区域
	Mat imageROI = srcImage1(Rect(2, 2, logoImage.cols, logoImage.rows));
	//加载掩膜,必须为灰度图
	Mat mask = imread("logo1.jpg", 0);
	//掩膜复制到ROI
	logoImage.copyTo(imageROI, mask);
	namedWindow("<1>利用ROI实现图像叠加示例");
	imshow("<1>利用ROI实现图像叠加示例", srcImage1);
	waitKey(0);
	return true;
}
//线性混合
bool LinearBlending()
{
	double alphaValue = 0.5;
	double betaValue = 1 - alphaValue;
	Mat srcImage2, srcImage3, dstImage;
	srcImage2 = imread("3.jpg");
	srcImage3 = imread("5.jpg");
	if (!srcImage2.data)
	{
		cout << "读取srcImage2失败\n";
		return true;
	}if (!srcImage3.data)
	{
		cout << "读取srcImage3失败\n";
		return true;
	}
	addWeighted(srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage);
	namedWindow("<2>线性混合示例窗口原图1",1);
	imshow("<2>线性混合示例窗口原图1", srcImage2);

	namedWindow("<2>线性混合示例窗口原图2", 1);
	imshow("<2>线性混合示例窗口原图2", srcImage3);

	namedWindow("<2>线性混合示例窗口效果图", 1);
	imshow("<2>线性混合示例窗口效果图", dstImage);
	waitKey(0);
	return true;
}

//图像添加+线性混合
bool ROI_LinearBlending()
{
	//两幅图片一定要尺寸相同,不然多余的部分无法混合
	Mat srcImage4 = imread("5.jpg");
	Mat logoImage = imread("logo1.jpg");
	if (!srcImage4.data)
	{
		cout << "读取srcImage4失败!\n";
		return false;
	}
	if (!logoImage.data)
	{
		cout << "读取logoImage失败!\n";
		return false;
	}

	Mat imageROI;
	imageROI = srcImage4(Rect(200, 250, logoImage.cols, logoImage.rows));
	//imageROI = srcImage4(Range(250, 250 + logoImage.rows), Range(200, 200 + logoImage.cols));
	addWeighted(imageROI, 0.5, logoImage, 0.3, 0., imageROI);
	namedWindow("<4>区域线性图像混合示例窗口");
	imshow("<4>区域线性图像混合示例窗口", srcImage4);
	waitKey(0);
	return true;
}
int main()
{
	if (ROI_AddImage())
	{
		printf("叠加成功");
	}

	if (LinearBlending())
	{
		printf("混合成功\n");
	}

	if (ROI_LinearBlending())
	{
		printf("区域线性混合成功\n");
	}
}

效果图:

图像叠加:


图像线性混合:




图像叠加+线性混合


对于图像叠加+线性混合,首先imageROI = srcImage4(Rect(200, 250, logoImage.cols, logoImage.rows));截取原图中的一部分即imageROI,然后addWeighted(imageROI, 0.5, logoImage, 0.3, 0., imageROI);将截取的部分和logo线性混合,再存入imageROI,所以最后结果如图。

对于第一种只叠加的,需要把logo加载为灰度图,即imread的第二个参数为0.

疑问:addWeighted函数为什么不出现目标图像?

答:截取了目标图像的一部分即imageROI,改变它,目标图像就会发生变化。

猜你喜欢

转载自blog.csdn.net/qq_36718317/article/details/80244500
今日推荐