OpenCv图像处理——数字水印

前言

在一幅数字图像中最低有效位是指构成一个像素点的灰度值的二进制数的第0位,由于第0位的数值在图像的显示上面往往作用非常小,所含能量非常小,因此我们可以利用该性质,在数字图像的最低位加入需要隐藏的信息,该信息称之为数字水印。数字水印的信息类型可以有很多种比如,文本、视频、音频二值图像等等。为了研究方便本文讨论数字水印为二值图像的情况。


实现过程

1、预处理隐藏信息

首先将需要加密的图像进行转换为二值图像,其中只包含两个灰度级0和1。其中0对应黑色,1对应白色。在opencv中其实没有二值图像,我们可以将二值图像理解为特殊的灰度图像。由于需要将隐藏信息嵌入图片的第0位(每个像素点分出一个bit位来存储信息)所以被隐藏信息图像的最高灰度级必须为1,最低为0。

对图像进行二值化可以利用以下方法:

s_black = s[:,:]<128    # s为需要被隐藏的图片  s_black记录灰度值小于128的像素的位置
s[s_black] = 0          # 将灰度值小于128的灰度值置为0
s_white = s[:]>=128     # s_white记录灰度值大于128的像素的位置
s[s_white] = 1          # 将灰度值大于128的灰度值置为1

2、提取载体图像高7位

  1. 构造提取高7位矩阵     提取高7位矩阵 为行列和载体图像行列相等的矩阵,矩阵中的每个值都为254
  2. 提取高7位                    将提取矩阵和载体图像按位与运算

例如:

179211
153119

                                                                                               原图像A

1011  00111101  0011
1001  10010111  0111

                                                                                       原图像的二进制表示AB

254254
254254

                                                                                          提取高7位矩阵T

1111  11101111  1110
1111  11101111  1110

                                                                                 提取高7位矩阵二进制表示TB

将AB和TB按位与运算得到A矩阵的高7位AH7B如下:

1011  00101101  0010
1001  10000111  0110

3、嵌入水印

将表示隐藏图像的二进制图像与载体矩阵按位或运算,得到带有隐藏信息的图像。

假设隐藏图像XB如下:

0000 00010000 0000
0000 00000000 0001

                                                                                        隐藏图像 XB

XB与AH7B按位或运算得到带有隐藏信息的图像YB

1011  00111101  0010
1001  10000111  0111

                                                                                          带有隐藏信息的图像YB

4、提取水印

(1)构造提取矩阵GB

提取矩阵是一个所有灰度值均为1的矩阵,行列与载体矩阵的行列一样。

0000 00010000 0001
0000 00010000 0001

(2)提取矩阵GB与带有隐藏信息的图像YB按位与运算得到水印矩阵ZB

0000 00010000 0000
0000 00000000 0001

                                                                                           水印矩阵ZB

可以看出水印矩阵ZB和带隐藏信息的矩阵XB完全一致。

(3)接下来就是将ZB矩阵中灰度值大于0的像素点的灰度值该为255。该过程与第一步预处理隐藏信息过程相反,详情见下面代码。

代码实现

                        

                                                    原始图像                                                                           水印图片

import cv2 
import numpy as np

demo = cv2.imread("demo.jpg", 0)
cv2.imshow("demo", demo)

s = cv2.imread("s.jpg", 0)   # 因为没有现成的二值图像,在此的s图像是一个包含黑色和白色的彩色图像,因此在这里需要阈值化处理
cv2.imshow("s", s)
s_black = s[:,:]<128
s[s_black] = 0
s_white = s[:]>=128
s[s_white] = 1

r, c = demo.shape

# 构造提取原始图像高7位矩阵
t255 = np.ones((r, c), dtype=np.uint8)*254

# 获取原始图像的高七位
demo_h7 = np.bitwise_and(demo, t255)
cv2.imshow("demo_h7", demo_h7)

# 嵌入水印
demo_s_in = np.bitwise_or(demo_h7, s)
cv2.imshow("demo_s_in", demo_s_in)

# 生成提取矩阵
t1 = np.ones((r, c), dtype=np.uint8)
s_out = np.bitwise_and(demo_s_in, t1)
s_out_white = s_out[:]>0
s_out[s_out_white] = 255
cv2.imshow("s_out", s_out)

cv2.waitKey(-1)
cv2.destroyAllWindows()

                             

                                                高7位图像                                                          带有数字水印的图像

                  

                                       提取出来的数字水印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值