知识点
- 理论-线性混合操作
- 相关API函数(addWeighted)
- 代码演示
理论
f0(x)为一幅图片,f1(x)为另一幅图片,g(x)为混合后的图片,f0(x)与f1(x)各自取不同的权重,(1-α)与α互补,不会超过255;
API
图像混合API:addWeighted();
参数1—图像矩阵对象1;
参数2—系数(与beta互补为1);
参数3—图像2;
参数4—系数;
参数5—gamma:校验值(如果alpha + beta <1则使用该值);
输出混合图像:
dst = saturate_cast<..>(src1 * alpha + src2 * beta + gamma);
Code
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat src1, src2, dst;
src1 = imread("C:\\Users\\hello\\Desktop\\1.jpg");
src2 = imread("C:\\Users\\hello\\Desktop\\2.png");
if (!src1.data)
{
cout << "could not load the image 1.jpg" << endl;
return -1;
}
if (!src2.data)
{
cout << "could not load the image 2.png" << endl;
return -1;
}
double alpha = 0.5;
if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type()) //图像大小和类型都相同
{
//addWeighted(src1,alpha,src2,(1.0-alpha),0.0,dst); //图像按比例混合
//add(src1, src2, dst, Mat()); //图像直接相加
multiply(src1, src2, dst, 1.0); //图像向乘
imshow("src1", src1);
imshow("src2", src2);
namedWindow("blend demo", CV_WINDOW_AUTOSIZE);
imshow("blend demo", dst);
}
else
{
printf("could not blend image , the size of image is not same...\n");
return -1;
}
waitKey(0);
return 0;
}
扩展
addWeighted():图像按比例线性混合
add(): 图像直接相加
multiply(): 图像相乘