![OpenCV轻松入门:面向Python(第2版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/266/47382266/b_47382266.jpg)
3.2 图像加权和
所谓图像加权和,就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为
dst=saturate(src1×α+src2×β+γ)
式中,saturate(·)表示取饱和值(所能表示范围的最大值)。图像进行加权和计算时,要求src1和src2必须大小、类型相同,但是对具体是什么类型和通道没有特殊限制。它们可以是任意数据类型,也可以有任意数量的通道(灰度图像或者彩色图像),只要二者相同即可。
OpenCV中提供了函数cv2.addWeighted(),用来实现图像的加权和(混合、融合),该函数的语法格式为
![](https://epubservercos.yuewen.com/D41D8C/26766203101053706/epubprivate/OEBPS/Images/txt003_10.jpg?sign=1739616830-m9i3Vkd45t6m9QybSRNTkzJ8PaxduiD0-0-65381566ed229bc1f2b7c65567f49625)
其中,参数alpha和beta是src1和src2所对应的系数,它们的和可以等于1,也可以不等于1。该函数实现的功能是dst=saturate(src1×alpha+src2×beta+gamma)。需要注意,式中参数gamma的值可以是0,但是该参数是必选参数,不能省略。可以将上式理解为“结果图像=计算饱和值(图像1×系数1+图像2×系数2+亮度调节量)”。
【例3.4】使用数组演示函数cv2.addWeighted()的使用。
根据题目要求,编写程序如下:
![](https://epubservercos.yuewen.com/D41D8C/26766203101053706/epubprivate/OEBPS/Images/txt003_11.jpg?sign=1739616830-Yw5BD5Y90SAOygeOdl0CFnJpvZaRdC4f-0-4608188fc93b65cc9b9405b1b5cb7673)
本例中的各行代码功能如下:
● 第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。
运行程序,得到如下运行结果:
![](https://epubservercos.yuewen.com/D41D8C/26766203101053706/epubprivate/OEBPS/Images/txt003_12.jpg?sign=1739616830-I62sKPn8mOD830k7w9PDb3uM22t0hUTI-0-a51c68fb00c1de3581ff1a882b998942)
【例3.5】使用函数cv2.addWeighted()对两幅图像进行加权混合,观察处理结果。
根据题目要求,编写程序如下:
![](https://epubservercos.yuewen.com/D41D8C/26766203101053706/epubprivate/OEBPS/Images/txt003_13.jpg?sign=1739616830-rgxvwzN5YyhFhlZ7vdD0vdc6Q9NOvycl-0-90e91e167dabea23f2fa5256ae0cc4b1)
本程序使用cv2.addWeighted()函数,对图像boat和图像lena分别按照0.6和0.4的权重进行混合。
运行程序,得到如图3-2所示的结果,其中:
● 图3-2(a)是原始图像boat。
● 图3-2(b)是原始图像lena。
● 图3-2(c)是图像boat和图像lena加权混合后的结果图像。
![](https://epubservercos.yuewen.com/D41D8C/26766203101053706/epubprivate/OEBPS/Images/txt003_14.jpg?sign=1739616830-IM5QdmLSgpEZa0cpy1Jkwdiu4v6n4zjn-0-990384c8d9110205af3166681d7de128)
图3-2 【例3.5】程序的运行结果
【例3.6】使用函数cv2.addWeighted()将一幅图像的ROI混合在另外一幅图像内。
根据题目要求,编写程序如下:
![](https://epubservercos.yuewen.com/D41D8C/26766203101053706/epubprivate/OEBPS/Images/txt003_15.jpg?sign=1739616830-2DoFgj8NEv3urwj5Ncu6GBNBI2iieRcU-0-4d6eae8137403e6e7a76d44e93dac4f9)
![](https://epubservercos.yuewen.com/D41D8C/26766203101053706/epubprivate/OEBPS/Images/txt003_16.jpg?sign=1739616830-exVMMXmSdE7zvzMD8TFaMvmIVvbI74Xx-0-a2b98f21f53bab23673d7f850d323529)
在本例中,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的面部加权混合得到的图像。
![](https://epubservercos.yuewen.com/D41D8C/26766203101053706/epubprivate/OEBPS/Images/txt003_17.jpg?sign=1739616830-4PVbPBWxDisZV37sGvnLF8UbhOhAu9xV-0-dfb0b136e0676c4572cf91c4b91d859f)
图3-3 图像加权混合结果