一,数字水印

最低有效位(Least Significant Bit,LSB)指的是一个二进制数中的第0位(即最低位)。最低有效位信息隐藏指的是,将一个需要隐藏的二值图像信息嵌入载体图像的最低有效位,即将载体图像的最低有效位层替换为当前需要隐藏的二值图像,从而实现将二值图像隐藏的目的。由于二值图像处于载体图像的最低有效位上,所以对于载体图像的影响非常不明显,其具有较高的隐蔽性。

这种信息隐藏也被称为数字水印,通过该方式可以实现信息隐藏、版权认证、身份认证等功能。例如,如果嵌入载体图像内的信息是秘密信息,就实现了信息隐藏;如果嵌入载体图像内的信息是版权信息,就能够实现版权认证;如果嵌入载体图像内的信息是身份信息,就可以实现数字签名,等等。所以,被嵌入载体图像内的信息也被称为数字水印信息。

数字水印信息可以是文本、视频、音频等多种形式,这里我们仅讨论数字水印信息是二值图像的情况。

最低有效位水印的实现包含嵌入过程和提取过程,下面对具体的实现方法进行简单介绍。

1.嵌入过程

嵌入过程完成的操作是,将数字水印信息嵌入载体图像内,其主要步骤如下。

(1)载体图像预处理

读取原始载体图像,并获取载体图像的行数M和列数N。

(2)建立提取矩阵

建立一个M×N大小、元素值均为254的提取矩阵(数组),用来提取载体图像的高七位。

(3)保留载体图像的高七位,将最低位置零

为了实现该操作,需要将载体图像与元素值均为254的提取矩阵进行按位与运算。

将一个值在[0,255]之间的像素值P与数值254进行按位与运算,则会将像素值P的最低有效位置零,只保留其高七位。

(4)水印图像处理

有些情况下需要对水印进行简单处理。例如,当水印图像为8位灰度图的二值图像时,就需要将其转换为二进制二值图像,以方便将其嵌入载体图像的最低位。

(5)嵌入水印

将原始载体图像进行“保留高七位、最低位置零”的操作后,我们得到一幅新的图像,将新图像与水印图像进行按位或运算,就能实现将水印信息嵌入原始载体图像内的效果。

(6)显示图像

完成上述处理后,分别显示原始载体图像、水印图像、含水印图像。

2.提取过程

提取过程将完成数字水印的提取,具体步骤如下。

(1)含水印载体图像处理

读取包含水印的载体图像,获取含水印载体图像的大小M×N。

(2)建立提取矩阵

定义一个与含水印载体图像等大小的值为1的矩阵(数组)作为提取矩阵。

(3)提取水印信息

将含水印载体图像与提取矩阵进行按位与运算,提取水印信息。

(4)计算去除水印后的载体图像

有时需要删除包含在水印载体图像内的水印信息。通过将含水印载体图像的最低有效位置零,即可实现删除水印信息。

(5)显示图像

根据需要,分别显示提取出来的水印图像WG、删除水印信息的载体图像ODW。

例:编写程序,模拟数字水印的嵌入和提取过程

# 编写程序,模拟数字水印的嵌入和提取过程
import cv2
import numpy as np
# 读取原始载体图像
gray1=cv2.imread("gray1.jpg",0)
# 读取水印图像
watermark=cv2.imread("watermark.png",0)
# 将水印图像内的值255处理为1,以方便嵌入
# 后续章节会介绍使用threshold处理
w=watermark[:,:]>0
watermark[w]=1
# 读取原始载体图像的shape值
r,c=gray1.shape
# ----------------------嵌入式过程------------------------
# 生成元素值都是254的数组
t254=np.ones((r,c),dtype=np.uint8)*254
# 获取girl图像的高七位
gray1H7=cv2.bitwise_and(gray1,t254)
# 将watermark嵌入girlH7内
e=cv2.bitwise_or(gray1H7,watermark)
# ----------------------提取过程--------------------------
# 生成元素值都是1的数组
t1=np.ones((r,c),dtype=np.uint8)
# 从载体图像内提取水印图像
wm=cv2.bitwise_and(e,t1)
print(wm)
# 将水印图像内的值1处理为255,以方便显示
# 后续章节会介绍使用threshold实现
w=wm[:,:]>0
wm[w]=255
# ------------------------显示---------------------------
cv2.imshow("gray1",gray1)
cv2.imshow("watermark",watermark*255)  #当前watermark内最大值为1
cv2.imshow("e",e)
cv2.imshow("wm",wm)
cv2.waitKey()
cv2.destroyAllWindows()

 输出结果如下:

数字水印 python代码 opencv数字水印_数字水印 python代码

 

数字水印 python代码 opencv数字水印_opencv_02

二, 脸部打码及解码

例:编写程序,使用掩码对lena图像的脸部进行打码,解码

# 编写程序,使用掩码对lena图像的脸部进行打码,解码
import cv2
import numpy as np
# 读取原始载体图像
girl=cv2.imread("girl.png",0)
# 读取原始载体图像的shape值
r,c=girl.shape
mask=np.zeros((r,c),dtype=np.uint8)
mask[130:250,120:250]=1
# 获取一个key,打码,解码所使用的密钥
key=np.random.randint(0,256,size=[r,c],dtype=np.uint8)
# ===============获取打码脸==================
# 使用密钥Key对原始图像girl加密
girlXorKey=cv2.bitwise_xor(girl,key)
# 获取加密图像的脸部信息encryptFace
encryptFace=cv2.bitwise_and(girlXorKey,mask*255)
# 将图像girl内的脸部值设置为0,得到noFace1
noFace1=cv2.bitwise_and(girl,(1-mask)*255)
# 得到打码的图像girl图像
maskFace=encryptFace+noFace1
# ================将打码脸解码===============
# 将脸部打码的girl于密钥key进行异或运算,得到脸部的原始信息
extractOriginal=cv2.bitwise_xor(maskFace,key)
# 将解码的脸部信息extractOriginal提取出来,得到extractFace
extractFace=cv2.bitwise_and(extractOriginal,mask*255)
# 从脸部打码的girl内提取没有脸部信息的girl图像,得到noFace2
noFace2=cv2.bitwise_and(maskFace,(1-mask)*255)
# 得到解码的girl图像
extractGirl=noFace2+extractFace
# =================显示图像======================
cv2.imshow("girl",girl)#原始图像girl,本程序要对其脸部进行打码
cv2.imshow("mask",mask*255)#模板图像mask,其中白色区域的像素值为1,黑色区域的像素值为0
cv2.imshow("1-mask",(1-mask)*255)#模板图像mask的反色图
cv2.imshow("key",key)#密钥图像key,该图像使用随机数生成
cv2.imshow("girlXorKey",girlXorKey)#整体打码图像,是将图像 girl和密钥图像key进行异或运算得到的
cv2.imshow("encryptFace",encryptFace)#从整体打码图像内提取的脸部打码图像encryptFace
cv2.imshow("noFace1",noFace1)#是从图像girl内提取的不包含脸部信息的图像 noFace1
cv2.imshow("maskFace",maskFace)#对图像lena的脸部进行打码的结果图像maskFace
cv2.imshow("extractOriginal",extractOriginal)#提取的初步原始图像extractOriginal
cv2.imshow("extractFace",extractFace)#从提取的初步原始图像extractOriginal中提取的脸部图像extractFace
cv2.imshow("noFace2",noFace2)#从脸部打码的结果图像maskFace内提取的不包含脸部信息的图像noFace2
cv2.imshow("extractGirl",extractGirl)#最终的脸部解码结果图像 extractGirl
cv2.waitKey()
cv2.destroyAllWindows()

输出结果如下:

数字水印 python代码 opencv数字水印_人工智能_03

三,用例图片

gray1.jpg

数字水印 python代码 opencv数字水印_opencv_04

 watermark.png

数字水印 python代码 opencv数字水印_python_05

 girl.png