线性混合操作
即可以把两张图像混合成一张图像的操作.
图像线性混合的数学原理
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);
代码演示 新建项目
新建一个项目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-