OpenCV轻松入门:面向Python
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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))进行按位或运算得到的。