8. 使用OpenCV添加(混合)两个图像(OpenCV 官方文档翻译)

官方文档链接:https://docs.opencv.org/4.2.0/d5/dc4/tutorial_adding_images.html


目标 (Goal)

  • 线性混合
  • 使用 cv::addWeighted() 添加两个图像

理论 (Theory)

注意

下面的解释来自 Richard Szeliski 的 《计算机视觉:算法与应用》 一书。从之前的教程中,已经知道了一些像素操作符。下面是一个用于线性混合的双输入算子。

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 变换,这个运算符可用于执行两个图像或视频之间的时间交叉分解,如幻灯片放映和电影制作中所见。


源代码 (Source Code)

#include 

#include 
#include 
#include 
#include 

int main(void)
{
	double alpha = 0.5;	double beta;	double input;

	cv::Mat src1, src2, dst;

	std::cout << " Simple Linear Blender " << std::endl;
	std::cout << "--------------------------" << std::endl;
	std::cout << "* Enter alpha [0.0-1.0]: ";
	std::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 = cv::imread(cv::samples::findFile("label0.png"));
	src2 = cv::imread(cv::samples::findFile("label1.png"));

	if (src1.empty())
	{
		std::cout << "Error loading src1" << std::endl;
		return EXIT_FAILURE;
	}
	if (src2.empty())
	{
		std::cout << "Error loading src2" << std::endl;
		return EXIT_FAILURE;
	}

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

	cv::imshow("src1", src1);
	cv::imshow("src2", src2);
	cv::imshow("Linear Blend", dst);
	cv::waitKey(0);

	return 0;
}

输出图像

8. 使用OpenCV添加(混合)两个图像(OpenCV 官方文档翻译)_第1张图片


解释 (Explanation)

执行混合操作:

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)

需要两个原图像 f0(x) 和 f1(x),所以首先加载图像:

    src1 = cv::imread(cv::samples::findFile("label0.png"));
    src2 = cv::imread(cv::samples::findFile("label1.png"));

我们使用两幅图像:label0.png 和 label1.png.

警告

由于我们要添加 src1 和 src2,它们必须具有相同的大小(宽度和高度)和类型。

现在需要生成 g(x) 图像,通过调用 cv::addWeighted() 函数实现:

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

因为 cv::addWeighted() 的产生函数是:

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 。

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

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

你可能感兴趣的:(OpenCV)