Adding (blending) two images using OpenCV

此为OpenCV官方教程的个人翻译

目标

在这篇文章中中,您将学习:

  • 什么是线性混合以及为什么它是有用的;
  • 如何使用 addWeighted 混合两个图像

相关理论

注意:下面的解释属于Richard Szeliski的《Computer Vision: Algorithms and Applications》一书。

从我们之前的教程中,我们已经知道了一些Pixel运算符。,其中线性混合算子是一个有趣的二元(双输入)算子:

1.png

通过赋予\(\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;
}

解释

由于我们的目标是执行

1.png

因此我们需要两个原图像(\(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

接下来创建窗口显示图像.

结果

2.png

posted @ 2022-06-26 15:42  帝皇の惊  阅读(65)  评论(0)    收藏  举报