Patchwork数字水印算法基础原理
Patchwork原意为一种用各种颜色和形状拼接成的布料。 Patchwork算法最早由麻省理工学院研发,在空间域上通过大量的模式冗余来实现鲁棒的数字水印技术,期初多用于打印票据的防伪。
基础原理:Patchwork将水印信息隐藏在图像数据的亮度统计特性中,给出了一种原始的扩频调制机制。该算法根据给定的key随机选择N对像素点(ai, bi),然后将每个ai点的亮度值加δ(通常取256的1~5%),每个bi点的亮度值减δ,这样整个图像的平均亮度保持不变。 验证:根据验证用的key取得随机N对像素点,计算每一对像素点的亮度差并累加。如果key正确,最终的累加结果应该接近2 * N * δ;否则,最终累加结果会接近于0。
特点:
-
数据量较小,为了不破坏原始图像,一般只能存储1bit的数据(?存疑);
-
隐藏性好;
-
鲁棒性强,可以抵抗缩放、剪裁等的攻击;
改进Patchwork算法
借鉴: 甘霖,杨榆.基于变换域的Patchwork水印改进算法[J].成都信息工程大学学报,2017,32(06):623-627. 数字水印 改进的patchwork算法 实现_夏荷影的博客-CSDN博客_patchwork算法(MATLAB实现)
改进思路:
(1)离散余弦变换(Discrete Cosine Transform)
与离散傅里叶变换类似,可以将图像从空间域变换到频率域。经过DCT变换后的低频能量会集中在左上角。DCT变换比DFT变换后的能量更加集中。 在水印算法中引入图像的变换域用于嵌入水印,以此增强水印的透明性。
(2)人类视觉系统特性人类的视觉系统对不同颜色的敏感程度不同。
由亮度方程 y = 0.299R + 0.587G + 0.144B可知,人眼对绿色光最为敏感,对红色光的敏感程度次之,对于蓝色光最不敏感。人眼对红色光和蓝色光的敏感程度之和与对绿色光的敏感程度较为接近。 使用红色和蓝色光部分作为 Pacthwork 算法的 A 集合,绿色光作为 B 集合,两个集合在嵌入信息时使用相逆的操作,可以在一定程度上互相抵消嵌入信息引起的图像视觉上的变化,提高水印透明性。
算法描述——嵌入水印
载体图像 I 与水印图像W选取正方形的 RGB 图像,并将水印图像压缩到载体图像的边长为 1/8 。
将载体图像 I 的 3 个颜色通道分离到iBGR数组中,数组的三个元素分别为Bule、Greed、Red 3个颜色分量;
将水印图像W的 3 个颜色通道分离wBGR数组中,数组的三个元素分别为Bule、Greed、Red 3个颜色分量;
对水印图像的三个颜色分量wBGR分别进行Arnold变换得到wBGRA。
对载体图像iBGR中的三个颜色分量进行如下操作:各分量以8×8的大小为一个单位划分为若干子块,对每一个子块分别应用DCT 变换,最终得到三个颜色分量的分块DCT变换矩阵,放入iBGR_DCT中;
(上图为分块DCT变换后生成的图像,可以看到图中有明暗点阵,较亮的点隐约将原图形的轮廓勾勒了出来。)
然后对每个颜色分量的分块DCT变换矩阵取出其中的每一个子块左上角(0, 0)位置的直流分量组成一个新矩阵,该矩阵称为直流分量矩阵iBGRD,该矩阵的边长应为原图像边长的1/8;
在直流分量矩阵上嵌入水印,嵌入方法是增加/减去置乱的水印图像分量k倍的亮度。分量提取公式如下:
将直流分量矩阵还原回分块DCT矩阵的各直流分量处。之后对修改过的iBGR_DCT作逆DCT变换,获得三个颜色分量的矩阵。
合并三个颜色分量矩阵,即可得到嵌入数字水印后的图像。
算法描述——提取水印
ps:美中不足的是该算法不能仅仅依靠嵌有数字水印的图像来提取水印,还需要未嵌入水印的原图。
将含有数字水印的载体图像 P 和原始载体图像 I 的 3 个颜色通道分离;
对P和I的颜色分量矩阵都做DCT变换,并提取出直流分量矩阵pBGRD和iBGRD;
利用直流分量矩阵作差并除以嵌入时设定的系数k,提取水印图片的Arnold变换图像;
对Arnold置换图像作逆Arnold置换后再合并即可得到嵌入的水印图片。
实验
选取k=0.162、0.05、0.03、0.01作为系数,测试嵌入水印的效果如下: