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

使用OpenCV相加(混合)两个图像:Adding (blending) two images using OpenCV

文章目录

    • 目标
    • 理论
    • 源码
    • 解释
    • 结果

目标

  • 什么是线性混合,为什么它有用;
  • 如何使用addWeighted()相加两个图像

理论

下面的解释来自理查德·斯泽里斯基的《计算机视觉:算法和应用》一书

一个有趣的二元(双输入)算子是线性混合算子:
g ( x ) = ( 1 − α ) f 0 ( x ) + α f 1 ( x ) g(x) = (1 - \alpha)f_{0}(x) + \alpha f_{1}(x) g(x)=(1α)f0(x)+αf1(x)
通过从0到1的变化,该操作符可用于在两幅图像或视频之间进行暂时的交叉溶解,就像在幻灯片放映和电影制作中看到的那样

源码

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include 
using namespace cv;
// we're NOT "using namespace std;" here, to avoid collisions between the beta variable and std::beta in c++17
using std::cin;
using std::cout;
using std::endl;
int main( void )
{
   double alpha = 0.5; double beta; double input;
   Mat src1, src2, dst;
   cout << " Simple Linear Blender " << endl;
   cout << "-----------------------" << endl;
   cout << "* Enter alpha [0.0-1.0]: ";
   cin >> input;
   // We use the alpha provided by the user if it is between 0 and 1
   if( input >= 0 && input <= 1 )
     { alpha = input; }
   src1 = imread( samples::findFile("LinuxLogo.jpg") );
   src2 = imread( samples::findFile("WindowsLogo.jpg") );
   if( src1.empty() ) { cout << "Error loading src1" << endl; return EXIT_FAILURE; }
   if( src2.empty() ) { cout << "Error loading src2" << endl; return EXIT_FAILURE; }
   beta = ( 1.0 - alpha );
   addWeighted( src1, alpha, src2, beta, 0.0, dst);
   imshow( "Linear Blend", dst );
   waitKey(0);
   return 0;
}

解释

当我们执行:
g ( x ) = ( 1 − α ) f 0 ( x ) + α f 1 ( x ) g(x) = (1 - \alpha)f_{0}(x) + \alpha f_{1}(x) g(x)=(1α)f0(x)+αf1(x)
我们需要两个源图像( f 0 ( x ) f_0(x) f0(x) f 1 ( x ) f_1(x) f1(x))。所以,我们用常规的方式加载它们:

   src1 = imread( samples::findFile("LinuxLogo.jpg") );
   src2 = imread( samples::findFile("WindowsLogo.jpg") );

因为我们要添加src1和src2,所以它们必须具有相同的大小(宽度和高度)和类型。
现在我们需要生成 g ( x ) g(x) g(x)图像。为此,函数addWeighted()非常方便:

   beta = ( 1.0 - alpha );
   addWeighted( src1, alpha, src2, beta, 0.0, dst);

d s t = α ⋅ s r c 1 + β ⋅ s r c 2 + γ dst = \alpha \cdot src1 + \beta \cdot src2 + \gamma dst=αsrc1+βsrc2+γ
gamma是上面代码中的参数0.0。

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

   imshow( "Linear Blend", dst );
   waitKey(0);

结果

使用OpenCV相加(混合)两个图像_第1张图片

你可能感兴趣的:(OpenCV)