加密与加密原理
使用异或运算实现图像加密及解密功能。
异或运算规则(相同为0,不同为1)
- 运算数相同,结果为0;运算数不同,结果为1
- 任何数(0/1)与0异或,结果仍为自身
- 任何数(0/1)与1异或,结果为另外一个数,即0变1, 1变0
- 任何数和自身异或,结果为0
同理到图像加密解密
- 加密过程:明文a与密钥b进行异或运算得到密文c
- 解密过程:密文c与密钥b进行异或运算得到明文a
跑个代码
import cv2 as cv
import numpy as np
lena = cv.imread("lena.jpg")
row, colm,count = lena.shape
print(row)
print(colm)
key = np.random.randint(0, 256, size=[row, colm,count], dtype=np.uint8)
encryption = cv.bitwise_xor(lena, key)
decryption = cv.bitwise_xor(encryption, key)
cv.imshow("lena", lena)
cv.imshow("key", key)
cv.imshow("encryption",encryption)
cv.imshow("decryption",decryption)
cv.waitKey()
cv.destroyAllWindows()
运行如下:
脸部加密及解密
脸部加密及解密其实就是图像部分区域的加解密的过程。
人脸打码的功能更像是掩模+np异或运算的结合,脸部打码有2种方式,一种是通过掩模方式实现,另一种是通过ROI方式实现。
掩模方式
加密过程:
解密过程:
具体代码实现如下:
import cv2 as cv
import numpy as np
# 读取原始图
lena = cv.imread("lena.png", 0)
cv.imshow("lena", lena)
r, c = lena.shape
# 得到掩码模板
mask = np.zeros((r, c), dtype=np.uint8)
mask[220:400, 250:350] = 1
# 得到加密解密的密钥图像
key = np.random.randint(0, 256, size=[r, c], dtype=np.uint8)
# ========================获取加密的脸===================
# step1 使用密钥key对原始图片lena进行加密
lenaXorKey = cv.bitwise_xor(lena, key)
# step2 获取已经加密的脸部位置信息(整个加密图像与mask做与运算)
encryptFace = cv.bitwise_and(lenaXorKey, mask * 255)
# step3 另外再对lena图像进行处理 通过使用 反mask,得到没有人脸信息的lena图像
noFace = cv.bitwise_and(lena, (1 - mask) * 255)
# step4 把获取的已经加密的只有人脸的图像加到被扣掉人脸信息的lena图像上,得到人脸加密的lena图像
maskFace = encryptFace + noFace
cv.imshow("maskFace", maskFace)
# ========================开始人脸解密===================
# step5 将脸部加密的lena与密钥key进行异或,这样人脸区域会解密,其他区域会被加密(不重要)
extractOriginal = cv.bitwise_xor(maskFace, key)
# step6 提取解密后的人脸,其他区域是0
extractFace = cv.bitwise_and(extractOriginal, mask * 255)
# step7 从打码的lena图像中提取没有人脸信息的lena图像(人脸区域为0)
noface2 = cv.bitwise_and(maskFace, (1 - mask) * 255)
cv.imshow("nofaceee", noface2)
# step8 在扣掉人脸的lena图像中加入已经解密后的人脸
extractLena = noface2 + extractFace
cv.imshow("extractLena", extractLena)
cv.waitKey()
cv.destroyAllWindows()
程序运行如下:
ROI方式
ROI方式更多的是对人脸区域进行处理。
人脸加密过程如下:
人脸解密过程如下:
ROI方式给脸部加密解密的过程感觉就是个作弊的过程。
代码如下:
import cv2 as cv
import numpy as np
# 读取原始图
lena = cv.imread("lena.png", 0)
cv.imshow("lena", lena)
r, c = lena.shape
# 得到掩码模板
mask = np.zeros((r, c), dtype=np.uint8)
mask[220:400, 250:350] = 1
# 得到加密解密的密钥图像
key = np.random.randint(0, 256, size=[r, c], dtype=np.uint8)
# ========================获取加密的脸===================
# step1 使用密钥key对原始图片lena进行加密
lenaXorKey = cv.bitwise_xor(lena, key)
# step2 得到加密的人脸区域
secretFace = lenaXorKey[220:400, 250:350]
# step3 把加密的人脸区域贴到lena原始图上
lena[220:400, 250:350] = secretFace
cv.imshow("lena_secretface", lena)
# ========================开始人脸解密===================
# step4 将脸部加密的lena与密钥key进行异或,这样人脸区域会解密,其他区域会被加密(不重要)
extractOriginal = cv.bitwise_xor(lena, key)
# step5 扣下已经解密的人脸图像
face = extractOriginal[220:400, 250:350]
# step6 把扣下的人脸贴到加密的lena上,这样,解密后的脸就把加密的人的区域覆盖了
lena[220:400, 250:350] = face
cv.imshow("enFace", lena)
cv.waitKey()
cv.destroyAllWindows()
程序运行如下:
文章来源:https://www.toymoban.com/news/detail-419252.html
总结:图像的加解密更像是异或运算和掩模,ROI的综合使用,整体难度不大。文章来源地址https://www.toymoban.com/news/detail-419252.html
到了这里,关于第四章-图像加密与解密的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!