OpenCV - 两幅图像求和(求混合blending)
目的:
学习:1、线性混合(linear blending)是什么以及 有什么用。
2、如何使用addWeighted进行两幅 图像求和。
原理:
线性混合操作 是一种典型的二元(两个输入)的像素操作:
g(x) = (1-α)f0(x) + αf1(x)
通过在范围0->1内改变α,这个操作可以用来对 两幅图像或两段视频产生时间上的画面叠化(cross - dissolve)效果。
具体代码如下:
#include <iostream>
#include <cv.h>
#include <highgui.h>
#include <imgcodecs.hpp>
#include <opencv.hpp>
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的参数。
程序的运行效果: