1. 加号运算
使用加号运算符“+”对图像a(像素值为a)和图像b(像素值为b)进行求和运算,遵循以下规则:
img1 = np.random.randint(0, 256, size=[3, 3], dtype=np.uint8)
img2 = np.random.randint(0, 256, size=[3, 3], dtype=np.uint8)
print("imag1=\n", img1)
print("imag2=\n", img2)
print("imag1+imag2=\n", img1 + img2)
2. 函数
使用函数cv2.add()对像素值a和像素值b进行求和运算时,会得到像素值对应图像的饱和值(最大值)。例如,8位灰度图像的饱和值为255,因此,在对8位灰度图像的像素值求和时,遵循以下规则:
img1 = np.random.randint(0, 256, size=[3, 3], dtype=np.uint8)
img2 = np.random.randint(0, 256, size=[3, 3], dtype=np.uint8)
print("imag1=\n", img1)
print("imag2=\n", img2)
img3 = cv2.add(img1, img2)
print("cv2.add(img1,img2)=\n", img3)
3. 按位逻辑运算
将数值转换成对应的二进制进行逻辑操作
4. 位平面分解
将灰度图像中处于统一比特位上的二进制像素值进行组合,得到一副二进制图像,该图像被称为灰度图像的一个位平面,这个过程被称为位平面分解。例如,将一副灰度图像内所有像素点上处于二进制位内的最低位上的值进行组合,可以构成“最低有效位”位平面
lena = cv2.imread("../lena.jpeg", 0)
cv2.imshow("lena", lena)
r, c = demo.shape # 图像预处理
x = np.zeros((r, c, 8), dtype=np.uint8) # 构造提取矩阵
# print(x)
for i in range(8):
x[:, :, i] = 2 ** i
w = np.zeros((r, c, 8), dtype=np.uint8)
for i in range(8):
w[:, :, i] = cv2.bitwise_and(demo, x[:, :, i]) # 提取位平面
mask = w[:, :, i] > 0 # 阈值处理
w[mask] = 255
cv2.imshow(str(i), w[:, :, i]) # 显示图片
5. 图像加密和解密
通过按位异或运算可以实现图像的加密和解密
demo = cv2.imread("../lena.jpeg", 0)
r, c = demo.shape
key = np.random.randint(0, 256, size=(r, c), dtype=np.uint8) # 生成随机的密钥图像
cv2.imwrite("../key.jpg", key) # 保存密匙图像
cv2.imshow("demo", demo) # 显示原始图像
cv2.imshow("key", key) # 显示密钥图像
encryption = cv2.bitwise_xor(demo, key) # 加密
cv2.imwrite("../encryption.jpg", encryption) # 保存加密后的图像
decryption = cv2.bitwise_xor(encryption, key) # 解密
cv2.imwrite("../decryption.jpg", decryption) # 保存解密后的图像
cv2.imshow("encryption", encryption) # 显示密文图像
cv2.imshow("decryption", decryption) # 显示解密后的图像
6. 数字水印
最低有效位(LSB)指的是第零个位平面,最低有效位信息隐藏指的是,将一个需要隐藏的二值图像信息嵌入载体图像的最低有效位,就是将载体图像的最低有效位层替换为当前需要隐藏的二值图像,从而将二值图像隐藏的目的。最低有效位对图像的影响非常不明显,有较高的隐蔽性
demo = cv2.imread("../lena.jpeg", 0)
cv2.imshow("src", demo)
r, c = demo.shape
s = np.ones((r, c), dtype=np.uint8)
cv2.imshow("watermark", s)
# 构造提取原始图像高7位矩阵
t255 = np.ones((r, c), dtype=np.uint8) * 254
# 获取原始图像的高七位
demo_h7 = cv2.bitwise_and(demo, t255)
cv2.imshow("src_h7", demo_h7)
# 嵌入水印
demo_s_in = cv2.bitwise_or(demo_h7, s)
cv2.imshow("src_water_in", demo_s_in)
# 生成提取矩阵
t1 = np.ones((r, c), dtype=np.uint8)
s_out = cv2.bitwise_and(demo_s_in, t1)
cv2.imshow("water_out", s_out)