线性混合操作

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

图像线性混合的数学原理

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方法.

opencv求两区域交集_opencv求两区域交集


加载图片

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

opencv求两区域交集_python_02

opencv求两区域交集_java_03

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

opencv求两区域交集_java_04

OK,显示图片没有问题。


addWeighted线性混合操作

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

opencv求两区域交集_计算机视觉_05

opencv求两区域交集_计算机视觉_06

运行后发现两个图像的宽度差了一个,那在执行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的大小

opencv求两区域交集_opencv_07

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

opencv求两区域交集_java_08

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

我们看一下显示效果

opencv求两区域交集_java_09

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

opencv求两区域交集_java_10

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

opencv求两区域交集_opencv求两区域交集_11

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

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

opencv求两区域交集_计算机视觉_12

显示的效果为

opencv求两区域交集_java_13

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

-END-