OpenCV轻松入门:面向Python(第2版)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.2 图像加权和

所谓图像加权和,就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为

dst=saturate(src1×α+src2×β+γ

式中,saturate(·)表示取饱和值(所能表示范围的最大值)。图像进行加权和计算时,要求src1和src2必须大小、类型相同,但是对具体是什么类型和通道没有特殊限制。它们可以是任意数据类型,也可以有任意数量的通道(灰度图像或者彩色图像),只要二者相同即可。

OpenCV中提供了函数cv2.addWeighted(),用来实现图像的加权和(混合、融合),该函数的语法格式为

其中,参数alpha和beta是src1和src2所对应的系数,它们的和可以等于1,也可以不等于1。该函数实现的功能是dst=saturate(src1×alpha+src2×beta+gamma)。需要注意,式中参数gamma的值可以是0,但是该参数是必选参数,不能省略。可以将上式理解为“结果图像=计算饱和值(图像1×系数1+图像2×系数2+亮度调节量)”。

【例3.4】使用数组演示函数cv2.addWeighted()的使用。

根据题目要求,编写程序如下:

本例中的各行代码功能如下:

● 第3行生成一个3×4大小的二维数组,元素数值在[0,255]内,对应一个灰度图像img1。

● 第4行生成一个3×4大小的二维数组,元素数值在[0,255]内,对应一个灰度图像img2。

● 第5行生成一个3×4大小的二维数组,元素值都为0,数据类型为np.uint8。也就是说,该数组中元素可能的最大值是255。

● 第6行将调节亮度参数gamma的值设置为3。

● 第7行计算“img1×2+img2×1+3”的饱和值。也就是说,如果上述表达式的和小于255,则保留;如果表达式的和等于或者大于255,则处理为255。

运行程序,得到如下运行结果:

【例3.5】使用函数cv2.addWeighted()对两幅图像进行加权混合,观察处理结果。

根据题目要求,编写程序如下:

本程序使用cv2.addWeighted()函数,对图像boat和图像lena分别按照0.6和0.4的权重进行混合。

运行程序,得到如图3-2所示的结果,其中:

● 图3-2(a)是原始图像boat。

● 图3-2(b)是原始图像lena。

● 图3-2(c)是图像boat和图像lena加权混合后的结果图像。

图3-2 【例3.5】程序的运行结果

【例3.6】使用函数cv2.addWeighted()将一幅图像的ROI混合在另外一幅图像内。

根据题目要求,编写程序如下:

在本例中,face1是图像lena中的面部部分,face2是图像dollar中的面部部分。通过函数cv2.addWeighted()将lena图像内的面部face1与dollar图像内的面部face2进行了混合计算。

运行程序,会得到如图3-3所示的结果,其中:

● 图3-3(a)是原始图像lena。

● 图3-3(b)是原始图像dollar。

● 图3-3(c)是图像lena的面部与图像dollar的面部加权混合得到的图像。

图3-3 图像加权混合结果