目标:
- 什么是线性融合,有什么用
- 如何使用addweighted() 将两个图像融合
理论:
这个操作是将两幅图像或者两段视频进行交叉,具体的公式是
g(x)= 其中
的范围是0-1
具体的代码如下:
#include <iostream>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace std;
using namespace cv;
int main(void) {
double alpha = 0.5;
double beta, input;
Mat src1, src2, dst;
cout << "Simple Linear Blender" << endl;
cout << "*Enter alpha [0.0-1.0]" << endl;
cin >> input;
if (input >= 0.0&&input <= 1.0)
alpha = input;
src1 = imread("data/LinuxLogo.jpg");
src2 = imread("data/WindowsLogo.jpg");
if (src1.empty()) { cout << "Error loading src1" << endl; return -1; }
if (src2.empty()) { cout << "Error loading src2" << endl; return -1; }
beta = (1.0 - alpha);
addWeighted(src1, alpha, src2, beta,0.0,dst);
imshow("Linear Blend", dst);
waitKey(0);
return 0;
}
这段代码,是将将两幅图片融合成一幅图片,根据两幅图片所占权重的不同,也就是alpha和beta的值不同,会有不同的效果。
这里的addWeighted()是程序的关键,他产生如下结果:
dst=α⋅src1+β⋅src2+γ
这一操作是对于src1和src2的每一个像素点的像素值都是进行权重相加得到的结果。所以要求src1和src2的size相同。
我们使用src1和src2的原图分别是linux和windows的logo
对于三个参数α、β、γ,我们先以0.5,0.5,0输入得到的结果如下。
对于γ的值来说,数值越大,融合后的图像越白,为0则代表不对融合后的图像做任何改动。