本章主要介绍了加法运算、位运算,并使用它们实现了位平面分解、图像异或加密、数字水印、脸部打码/解码等实例。
1、加法运算
在图像处理过程中,经常需要对图像进行加法运算。实现加法运算主要有两种方式,一种通过**加法运算符“+”,另一种是通过cv2.add()函数**对图像进行加法运算。
1.1 加号运行算符
使用加号运算符时,遵循以下规则:
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取余数”
1.2 cv2.add()函数
使用函数时会得到像素值对应图像的饱和值,其语法格式为:
计算结果= 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(图像,数值),第一个参数是图像,第二个参数是数值,此时将超过图像饱和度的数值处理为饱和值(最大值)**。
2、图像加权和cv2.addWeighted()
所谓图像加权和,就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为:
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()
结果如下图所示: