OpenCV3之——图像线性混合操作、数组加权和addWeighted()函数

       线性混合操作是一种典型的二元(两个输入)的像素操作;

       计算数组加权和:addWeighted()函数

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

第一个参数:InputArray类型的src1表示需要加权的第一个数组,常常填一个Mat

第二个参数:double类型的alpha,表示第一个数组的权重

第三个参数:InputArray类型的src2表示需要加权的第二个数组,他需要和第一个数组拥有相同的尺寸和通道数

第四个参数:double类型的beta,表示第二个数组的权重

第五个参数:double类型的gamma,一个加到权重总和上的标量值

第六个参数:OutputArray类型的dst,输出的数组,他和输入的两个数组拥有相同的尺寸和通道数

第七个参数:int类型的dtype,默认值为-1,当两个输入的数组拥有相同的深度时,这个参数设置为-1

dst = src1[i] * alpha + src2[i] * beta + gamma;

其中i为多维数组的索引值,当遇到多通道数组时,每个通道都需要独立的进行处理

注意:当输出的数组深度为CV_32S时,这个函数不再适用

图像线性组合实例:

#include <opencv2/opencv.hpp>
using namespace cv;

//-------------LinearBlending()函数,实现图像线性混合----
bool LinearBlending() {
	//定义一些局部变量
	double alphaValue = 0.5;
	double betaValue;
	Mat srcImage2, srcImage3, dstImage;

	//读取图像(两幅图像需为同样的类型和尺寸)
	srcImage2 = imread("mogu.jpg");
	srcImage3 = imread("rain.jpg");
	if (!srcImage2.data) {
		std::cout << "读取srcImage2错误!" << std::endl;
		return false;
	}
	if (!srcImage3.data) {
		std::cout << "读取srcImage3错误!" << std::endl;
		return false;
	}

	//做图像混合加权操作
	betaValue = (1.0 - alphaValue);
	addWeighted(srcImage2, alphaValue, srcImage3, betaValue, 0.0, dstImage);//加权线性混合

	//创建并显示原图窗口
	namedWindow("<2>线性混合示例【原图】",1);
	imshow("<2>线性混合示例【原图】", srcImage2);

	namedWindow("<3>线性混合示例【效果图】");
	imshow("<3>线性混合示例【效果图】", dstImage);

	return true;
}
int main() {
	if (LinearBlending())
		std::cout << "线性混合实例演示成功!" << std::endl;
	else
		std::cout << "线性混合实例演示失败!" << std::endl;

	waitKey(0);
	return 0;
}

【原图】


【两个图像线性组合效果图】


猜你喜欢

转载自blog.csdn.net/qq_35294564/article/details/81045812