目标
在本教程中,您将学习:
- 什么是线性混合以及为什么它有用;
- 如何使用 addWeighted() 添加两个图像
理论
注意
下面的解释属于Richard Szeliski的《计算机视觉:算法和应用》一书
从我们之前的教程中,我们已经知道了一些像素运算符。一个有趣的二元(双输入)算子是线性混合算子:
\[g(x) = (1 - \alpha)f_{0}(x) + \alpha f_{1}(x)\]
通过改变 \(\alpha\) 与 \(0 \rightarrow 1\) 相比,此运算符可用于在两个图像或视频之间执行时间交叉融合,如幻灯片放映和电影制作中所示(很酷,嗯?
源代码
C++爪哇岛蟒
从此处下载源代码。
#include“opencv2/imgcodecs.hpp”#include“opencv2/highgui.hpp”#include < iostream>使用命名空间 CV;我们在这里不是“使用命名空间 std”,以避免 c++17 中 beta 变量和 std::beta 之间的冲突使用 std::cin;使用 std::cout;使用 std::endl;int main( 无效 ){双阿尔法 = 0.5;双贝塔;双输入;垫子 src1, src2, dst;cout << “Simple Linear Blender ” << endl;cout << “-----------------------” << endl;cout << “* 输入 alpha [0.0-1.0]: ”;cin >>输入;如果 alpha 介于 0 和 1 之间,我们使用用户提供的 alphaif( 输入 >= 0 && 输入 <= 1 ){ alpha = 输入;src1 = imread( samples::findFile(“LinuxLogo.jpg”) );src2 = imread( samples::findFile(“WindowsLogo.jpg”) );if( src1.empty() ) { cout << “加载 src1 时出错” << endl;返回EXIT_FAILURE;}if( src2.empty() ) { cout << “加载 src2 时出错” << endl;返回EXIT_FAILURE;}贝塔 = ( 1.0 - 阿尔法 );addWeighted( src1, alpha, src2, beta, 0.0, dst);imshow( “线性混合”, dst );waitKey(0);返回 0;}
解释
C++爪哇岛蟒
由于我们将要执行:
\[g(x) = (1 - \alpha)f_{0}(x) + \alpha f_{1}(x)\]
我们需要两个源图像(\(f_{0}(x)\)和\(f_{1}(x)\))。因此,我们以通常的方式加载它们:
src1 = imread( samples::findFile(“LinuxLogo.jpg”) );
src2 = imread( samples::findFile(“WindowsLogo.jpg”) );
我们使用了以下图像:LinuxLogo.jpg和WindowsLogo.jpg
警告
由于我们添加了 src1 和 src2,因此它们的大小(宽度和高度)和类型必须相同。
现在我们需要生成图像。为此,函数 addWeighted() 非常方便:g(x)
贝塔 = ( 1.0 - 阿尔法 );
addWeighted( src1, alpha, src2, beta, 0.0, dst);
因为 addWeighted() 产生:
dst=α⋅src1+β⋅src2+γ
在本例中,是上述代码中的参数 0.0。gamma
0.0
创建窗口,显示图像并等待用户结束程序。
imshow( “线性混合”, dst );
waitKey(0);