使用 OpenCV 添加(混合)两个图像

发布时间:2024年01月22日

目标

在本教程中,您将学习:

  • 什么是线性混合以及为什么它有用;
  • 如何使用?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 之间,我们使用用户提供的 alpha
if( 输入 >= 0 && 输入 <= 1 )
{ alpha = 输入;
src1 = imreadsamples::findFile“LinuxLogo.jpg”) );
src2 = imreadsamples::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 = imreadsamples::findFile“LinuxLogo.jpg”) );
src2 = imreadsamples::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.0gamma0.0

创建窗口,显示图像并等待用户结束程序。

imshow“线性混合”, dst );
waitKey(0);

结果

Adding_Images_Tutorial_Result_Big.jpg

文章来源:https://blog.csdn.net/2301_81888214/article/details/135711961
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。