功能:实现两张图像混合
条件:两张图像大小、类型需一致
*********图像线性混合的数学原理*************
G(x)=(1-a)F(x)+aQ(x)
注意事项:
1,a的取值范围为0到1之间
2,F(x)和Q(x)为参与混合的两幅图像,G(x)表示输出图像
3,通过对两幅图像的每个像素值做线性加权得到最终的输出图像
4,两幅图像的大小和类型必须完全一致,如果把图像当成一个矩阵
则两个矩阵相加的前提是维度必须一致,否则没有相加的意义。
示例
第一幅参与混合的图像
第二幅参与混合的图像
混合结果
通过混合产生了烟雨朦胧的效果
代码实现:
/*
功能:图像混合
条件:两张图像大小,类型必须一致
*/
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
int main(int argc, char** argv) {
Mat src1, src2, dst;
src1 = imread("C:/usr/opencv-test/Testpictures/sight.jpg"); // by default
src2 = imread("C:/usr/opencv-test/Testpictures/sight2.jpg");
if (src1.empty())
{
printf("src1 load failed!\n");
return -1;
}
if (!src2.data)
{
printf("src2 load failed!\n");
return -1;
}
src2.rows = src1.rows; //使两张图像大小相同
src2.cols = src1.cols;
namedWindow("src1 image", CV_WINDOW_AUTOSIZE);
imshow("src1 image", src1);
imshow("src2 image", src2);
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); //图像混合
imshow("blend image", dst);
}
else
{
printf("blend failed!\n");
return -1;
}
waitKey(0);
return 0;
}