3.9 脸部打码及解码
为了帮助读者加深对本章知识点的理解,本节介绍一个使用掩模和按位运算方式实现的对脸部打码、解码实例。
【例3.16】编写程序,使用掩码对lena图像的脸部进行打码、解码。
根据题目要求,编写代码如下:
import cv2 import numpy as np #读取原始载体图像 lena=cv2.imread("lena.bmp",0) #读取原始载体图像的shape值 r, c=lena.shape mask=np.zeros((r, c), dtype=np.uint8) mask[220:400,250:350]=1 #获取一个key,打码、解码所使用的密钥 key=np.random.randint(0,256, size=[r, c], dtype=np.uint8) #============获取打码脸============ #使用密钥key对原始图像lena加密 lenaXorKey=cv2.bitwise_xor(lena, key) #获取加密图像的脸部信息encryptFace encryptFace=cv2.bitwise_and(lenaXorKey, mask*255) #将图像lena内的脸部值设置为0,得到noFace1 noFace1=cv2.bitwise_and(lena, (1-mask)*255) #得到打码的lena图像 maskFace=encryptFace+noFace1 #============将打码脸解码============ #将脸部打码的lena与密钥key进行异或运算,得到脸部的原始信息 extractOriginal=cv2.bitwise_xor(maskFace, key) #将解码的脸部信息extractOriginal提取出来,得到extractFace extractFace=cv2.bitwise_and(extractOriginal, mask*255) #从脸部打码的lena内提取没有脸部信息的lena图像,得到noFace2 noFace2=cv2.bitwise_and(maskFace, (1-mask)*255) #得到解码的lena图像 extractLena=noFace2+extractFace #============显示图像============ cv2.imshow("lena", lena) cv2.imshow("mask", mask*255) cv2.imshow("1-mask", (1-mask)*255) cv2.imshow("key", key) cv2.imshow("lenaXorKey", lenaXorKey) cv2.imshow("encryptFace", encryptFace) cv2.imshow("noFace1", noFace1) cv2.imshow("maskFace", maskFace) cv2.imshow("extractOriginal", extractOriginal) cv2.imshow("extractFace", extractFace) cv2.imshow("noFace2", noFace2) cv2.imshow("extractLena", extractLena) cv2.waitKey() cv2.destroyAllWindows()
运行上述程序,会出现如图3-15所示的图像,其中:
图3-15 【例3.16】程序的运行结果
● 图(a)是原始图像lena,本程序要对其脸部进行打码。
● 图(b)是模板图像mask,其中白色区域的像素值为1,黑色区域的像素值为0。为了方便显示,在使用函数cv2.imshow()显示该图像时,将其中的值1调整为255。
● 图(c)是模板图像mask(图(b))的反色图。
● 图(d)是密钥图像key,该图像使用随机数生成。
● 图(e)是整体打码图像lenaXorKey,是将图像lena(图(a))和密钥图像key(图(d))进行异或运算得到的。
● 图(f)是从整体打码图像(图(e))内提取的脸部打码图像encryptFace。
● 图(g)是从图像lena(图(a))内提取的不包含脸部信息的图像noFace1,在提取过程中,将模板图像mask的反色图(图(c))作为模板。
● 图(h)是对图像lena的脸部进行打码的结果图像maskFace,该图像是通过对脸部打码图像encryptFace(图(f))和不包含脸部信息的图像noFace1(图(g))进行按位或运算得到的。
● 图(i)是提取的初步原始图像extractOriginal,该图像是通过对打码脸部图像maskFace(图(h))和密钥图像key(图(d))进行异或运算得到的。
● 图(j)是从提取的初步原始图像extractOriginal(图(i))中提取的脸部图像extractFace。
● 图(k)从脸部打码的结果图像maskFace(图(h))内提取的不包含脸部信息的图像noFace2。
● 图(l)是最终的脸部解码结果图像extractLena,该图像是通过对提取的脸部图像extractFace(图(j))和不包含脸部信息的图像noFace2(图(k))进行按位或运算得到的。