基于基于DCT的数字水印算法
数字水印技术近年来得到了较大的发展,基于变换域的水印技术是目前研究的热点。数字水印是利用数字作品中普遍存在的冗余数据和随机性,把标识版权的水印信息嵌入到数字作品中,从而可以起到保护数字作品的版权或其完整性的一种技术。
一个有效的数字水印系统至少具备以下三个最基本的特性:1.安全性:数据信息隐藏于数据图像中,不是文件头中,文件格式的变换不应导致水印信息的丢失。2.隐蔽性:在数字图像作品中嵌入数字水印不会引起图像明显的降质,即含水印的图像与原始图像对人的感觉器官的刺激应该是无差别或差别很小,主观感觉变化很小。3.鲁棒性:是指在经历有意或无意的信号处理过程后,水印信息仍能保持完整性或仍能被准确鉴别。另外还有通用性、惟一性等特性。数字水印的基本应用领域是版权保护、隐藏标识、认证和安全不可见通信等。
本文提出了一种基于dct域的Matlab水印算法,实验结果表 明这种算法具有较好的性能,实现的水印具有不可见性,而且具有较好的鲁棒性。
1.4各种数字水印算法
近几年来数字水印技术研究取得了很大的进步,见诸于文献的水印算法很多,这里对一些典型的算法进行了分析。
1. 空间域算法
数字水印直接加载在原始数据上,还可以细分为如下几种方法:
(1) 最低有效位方法(LSB)
这是一种典型的空间域数据隐藏算法,L.F.Tumer与R.G.VanSchyadel等先后利用此方法将特定的标记隐藏于数字音频和数字图像内。该方法是利用原始数据的最低几位来隐藏信息(具体取多少位,以人的听觉或视觉系统无法察觉为原则)。LSB方法的优点是有较大的信息隐藏量,但采用此方法实现的数字水印是很脆弱的,无法经受一些无损和有损的信息处理,而且如果确切地知道水印隐藏在几位LSB中,数字水印很容易被擦除或绕过。
(2) Patchwork方法及纹理块映射编码方法
这两种方法都是Bender等提出的。Patchwork是一种基于统计的数字水印,其嵌入方法是任意选择N对图像点,在增加一点亮度的同时,降低另一点的亮度值。该算法的隐藏性较好,并且对有损的JPEG和滤波!压缩和扭转等操作具有抵抗能力,但仅适用于具有大量任意纹理区域的图像,而且不能完全自动完成。
2.变换域算法
基于变换域的技术可以嵌入大量比特数据而不会导致可察觉的缺陷,往往采用类似扩频图像的技术来隐藏数字水印信息。这类技术一般基于常用的图像变换,基于局部或是全部的变换,这些变换包括离散余弦变换(DCT)、小波变换(WT)、傅氏变换(FT或FFT)以及哈达马变换(Hadamardtransform)等等。其中基于分块的DCT是最常用的变换之一,现在所采用的静止图像压缩标准JPEG也是基于分块DCT的。最早的基于分块DCT的一种数字水印技术方案是由一个密钥随机地选择图像的一些分块,在频域的中频上稍稍改变一个三元组以隐藏二进制序列信息。选择在中频分量编码是因为在高频编码易于被各种信号处理方法所破坏,而在低频编码则由于人的视觉对低频分量很敏感,对低频分量的改变易于被察觉。该数字水印算法对有损压缩和低通滤波是稳健的。另一种DCT数字水印算法是首先把图像分成8×8的不重叠像素块,在经过分块DCT变换后,即得到由DCT系数组成的频率块,然后随机选取一些频率块,将水印信号嵌入到由密钥控制选择的一些DCT系数中。该算法是通过对选定的DCT系数进行微小变换以满足特定的关系,以此来表示一个比特的信息。在水印信息提取时,则选取相同的DCT系数,并根据系数之间的关系抽取比特信息。除了上述有代表性的变换域算法外,还有一些变换域数字水印方法,它们当中有相当一部分都是上述算法的改进及发展,这其中有代表性的算法是I.Podichuk和ZengWenjun提出的算法。他们的方法是基于静止图像的DCT变换或小波变换,研究视觉模型模块返回数字水印应加载在何处及每处可承受的JND(JustNoticeableDifference,恰好可察觉差别)的量值(加载数字水印的强度上限),这种水印算法是自适应的。
3.NEC算法
该算法由NEC实验室的Cox[等人提出,该算法在数字水印算法中占有重要地位,其实现方法是:首先以密钥为种子来产生伪随机序列,该序列具有高斯N(0,1)分布,密钥一般由作者的标识码和图像的哈希值组成,其次对图像做DCT变换,最后用伪随机高斯序列来调制(叠加)该图像除直流分量外的1000个最大的DCT系数。该算法具有较强的鲁棒性、安全性、透明性等。由于采用特殊的密钥,故可防止IBM攻击,而且该算法还提出了增强水印鲁棒性和抗攻击算法的重要原则,即水印信号应该嵌入源数据中对人感觉最重要的部分,这种水印信号由独立同分布随机实数序列构成,且该实数序列应具有高斯分布N(0,1)的特征。随后Podilchuk等利用人类视觉模型又对该算法进行了改进,从而提高了该算法的鲁棒性!透明性等。
4.其他一些水印算法
近年来利用混沌映射模型实现数字水印、保密通信等成为混沌应用研究的热点。特别是自从Cox等借用通信技术中的扩频原理将水印信号嵌入到一些DCT变换系数或者多层分解的小波变换系数以来,人们已经提出了一些混沌数字水印方法。水印的嵌入与检测是基于人类视觉系统(HVS)的亮度掩蔽特性和纹理掩蔽特性,折衷水印的不可见性和鲁棒性之间的矛盾.结果表明:该方法嵌入的水印具有不可见性和鲁棒性,并且这种基于密钥的混沌水印方法更好的抗破译性能。
目前比较流行的还有一种基于盲水印检测的DWT算法,该算法首先对原始图像进行小波变换,根据人类具有的视觉掩蔽特性对低频分量进行一定的量化,同时可不影响视觉效果,并对作为水印的图像进行压缩和二值化处理,形成一维的二值序列,根据二值序列的值对上述量化后的原始信号的低频分量进行视觉阈值范围内允许的修改,从而实现水印的嵌入。水印提取过程是对含有水印的图像进行小波变换,对低频分量同样进行量化处理,为了增大算法的安全性,可以对水印形成的二值0,1序列在嵌入前进一步进行伪随机序列调制,相应的在水印提取过程需要增加用伪随机序列解调的步骤。这样不知道伪随机序列的攻击者即使推测出水印的嵌入规律,也无法提取水印,大大增加了水印系统的透明性和鲁棒性。
MATLAB程序
1 size=512; N=32;K=8; D=zeros(size);E=0.01;
2 I=imread('f:\lena.bmp');
3 subplot(2,2,1);
4 imshow(I);
5 title('原始图像');
6 I=double(I)/512;
%读入水银
7 J=imread('f:\1234.bmp');
8 subplot(2,2,2);
9 imshow(J);
10 title('水印图像');
11 %对水印缩放
12 J=double(imresize(J,[64,64]));
13 subplot(2,2,3);
41 imshow(J);
15 title('缩放水印图像');
16 %嵌入水印
17 for p=1:size/K
18 for q=1:size/K
19 x=(p-1)*K+1; y=(q-1)*K+1;
20 I_dct=I(x:x+K-1,y:y+K-1);
21 I_dct1=dct2(I_dct);
22 if J(p,q)==0
23 alfa=-1;
24 else
25 alfa=1;
26 end
27 I_dct2=I_dct1+alfa*E;
28 I_dct=idct2(I_dct2);
29 D(x:x+K-1,y:y+K-1)=I_dct;
30 end
31 end
32 subplot(1,3,3);
33 imshow(D,[]);
34 Title('含水印的图象');
35 %%%%%%对加入水印的图像进行各种攻击
36 %%%低通滤波攻击
37 %hh=fspecial('gaussian',3,0.2);
38 %hh=fspecial('gaussian',3,0.35);
39 %hh=fspecial('gaussian',3,0.4);
40 QQ=filter2(hh,D);
41%%%旋转攻击
42 R=imrotate(D,10,'bilinear','crop');
43 %R=imrotate(D,20,'bilinear','crop');
44 %R=imrotate(D,45,'bilinear','crop');
45 %%%%%剪切攻击
46 %D(1:32,1:32)=0; Q2=D;
47 %D(1:64,1:64)=0; Q2=D;
48 %D(1:128,1:128)=0; Q2=D;
49 % 提取水印
50 for p=1:size/K
51 for q=1:size/K
52 x=(p-1)*K+1;
53 y=(q-1)*K+1;
54 I1=I(x:x+K-1,y:y+K-1);
55 I2=QQ(x:x+K-1,y:y+K-1);
56 I_dct1=dct2(I1);
57 I_dct2=dct2(I2);
58 if I_dct2>I_dct1
59 W(p,q)=1;
60 else
61 W(p,q)=0;
62 end
63 end
64 end
65 figure,subplot(1,2,1);imshow(R,[]);title('低通滤波攻击');
66 subplot(1,2,2);imshow(W,[]);title('图像中提取的水印');
67 %%%%%%前后水印相似比较
68 J=double(J);W=double(W);
69 sumJ=0;sumW=0;
70 for j=1:N
71 for i=1:N
72 sumJ=sumJ+J(j,i)*W(j,i);
73 sumW=sumW+W(j,i)*W(j,i);
74 end
75 end
76 CH=(sumW-sumJ)/sumJ