在图像处理过程中,经常需要对图像进行加法运算。实现加法运算主要有两种方式,一种通过**加法运算符“+”,另一种是通过cv2.add()函数**对图像进行加法运算。
使用加号运算符时,遵循以下规则:
a + b = a + b , a + b ≤ 255 a+b= a+b,a+b≤255 a+b=a+b,a+b≤255
a + b = m o d ( a + b , 256 ) , a + b ≤ 255 a+b= mod(a+b,256),a+b≤255 a+b=mod(a+b,256),a+b≤255
式中,mod是取模运算,表示计算“a+b的和除以256取余数”
使用函数时会得到像素值对应图像的饱和值,其语法格式为:
计算结果= cv2.add(像素值a,像素值b),
遵循以下规则:
a + b = a + b , a + b ≤ 255 a+b= a+b,a+b≤255 a+b=a+b,a+b≤255
a + b = 255 , a + b ≤ 255 a+b= 255,a+b≤255 a+b=255,a+b≤255
需要注意的是,函数cv2.add()中的参数可能有如下三种形式:
形式1:计算结果=cv2.add(图像1,图像2),两个参数都是图像,则图像的大小、类型必须**保持一致。
形式2:计算结果=cv2.add(数值,图像),第一个参数是数值,第二个参数是图像,此时将超过图像饱和值的数值处理为饱和值(最大值)。
形式3:计算结果=cv2.add(图像,数值),第一个参数是图像,第二个参数是数值,此时将超过图像饱和度的数值处理为饱和值(最大值)**。
所谓图像加权和,就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为:
dst=saturate(src1a+scr2b+c)
式中,saturate表示取饱和值(最大值)。
函数cv2.addWeighted(),用来实现图像的加权和(混合、融合),该函数的语法格式为:
dst = cv2.addWeighted(src1,alpha,src,beta,gamma)
# 结果图像=图像1*系数1+图像2*系数2+亮度调节量
alpha、beta是src1、src2的系数,它们的和可以是1,也可以不是1,gamma可以是0,但是是必选参数,不能省略。
例1:使用函数cv2.addWeighted()对两幅图像进行加权混合。
import cv2
a = cv2.imread("C:\\Users\\Kris\\Desktop\\lake.tif")
b = cv2.imread("C:\\Users\\Kris\\Desktop\\house.tif")
result = cv2.addWeighted(a,0.6,b,0.4,0)
cv2.imshow("lake",a)
cv2.imshow("house",b)
cv2.imshow("result",result)
cv2.waitKey()
cv2.destroyWindows()
例2:使用cv2.addWeighted()将一幅图像的ROI混合在另外一幅图像内。
import cv2
lake = cv2.imread("C:\\Users\\Kris\\Desktop\\lake.tif",cv2.IMREAD_UNCHANGED)
house = cv2.imread("C:\\Users\\Kris\\Desktop\\house.tif",cv2.IMREAD_UNCHANGED)
cv2.imshow("lake",lake)
cv2.imshow("house",house)
face1 = lake[160:256,200:256]
face2 = house[160:256,200:256]
add = cv2.addWeighted(face1,0.6,face2,0.4,0)
house[160:256,200:256] = add
cv2.imshow("result",house)
cv2.waitKey()
cv2.destroyWindows()