可以通过加号运算符“+”对图像进行加法运算,也可以通过cv2.add()函数对图像进行加法运算
2.1.1加号运算符
mode
mod为取余运算,表示 a+b的和除以256取余数。
例子:使用随机数数组模拟灰度图像,观察使用“+”对像素值求和的结果。
import numpy as np
import cv2 as cv
img1 = np.random.randint(0,255,size = (100,100),dtype = np.uint8)
img2 = np.random.randint(0,255,size = (100,100),dtype = np.uint8)
img1 = img1+img2
cv.imshow(“demo”,img1)
cv.waitKey(0)
cv.destroyAllWindows()
2.1.2 cv2.add()函数
可以用来计算图像像素值相加的和
语法格式:计算结果 = cv2.add(像素值a,像素值b)
需要注意,cv2.add()中参数可能有如下三种形式:
● 形式1:计算结果=cv2.add(图像1,图像2),两个参数都是图像,此时参与运算的图像大小和类型必须保持一致。
● 形式2:计算结果=cv2.add(数值,图像),第1个参数是数值,第2个参数是图像,此时将超过图像饱和值的数值处理为饱和值(最大值)。
● 形式3:计算结果=cv2.add(图像,数值),第1个参数是图像,第2个参数是数值,此时将超过图像饱和值的数值处理为饱和值(最大值)。
例子:
import numpy as np
import cv2 as cv
img1 = np.random.randint(0,255,size = (100,100),dtype = np.uint8)
img2 = np.random.randint(0,255,size = (100,100),dtype = np.uint8)
img = cv.add(img1,img2)
cv.imshow(“demo”,img)
cv.waitKey(0)
cv.destroyAllWindows()
● 使用加号运算符计算图像像素值的和时,将和大于255的值进行了取模处理,取模后大于255的这部分值变得更小了,导致本来应该更亮的像素点变得更暗了,相加所得的图像看起来并不自然。
● 使用函数cv2.add()计算图像像素值的和时,将和大于255的值处理为饱和值255。图像像素值相加后让图像的像素值增大了,图像整体变亮。
**
**
OpenCV中提供了函数cv2.addWeighted(),用来实现图像的加权和(混合、融合),该函数的语法格式为:
dst=cv2.addWeighted(src1,alpha,src2,beta,gamma)
参数alpha和beta是src1和src2所对应的系数,它们的和可以等于1,也可以不等于1。该函数实现的功能是dst=src1×alpha+src2×beta+gamma。
可以将上式理解为“结果图像=图像1×系数1+图像2×系数2+亮度调节量”
例子:使用函数cv2.addWeighted()对两幅图像进行加权混合,观察处理结果。
import numpy as np
import cv2 as cv
imga = cv.imread(“color.jpg”)
imgb = cv.imread(“moliniao.jpg”)
img = cv.addWeighted(imga, 2, imgb, 2, 3)
cv.imshow(“demo”,img)
cv.waitKey(0)
cv.destroyAllWindows()
2.3按位逻辑运算
cv2.bitwise_and():按位与
cv2.bitwise_or():按位或
cv2.bitwise_xor():按位异或
cv2.bitwise_not():按位取反
在opencv中,可以使用cv2.bitwise_and()函数来实现按位与运算,格式:
dst = cv2.bitwise_and(src1,src2,[mask])
dst:与输入值具有同样大小的array输出值
src1:第一个array或者scalar类型的输入值
src2表示第二个array或scalar类型的输入值。
mask表示可选操作掩码,8位单通道array。
在OpenCV中,可以使用cv2.bitwise_or()函数来实现按位或运算,其语法格式为:
dst=cv2.bitwise_or(src1,src2[,mask]])
式中:
● dst表示与输入值具有同样大小的array输出值。
● src1表示第一个array或scalar类型的输入值。
● src2表示第二个array或scalar类型的输入值。
● mask表示可选操作掩码,8位单通道array值。
在OpenCV中,可以使用函数cv2.bitwise_not()来实现按位取反操作,其语法格式为:
dst=cv2.bitwise_not(src[,mask]])
式中:
● dst 表示与输入值具有同样大小的array输出值。
● src表示array类型的输入值。
● mask表示可选操作掩码,8位单通道array值。
异或:相同为0,不同为1
在OpenCV中,可以使用函数cv2.bitwise_xor()来实现按位异或运算,其语法格式为:
dst=cv2.bitwise_xor(src1,src2[,mask]])
式中:
● dst表示与输入值具有同样大小的array输出值。
● src1表示第一个array或scalar类型的输入值。
● src2表示第二个array或scalar类型的输入值。
● mask表示可选操作掩码,8位单通道array值。
**
OpenCV中的很多函数都会指定一个掩模,也被称为掩码,例如:
计算结果=cv2.add(参数1,参数2,掩模)
当使用掩模参数时,操作只会在掩模值为非空的像素点上执行,并将其他像素点的值置为0。
例子:演示掩模的用法
import numpy as np
import cv2 as cv
imga = np.ones((4,4),dtype = np.uint8) * 3
imgb = np.ones((4,4),dtype = np.uint8) * 5
mask = np.zeros((4,4),dtype = np.uint8)
#将mask的部分区域设置为不为0
mask[2:4,2:4] = 1
imgc = np.ones((4,4),dtype = np.uint8) * 66
print(“imga=\n”,imga)
print(“imgb=\n”,imgb)
print(“mask=\n”,mask)
print(“imgc=\n”,imgc)
imgc = cv.add(imga,imgb,mask = maskA)
print(“imgc=\n”,imgc)
例子2:构造一个掩模图像,将该掩模图像作为按位与函数的掩模参数,实现保留图像的指定部分。
**
import numpy as np
import cv2 as cv
#构造一个掩模图像,将该掩模图像作为按位与函数的掩模参数,实现保留图像的指定部分。
img = cv.imread("color.jpg",1)
w,h,c = img.shape
print("w = \n",w)
print("h = \n",h)
print("c = \n",c)
mask = np.zeros((w,h),dtype = np.uint8)
#定义要保留的范围
mask[100:400,200:400]=255
mask[100:500,100:200]=255
c = cv.bitwise_and(img,img,mask = mask)
cv.imshow("demo0",img)
cv.imshow("demo",c)
cv.waitKey(0)
cv.destroyAllWindows()
通过按位异或运算可以实现图像的加密和解密。
通过对原始图像与密钥图像进行按位异或,可以实现加密;将加密后的图像与密钥图像再次进行按位异或,可以实现解密。
a ^ b ^ b =a a:原始图像 b:密钥
例子1:编写程序,通到图像按位异或实现加密和解密过程。
#编写程序,通到图像按位异或实现加密和解密过程。
import numpy as np
import cv2 as cv
#构造一个掩模图像,将该掩模图像作为按位与函数的掩模参数,实现保留图像的指定部分。
img = cv.imread("color.jpg",1)
code_img = cv.imread("reci.jpg",1)
w,h,c = code_img.shape
print("w = \n",w)
print("h = \n",h)
print("c = \n",c)
#make two picture to same shape
img = img[0:300,0:400]
#加密与解密
c = cv.bitwise_xor(img,code_img)
c_pie = cv.bitwise_xor(c,code_img)
cv.imshow("c_pie",c_pie)
cv.imshow("demo",c)
cv.waitKey(0)
cv.destroyAllWindows()
**