图像加密和解密
通过按位异或可以实现图像的加密和解密。
加密:原始图像和密钥按位异或
解密:加密图像和密钥按位异或
这里的密钥可以是一幅图像也可以是随机生成的像素图
import cv2
import numpy as np
# 读取图像,因为我使用的是RGB图像,参数0将其转为灰度图
jimin = cv2.imread("C:\\Users\\NNoisy\\Desktop\\Jimin.jpg",0)
r,c = jimin.shape
# 设置和原始图像大小一致的随机密钥
key = np.random.randint(0,256,size=[r,c],dtype=np.uint8)
# encryption:加密 decryption:解密
encryption = cv2.bitwise_xor(jimin,key)
decryption = cv2.bitwise_xor(encryption,key)
cv2.imshow("jimin",jimin)
cv2.imshow("key",key)
cv2.imshow("encryption",encryption)
cv2.imshow("decryption",decryption)
cv2.waitKey()
cv2.destroyAllWindows()
数字水印
最低有效位(LSB):指一个二进制数的第0位。也就是我们的位平面分解的最低位,其对于载体图像的影响非常小,具有较高的隐蔽性。所以利用这一点,可以为图像添加非常隐蔽的数字水印(二值图像)。
数字水印处理过程
水印嵌入过程
水印提取过程
import cv2
import numpy as np
# 读取图像,因为我使用的是RGB图像,参数0将其转为灰度图
jimin = cv2.imread("C:\\Users\\NNoisy\\Desktop\\Jimin.jpg",0)
watermark = cv2.imread("C:\\Users\\NNoisy\\Desktop\\Jimin04.jpg",0)
# 因为手边没有现成的水印图像,所以选用了一幅彩色图处理一下作为水印使用
w = watermark[:,:] <= 150
watermark[w] = 0
w = watermark[:,:] > 150
watermark[w] = 1
# 读取原始图像的shape值
r,c = jimin.shape
# 生成提取矩阵
extract = np.ones((r,c),dtype=np.uint8)*254
# 获取载体图像的高七位
high7 = cv2.bitwise_and(jimin,extract)
# 将水印嵌入到新载体图像中去
new = cv2.bitwise_or(high7,watermark)
# 生成元素值均为1的提取矩阵
extract1 = np.ones((r,c),dtype=np.uint8)
# 从载体图像提取水印
fi = cv2.bitwise_and(new,extract1)
# 将水印的1替换为原来的值,方便显示
w = fi[:,:] > 0
fi[w] = 255
cv2.imshow("jimin",jimin)
cv2.imshow("watermark",watermark*255)
cv2.imshow("new",new)
cv2.imshow("fi",fi)
cv2.waitKey()
cv2.destroyAllWindows()