前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ OpenCV线性混合操作

C++ OpenCV线性混合操作

作者头像
Vaccae
发布2019-07-24 11:35:28
7790
发布2019-07-24 11:35:28
举报
文章被收录于专栏:微卡智享

线性混合操作

即可以把两张图像混合成一张图像的操作.

图像线性混合的数学原理

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

注意事项:

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

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

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

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

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

addWeighted函数

在OpenCV中用于线性混合操作的API为addWeighted函数

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);

  • 第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。
  • 第二个参数,alpha,表示第一个数组的权重
  • 第三个参数,src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
  • 第四个参数,beta,表示第二个数组的权重值。
  • 第五个参数,dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
  • 第六个参数,gamma,一个加到权重总和上的标量值。看下面的式子自然会理解。
  • 第七个参数,dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。

代码演示 新建项目

新建一个项目opencv-0006,配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法.


加载图片

然后我们加载图像用于显示出来,我们这次需要两个数据源,所以加载了两张图像

然后我们显示一下看看效果

OK,显示图片没有问题。


addWeighted线性混合操作

我们在操作addWeighted的时候,两个数据源必须是相同大小的图像,所以我在们操作之前先输出一个下看看两个图像的高度和宽度是否一致.

运行后发现两个图像的宽度差了一个,那在执行addweighted的时候肯定会报错了.所以我们要加一行调整的代码,如果判断宽度和高度有一个不一致,那就把第二个图像按第一个图像的大小进行缩放

图像缩放的API为resize

CV_EXPORTS_W void resize( InputArray src, OutputArray dst,

Size dsize, double fx=0, double fy=0,

int interpolation=INTER_LINEAR );

接下来我们加入缩放的判断,把src2的图像转换成src1的大小

这样我们就可以进行线性混合操作了

其中定义的alpha就是两个图像的权重,我们用了0.5比重,第二个图像就要用到1-0.5效果了,就是说两个比重加起来要等于1.

我们看一下显示效果

中间的图像就是我们通过线性混合操作生成的图片,接下来我们改一下权重,看看显示的效果.

将第一个图像的权重改为0.2,显示的效果为

明显可以看出第二张图显示的比较清晰.

我们再把第一个图的权重改为0.7

显示的效果为

可以看出第一张图显示的比较清晰,第二张图占比比较少.

-END-

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-04-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微卡智享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档