Adding (blending) two images using OpenCV
此为OpenCV官方教程的个人翻译
目标
在这篇文章中中,您将学习:
- 什么是线性混合以及为什么它是有用的;
- 如何使用 addWeighted 混合两个图像
相关理论
注意:下面的解释属于Richard Szeliski的《Computer Vision: Algorithms and Applications》一书。
从我们之前的教程中,我们已经知道了一些Pixel运算符。,其中线性混合算子是一个有趣的二元(双输入)算子:

通过赋予\(\alpha\)以\(0\rightarrow1\)不同的值,该算子便可以用来在两个图片或视频中制作时间上的淡入淡出效果,因此可以被用于短视频,电影制作中.
代码部分
像往常一样,在不那么冗长的解释之后,让我们看看代码:
/*
* @LastEditors: 帝皇の惊
* @Date: 2022-06-26 15:20:09
* @Description: 简单的线性图像混合
* @LastEditTime: 2022-06-26 15:30:35
*/
#include <iostream>
#include "opencv.hpp"
using namespace cv;
int main(int argc, char** argv) {
double alpha = 0.5, beta, input;
Mat src1, src2, dst;
// Ask the user enter alpha
std::cout << "Simple Linear Blender" << std::endl;
std::cout << "---------------------" << std::endl;
std::cout << "* Enter aplha [0-1]: ";
std::cin >> input;
// We use the alpha provided by the user if it is between 0 and 1
if (input >= 0.0 && input <= 1.0) {
alpha = input;
}
// Read Image
src1 = imread("LinuxLogo.jpg");
src2 = imread("WindowsLogo.jpg");
if (!src1.data) {
printf("Error loading src1 \n");
return -1;
}
if (!src2.data) {
printf("Error loading src2 \n");
return -1;
}
// Create Window
namedWindow("Linear Blend", WINDOW_AUTOSIZE);
beta = (1.0 - alpha);
addWeighted(src1, alpha, src2, beta, 0.0, dst);
imshow("Linear Blend", dst);
waitKey(0);
return 0;
}
解释
由于我们的目标是执行

因此我们需要两个原图像(\(f_0(x)与f_1(x)\)).这里我们以imread形式加载它们:
src1 = imread("LinuxLogo.jpg");
src2 = imread("WindowsLogo.jpg");
注意:由于要对src1与src2进行融合,因此它们的大小和类型必须相同
现在我们需要生成\(g(x)\)图像,OpenCV提供的addWeighted 非常方便
beta = (1.0 - alpha);
addWeighted(src1, alpha, src2, beta, 0.0, dst);
而addWighted产生的图像为:
\[dst=\alpha*src1 + \beta*src2+\gamma
\]
在本例中,\(\gamma\)为0
接下来创建窗口显示图像.
结果


浙公网安备 33010602011771号