Capítulo 4 - Cifrado y descifrado de imágenes

Cifrado y principios de cifrado

Utilice la operación XOR para realizar funciones de cifrado y descifrado de imágenes.

Reglas de operación XOR (0 para lo mismo, 1 para diferente)

  • Si los operandos son iguales, el resultado es 0; si los operandos son diferentes, el resultado es 1
  • XOR cualquier número (0/1) con 0, el resultado sigue siendo el mismo
  • XOR cualquier número (0/1) con 1, el resultado es otro número, es decir, 0 se convierte en 1, 1 se convierte en 0
  • XOR cualquier número consigo mismo, el resultado es 0

Lo mismo ocurre con el cifrado y descifrado de imágenes.

  • Proceso de cifrado: operación XOR de texto sin formato a y clave b para obtener texto cifrado c
  • Proceso de descifrado: operación XOR del texto cifrado c y la clave b para obtener el texto sin formato a

ejecutar un código

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()

Ejecutar de la siguiente manera:

Cifrado y descifrado de rostros

El cifrado y descifrado de rostros es en realidad el proceso de cifrar y descifrar algunas áreas de la imagen.

La función de codificación facial es más como una combinación de máscara + operación np XOR. Hay dos formas de codificación facial, una es a través del método de máscara y la otra es a través del método ROI.

método de máscara

Proceso de cifrado:

Proceso de descifrado:

El código específico se implementa de la siguiente manera:

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()

El programa se ejecuta de la siguiente manera:

método de rendimiento de la inversión

El método ROI se trata más de procesar el área de la cara.

El proceso de encriptación facial es el siguiente:

El proceso de descifrado de rostros es el siguiente:

El proceso de encriptar y desencriptar la cara en el método ROI se siente como un proceso de trampa.

el código se muestra a continuación:

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()

El programa se ejecuta de la siguiente manera:

Resumen: el cifrado y descifrado de imágenes se parece más a las operaciones y máscaras XOR, y el uso integral del ROI no es difícil en general.

Supongo que te gusta

Origin blog.csdn.net/sunguanyong/article/details/130252903
Recomendado
Clasificación