OpenCV - 两幅图像求和(求混合blending)

OpenCV - 两幅图像求和(求混合blending)

目的:

学习:1、线性混合(linear blending)是什么以及 有什么用。

           2、如何使用addWeighted进行两幅 图像求和。

原理:

线性混合操作 是一种典型的二元(两个输入)的像素操作:


g(x) = (1-α)f0(x) + αf1(x)

通过在范围0->1内改变α,这个操作可以用来对 两幅图像或两段视频产生时间上的画面叠化(cross - dissolve)效果。

具体代码如下:

#include 
#include 
#include 
#include 
#include 
using namespace cv;
int main()
{
    //std::cout << "Hello World!\n"; 

	double alpha = 0.5;
	double beta;
	double input;
	Mat src1, src2, dst;

	///Ask the user enter alpha
	std::cout << "Simple Linear Blender " << std::endl;
	std::cout << "--------------------------" << std::endl;
	std::cout << "Enter alpha [0 -1]" << std::endl;
	std::cin >> input;
	if (alpha >= 0 && alpha <= 1) {
		alpha = input;
	}
	src1 = imread("images/image1.jpg");
	src2 = imread("images/cat.jpg");
	if (!src1.data) {
		printf("Error loading src1!\n");
		return -1;
	}
	if (!src2.data) {
		printf("Error loading src2!\n");
		return -1;
	}
	cvNamedWindow("Linear blend", 0);
	beta = {1.0 - alpha};
	addWeighted(src1,alpha,src2,beta,0.0,dst);
	//cvShowImage("Linear Blend",dst);
	imshow("Linear Blend", dst);
	cvWaitKey(0);
	return 0;
}

PS:

在 选取的两幅图片的时候需要他们的像素是 一样的,否则会出现错误。

Warning:因为我们对 src1 和 src2 求  ,它们必须要有相同的尺寸(宽度和高度)和类型。

学习到的方法:

addWeighted(src1,alpha,src2,beta,0.0,dst);

在addWeighted函数中进行如下操作:

dst = α * src1 + β * src2 + γ

这里的γ对应于上面代码中被 设定0.0的参数。

程序的运行效果:

OpenCV - 两幅图像求和(求混合blending)_第1张图片

你可能感兴趣的:(OpenCV)