线性混合操作
g(x)=(1−α)f0(x)+αf1(x)
其中 α 的取值范围为0~1之间, f0(x) 和 f1(x) 分别表示要混合的两张图像,x表示其中每个点的像素值。
相关的API接口
参数1:输入图像Mat类src1
参数2:输入图像src1的加权权重值alpha
参数3:输入图片Mat类src2
参数4:输入图像src1的加权权重值beta
参数5:gamma值
参数6:输出混合图像Mat类dst
公式:
dst(I)=saturate(src(I)∗alpha+src2(I)∗beta+gamma)
saturate确保像素值在0~255,保证不溢出
warning:两张图像必须大小和类型一致才可以使用
#include <opencv2\opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat src1, src2, dst;
double alpha = 0.5;
src1 = imread("src1.jpg");
src2 = imread("src2.jpg");
if (!src1.data)
{
cout << "could not load src1..." << endl;
return -1;
}
if (!src2.data)
{
cout << "could not load src2..." << endl;
return -1;
}
if (src1.rows == src2.rows &&src1.cols == src2.cols&&src1.type() == src2.type())
{
addWeighted(src1, alpha, src2, (1.0 - alpha), 0.0, dst);
imshow("src1", src1);
imshow("src2", src2);
namedWindow("blend demo", CV_WINDOW_AUTOSIZE);
imshow("blend demo", dst);
}
else
{
printf("could not blend images,the size of images is not same.....\n");
return -1;
}
waitKey(0);
return 0;
}
第一张图片:
第二章图片:
混合后的图片:
CV_EXPORTS_W void add(InputArray src1, InputArray src2, OutputArray dst,
InputArray mask = noArray(), int dtype = -1);
add(src1, src2, dst, Mat());
直接相加的结果:
直接相加可以看出,很多像素直接饱和,不利于图像的处理。
CV_EXPORTS_W void multiply(InputArray src1, InputArray src2,
OutputArray dst, double scale = 1, int dtype = -1);
multiply(src1, src2, dst, 1.0);
直接相乘的结果:
!!!!貌似没法看,这里不适合直接相乘0.0||