Skip to content

添加(混合)两幅图像

我们将学习如何混合两幅图像!

在本教程中,你将学到:

  • 什么是线性混合(linear blending),以及它为何有用;
  • 如何使用 addWeighted() 叠加两幅图像。

注: 以下解释摘自 Richard Szeliski 所著 Computer Vision: Algorithms and Applications 一书。

在之前的教程中,我们已经了解了一些像素运算符(pixel operator)。一个有趣的双目(两输入)运算符是线性混合运算符:

g(x)=(1−α)f0(x)+αf1(x)g(x) = (1 - \alpha)f_{0}(x) + \alpha f_{1}(x)

通过让 α\alpha 从 0→10 \rightarrow 1 变化,该运算符可用于在两幅图像或两段视频之间执行时间上的*交叉溶解(cross-dissolve)*效果,正如幻灯片放映和电影制作中所见到的那样(很酷吧?)。

C++

可从此处下载源代码。

Java

可从此处下载源代码。

Python

可从此处下载源代码。

由于我们要执行:

g(x)=(1−α)f0(x)+αf1(x)g(x) = (1 - \alpha)f_{0}(x) + \alpha f_{1}(x)

我们需要两幅源图像(f0(x)f_{0}(x) 和 f1(x)f_{1}(x))。因此,我们按常规方式加载它们:

(加载图像的代码实现见源代码。)

我们使用了以下图像:LinuxLogo.jpg 和 WindowsLogo.jpg。

警告: 由于我们要将 src1 和 src2 相加,二者必须具有相同的尺寸(宽和高)以及相同的类型。

现在我们需要生成 g(x) 图像。为此,addWeighted() 函数非常方便:

(混合图像的代码实现见源代码。)

Python 版本中该行对应的 NumPy 写法如下(但 cv 函数大约快 2 倍):

dst = np.uint8(alpha*(img1)+beta*(img2))

Adding_Images_Tutorial_Result_Big.jpg

因为 addWeighted() 产生:

dst=α⋅src1+β⋅src2+γdst = \alpha \cdot src1 + \beta \cdot src2 + \gamma

在此例中,gamma 就是上述代码中的参数 0.00.0。

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

(显示图像的代码实现见源代码。)