您的位置:首页 > 运维架构

opencv图像线性混合操作

2017-07-07 14:23 218 查看
图像线性混合的数学原理

G(x)=(1-a)F(x)+aQ(x)

注意事项:

1,a的取值范围为0到1之间

2,F(x)和Q(x)为参与混合的两幅图像,G(x)表示输出图像

3,通过对两幅图像的每个像素值做线性加权得到最终的输出图像

4,两幅图像的大小和类型必须完全一致,如果把图像当成一个矩阵

则两个矩阵相加的前提是维度必须一致,否则没有相加的意义。

示例

第一幅参与混合的图像



第二幅参与混合的图像



混合结果



通过混合产生了烟雨朦胧的效果

代码实现

#include <opencv2\core\core.hpp>
#include <opencv2\imgcodecs.hpp>
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <iostream>

using namespace cv;
using namespace std;
int main(int argc, char** args)
{
Mat src1, src2, dst;
src1 = imread("mogu.jpg");
src2 = imread("rain.jpg");
if (!src1.data)
{
printf("图像加载错误");
return -1;
}

if (!src2.data)
{
printf("图像加载错误");
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);//相加
//multiply(src1,src2,dst);//相乘
imshow("原图-1", src1);
imshow("原图-2",src2);
imshow("混合后的图",dst);
}
else{
printf("两幅图像的大小或者类型不一致,不能混合!");
return -1;
}

waitKey(0);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: