![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=1738934238-UKjpoFOQ9xLS5Ahy1Gs1FpUxBWZiexYt-0-18e482c61dd5535cc9ddbda8b06e678d)
其中,参数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=1738934238-MYklxPNrR9cEbHVLYgWQeOmsobJ8WN2l-0-720543f399d07600b781b66af98434f8)
本例中的各行代码功能如下:
● 第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=1738934238-5vIP0uuKnmbA5lIk1aSzPcSlRwvWegtV-0-fc4df48870a09ef0f69b5024f2143035)
【例3.5】使用函数cv2.addWeighted()对两幅图像进行加权混合,观察处理结果。
根据题目要求,编写程序如下:
![](https://epubservercos.yuewen.com/D41D8C/26766203101053706/epubprivate/OEBPS/Images/txt003_13.jpg?sign=1738934238-gzD2hmuXIlFcQuh85V2R9zlHKxWglnzc-0-dc26a2c1b79b2b2f029030a70bc117b4)
本程序使用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=1738934238-dDNcsfxCAbsGl1nB2BVtK5Rlro4icbGM-0-60ccfdd3346678049c8597ceb4652df5)
图3-2 【例3.5】程序的运行结果
【例3.6】使用函数cv2.addWeighted()将一幅图像的ROI混合在另外一幅图像内。
根据题目要求,编写程序如下:
![](https://epubservercos.yuewen.com/D41D8C/26766203101053706/epubprivate/OEBPS/Images/txt003_15.jpg?sign=1738934238-ffOJZ7dktzD94PDnYZYDfdCILTt2YnhJ-0-472a11905436a15b02c1e2f2e7aa5f80)
![](https://epubservercos.yuewen.com/D41D8C/26766203101053706/epubprivate/OEBPS/Images/txt003_16.jpg?sign=1738934238-XKhsGhj4BKt58DDCWg4j7aQKOeBHLV1r-0-780fc5c32f20400f1bdec2e6aa700cb6)
在本例中,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=1738934238-zpRRSZj6osWSqgT9TLAHlRr0s53OIz0A-0-6a7d8c730e332f3111dfbfe1bd6aef1a)
图3-3 图像加权混合结果