图像加权和,就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为
dst= saturate(srcl * α + src2 * β + γ)
式中, saturate(表示取饱和值(最大值)。图像进行加权和计算时,要求 srcl和 src2 必须大小,类型相同,但是对具体是什么类型和通道没有特殊限制,它们可以是任意数据类型,也可以有任意数量的通道(灰度图像或者彩色图像),只要二者相同即可
OpenCv 中提供了函数 cv2.addWeighted,用来实现图像的加权和(混合、融合),该函数的语法格式为
dst=cv2.addWeighted(srcl,alpha,src2,beta, gamma)
其中,参数 alpha和 beta是 srcl 和 src2所对应的系数,它们的和可以等于 1,也可以不等于1
函数实现的功能是 dst= srcl * alpha+src2 * beta +gamma 需要注意,式中参数 gamma 的值
可以是0 但是该参数是必选参数,不能省略。可以将上式理解为“结果图像=图像 1×系数1+图像2×系数2+ 亮度调节量
【例 3.4】使用数组演示函数cv2.addWeighted()的使用
编程如下:
import cv2
import numpy as np
img1=np.ones((3,4),dtype=np.uint8)*100
img2=np.ones((3,4),dtype=np.uint8)*10
gamma=3
img3=cv2.addWeighted(img1,0.6,img2,5,gamma)
print(img3)
本例中的各行代码功能如下
第3 行生成一个 3×4 大小的、元素数值都是 100 的二维数组,对应一个灰度图像 imgl
第4 行生成一个 3×4 大小的、元素数值都是 10 的二维数组,对应一个灰度图像 img2
第5 行将调节亮度参数 gamma 的值设置为3
第6 行计算“img1×0.6+img2×5+3”的混合值
运行程序,得到如下运行结果
[[113 113 113 113]
[113 113 113 113]
[113 113 113 113]]
【例 3.5】 使用函数cv2.addWeighted() 对两幅图像进行加权混合,观察处理结果
根据题目要求,编写程序如下
import cv2
a=cv2.imread("boat.bmp")
b=cv2.imread("lena.bmp")
result=cv2.addWeighted(a,0.6,b,0.4,0)
cv2.imshow("boat",a)
cv2.imshow("lena",b)
cv2.imshow("result",result)
cv2.waitKey()
cv2.destroyAllWindows()
本程序使用 cv2.addWeighted()函数,对图像 boat 和图像 lena 分别按照 0.6和 0.4 的权重进行混合,
左图是原始图像
中间的图是原始图像
右图是图像boat和图像lean加权混合结果图像
【例 3.6】使用函数 cv2.addWeighted() 将一幅图像的ROI 混合在另外一幅图像内
根据题目要求,编写程序如下
import cv2
lena=cv2.imread("C:\\Users\\Administrator\\Desktop\\opencv\\lena512.bmp",cv2.IMREAD_UNCHANGED)
dollar=cv2.imread("C:\\Users\\Administrator\\Desktop\\opencv\\dollar.bmp",cv2.IMREAD_UNCHANGED)
cv2.imshow("lena",lena)
cv2.imshow("dollar",dollar)
face1=lena[220:400,250:350]
face2=dollar[160:340,200:300]
add=cv2.addWeighted(face1,0.6,face2,0.4,0)
dollar[160:340,200:300]=add
cv2.imshow("result",dollar)
cv2.waitKey()
cv2.destroyAllWindows()
在本例中,face1 是图像 lena 中的面部部分,face2 是图像 dollar中的面部部分,通过函cv2.addWeighted将 lena 图像内的面部 facel与 dollar 图像内的面部 face2 进行了混合计算
运行程序,会得到如图 3-3 所示的结果,其中
左图是原始图像 lena
中间的图是原始图像 dollar
右图是图像 lena 的面部与图像 dollar 的面部加权混合得到的图像