ROI区域图像叠加&图像混合(2):
计算数组加权和: addWeighted()函数
这个函数的作用是计算两个数组(图像阵列)的加权和。原型如下:
void (InputArray src1,double alpha,InputArray src2,double beta,doublegamma,OutputArray dst, int dt ype=-1);
第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat;
第二个参数,double类型的alpha,表示第一个数组的权重;
第三个参数,InputArray类型的src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数;
第四个参数,double类型的 beta,表示第二个数组的权重值;
第五个参数,double类型的gamma,一个加到权重总和上的标量值。其含义通过接下来列出的式子自然会理解;
第六个参数,OutputArray类型的 dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数;
第七个参数,int类型的dtype,输出阵列的可选深度,有默认值-1。当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。
下面的数学公式表示:用addWeighted 函数计算以下两个数组(src1和 src2)的加权和,得到结果输出给第四个参数,也就是addWeighted 函数的作用的矩阵表达式。
dst = src1[I] *alpha+ src2[1 ] *beta + gamma ;
其中Ⅰ是多维数组元素的索引值。而且,在遇到多通道数组的时候,每个通道都需要独立地进行处理。另外需要注意的是,当输出数组的深度为CV_32S时,这个函数就不适用了,这时候就会内存溢出或者算出的结果压根不对。
示例代码如下:
//---------------------------------【头文件、命名空间包含部分】-----------------------------
// 描述:包含程序所使用的头文件和命名空间
//-------------------------------------------------------------------------------------------------
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/utils/logger.hpp>
using namespace cv;
using namespace std;
//--------------------------------------【LinearBlending函数】--------------------------------------
// 函数名: LinearBlending ()
//描述:利用cv: : addweighted()函数实现图像线性混合
//-----------------------------------------------------------------------------------------------
bool LinearBlending()
{
//定义一些局部变量
double alphaValue = 0.5;
double betaValue;
Mat srcImage2, srcImage3, dstImage;
//读取图像(两幅图片需要有同样的类型和大小)
srcImage2 = imread("E:/pictures/slg1.png");
srcImage3 = imread("E:/pictures/slg2.png");
if (!srcImage2.data)
{
printf("读取srcImage2错误~!\n");
return false;
}
if (!srcImage3.data)
{
printf("读取srcImage3错误~! ln");
return false;
}
//做图像混合加权操作
betaValue = (1.0 - alphaValue);
addWeighted(srcImage2, alphaValue, srcImage3, betaValue,0.0,dstImage);
//创建并显示原窗窗口
namedWindow("<2>线性混合示例窗口【原图】",1);
imshow("<2>线性混合示例窗口【原图】", srcImage2);
namedWindow("<3>线性混合示例窗口【效果图】",1);
imshow("<3>线性混合示例窗口【效果图】 ", dstImage);
return true;
}
int main()
{
cv::utils::logging::setLogLevel(utils::logging::LOG_LEVEL_SILENT);//控制台不在输出日志文件
cout << LinearBlending() << endl;
waitKey();
return 0;
}
运行结果如图: