知识点

  1. 理论-线性混合操作
  2. 相关API函数(addWeighted)
  3. 代码演示

理论

f0(x)为一幅图片,f1(x)为另一幅图片,g(x)为混合后的图片,f0(x)与f1(x)各自取不同的权重,(1-α)与α互补,不会超过255;

API

图像混合API:addWeighted();
参数1—图像矩阵对象1;
参数2—系数(与beta互补为1);
参数3—图像2;
参数4—系数;
参数5—gamma:校验值(如果alpha + beta <1则使用该值);
输出混合图像:

dst = saturate_cast<..>(src1 * alpha + src2 * beta + gamma);

Code

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
	Mat src1, src2, dst;

	src1 = imread("C:\\Users\\hello\\Desktop\\1.jpg");
	src2 = imread("C:\\Users\\hello\\Desktop\\2.png");
	if (!src1.data)
	{
		cout << "could not load the image 1.jpg" << endl;
		return -1;
	}
	if (!src2.data)
	{
		cout << "could not load the image 2.png" << endl;
		return -1;
	}
	double alpha = 0.5;
	if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type())  //图像大小和类型都相同
	{
		//addWeighted(src1,alpha,src2,(1.0-alpha),0.0,dst); //图像按比例混合
		//add(src1, src2, dst, Mat());                     //图像直接相加
		multiply(src1, src2, dst, 1.0);                    //图像向乘
		imshow("src1", src1);
		imshow("src2", src2);
		namedWindow("blend demo", CV_WINDOW_AUTOSIZE);
		imshow("blend demo", dst);
	}
	else
	{
		printf("could not blend image , the size of image is not same...\n");
		return -1;
	}
	waitKey(0);
	return 0;
}

扩展

addWeighted():图像按比例线性混合
add(): 图像直接相加
multiply(): 图像相乘