![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=1739283104-1A5Dts2fnj4e8DOoFFlbkUTa9CNysRMM-0-fe4a345f86523002c9aa4519bdb8ac50)
其中,参数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=1739283104-W9iwn6hrWtdTQqEK49nIoilQ4d6YuzII-0-300279e4368d82fbe93401fc92d7f101)
本例中的各行代码功能如下:
● 第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=1739283104-j2TW9PdMqZy27fRyOh7oIHcGodxA9f2P-0-002e69fdb2d9485d8dfc35ce8113060d)
【例3.5】使用函数cv2.addWeighted()对两幅图像进行加权混合,观察处理结果。
根据题目要求,编写程序如下:
![](https://epubservercos.yuewen.com/D41D8C/26766203101053706/epubprivate/OEBPS/Images/txt003_13.jpg?sign=1739283104-a4j0B9Rm5k86mHoyB7JFGhP8OXbQoUgY-0-6bd7515aca64f1d99e127fa008f085e4)
本程序使用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=1739283104-bVn02hogwdKBOt2HoaSHWEq32RrElg0W-0-cfb2818d49b72aebd7b656ce85e5ea1e)
图3-2 【例3.5】程序的运行结果
【例3.6】使用函数cv2.addWeighted()将一幅图像的ROI混合在另外一幅图像内。
根据题目要求,编写程序如下:
![](https://epubservercos.yuewen.com/D41D8C/26766203101053706/epubprivate/OEBPS/Images/txt003_15.jpg?sign=1739283104-n44jdD7abCATkgb5J3T4UuLTNT9tgEz3-0-fe54db5874d4be6c89d8bcee166b7371)
![](https://epubservercos.yuewen.com/D41D8C/26766203101053706/epubprivate/OEBPS/Images/txt003_16.jpg?sign=1739283104-rSsRffQya96jphOAhcclMpVJM6tYLBxf-0-0b3f717961a975c2bbd4b1579550bc98)
在本例中,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=1739283104-cnWiGodvgXvT473pM33L0Eixll1MUpBY-0-8d797f8771d249e5fbd00ef45f4f3761)
图3-3 图像加权混合结果