OpenCV3 之 图像叠加&图像混合

文章目录

  • 1. 图像叠加
  • 2. 图像混合
    • 2.1 线性混合操作
    • 2.2 ROI区域的图像混合

1. 图像叠加

通过一个图像掩膜(mask),直接将插入处的像素设置为logo图像的像素值


//----------------------------------【ROI_AddImage( )函数】----------------------------------
// 函数名:ROI_AddImage()
//	描述:利用感兴趣区域ROI实现图像叠加
//----------------------------------------------------------------------------------------------
bool  ROI_AddImage()
{

	// 【1】读入图像
	Mat srcImage1 = imread("dota_pa.jpg");
	Mat logoImage = imread("dota_logo.jpg");
	if (!srcImage1.data) { printf("读取srcImage1错误~! \n"); return false; }
	if (!logoImage.data) { printf("读取logoImage错误~! \n"); return false; }

	// 【2】定义一个Mat类型并给其设定ROI区域
	Mat imageROI = srcImage1(Rect(200, 250, logoImage.cols, logoImage.rows));

	// 【3】加载掩模(必须是灰度图)
	Mat mask = imread("dota_logo.jpg", 0);

	//【4】将掩膜拷贝到ROI
	logoImage.copyTo(imageROI, mask);

	// 【5】显示结果
	namedWindow("<1>利用ROI实现图像叠加示例窗口");
	imshow("<1>利用ROI实现图像叠加示例窗口", srcImage1);

	return true;
}

OpenCV3 之 图像叠加&图像混合_第1张图片
OpenCV3 之 图像叠加&图像混合_第2张图片

2. 图像混合

2.1 线性混合操作

该效果使两幅图像或两段视频产生时间上的画面叠化效果,类似于电影画面过渡的叠加效果。

g ( x ) = ( 1 − α ) f 1 ( x ) + α f 2 ( x ) + β \mathrm{g}(x)=(1-α) f_{1}(x)+α f_{2}(x)+β g(x)=(1α)f1(x)+αf2(x)+β

通过改变α的值,α∈[0,1],我们可以得到不同程度的混合效果。

在OpenCV中主要通过数组加权和 addWeighted函数实现。

void addWeighted(InputArray src1,double alpha,InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);

  • 参数1:表示需要加权的第一个数组,通常写入Mat型数据
  • 参数2:表示第一个数组的权重,α
  • 参数3:表示第二个数组,需要与第一个数组有相同的尺寸和通道数
  • 参数4:表示第二个数组的权重,(1-α)
  • 参数5:加到权重总和上的标量值 ,β
  • 参数6:输出的数组,同输入的数组相同尺寸和通道数
  • 参数7:输出阵列的可选深度,默认值为-1;当两个输入数组具有相同深度时,参数设置为-1
//---------------------------------【LinearBlending()函数】-------------------------------------
// 函数名:LinearBlending()
// 描述:利用cv::addWeighted()函数实现图像线性混合
//--------------------------------------------------------------------------------------------
bool  LinearBlending()
{
	//【0】定义一些局部变量
	double alphaValue = 0.5;
	double betaValue;
	Mat srcImage2, srcImage3, dstImage;

	// 【1】读取图像 ( 两幅图片需为同样的类型和尺寸 )
	srcImage2 = imread("mogu.jpg");
	srcImage3 = imread("rain.jpg");

	if (!srcImage2.data) { printf("读取srcImage2错误! \n"); return false; }
	if (!srcImage3.data) { printf("读取srcImage3错误! \n"); return false; }

	// 【2】进行图像混合加权操作
	betaValue = (1.0 - alphaValue);
	addWeighted(srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage);

	// 【3】显示原图窗口
	imshow("<2>线性混合示例窗口【原图】", srcImage2);
	imshow("<3>线性混合示例窗口【效果图】", dstImage);

	return true;

}

2.2 ROI区域的图像混合

//---------------------------------【ROI_LinearBlending()】-------------------------------------
// 函数名:ROI_LinearBlending()
// 描述:线性混合实现函数,指定区域线性图像混合.利用cv::addWeighted()函数结合定义
//			  感兴趣区域ROI,实现自定义区域的线性混合
//--------------------------------------------------------------------------------------------
bool  ROI_LinearBlending()
{

	//【1】读取图像
	Mat srcImage4 = imread("dota_pa.jpg", 1);
	Mat logoImage = imread("dota_logo.jpg");

	if (!srcImage4.data) { printf("读取srcImage4错误~! \n"); return false; }
	if (!logoImage.data) { printf("读取logoImage错误~! \n"); return false; }

	//【2】定义一个Mat类型并给其设定ROI区域
	Mat imageROI;
	//方法一
	//imageROI = srcImage4(Rect(200, 250, logoImage.cols, logoImage.rows));
	//方法二
	imageROI= srcImage4(Range(250,250+logoImage.rows),Range(200,200+logoImage.cols));

	//【3】将logo加到原图上
	addWeighted(imageROI, 0.5, logoImage, 0.3, 0., imageROI);

	//【4】显示结果
	imshow("<4>区域线性图像混合示例窗口", srcImage4);

	return true;
}

OpenCV3 之 图像叠加&图像混合_第3张图片


参考书籍《OpenCV3编程入门》

你可能感兴趣的:(▶,CV相关)