基于傅立叶变换的数字水印嵌入技术 第7页
见附录1。
见附录2。
4.5 试验结果及分析
原始宿主图像是384*384*8b的lena灰度测试图像,见图4.3
若图片无法显示请联系QQ752018766
图 4.3原始图像
Fig. 4.3 primitive images
而水印图像是一幅40*40*1b的二值图像,见图4.4,水印检测不需要原始图像.但需要原始水印图像的尺寸信息。
图 4.4 水印图像
Fig. 4.4 watermark image
下图是用Matlab软件进行试验的结果:
图4.5
Fig. 4.5
经过攻击的图象见附录
第四章 总结与展望
随着信息技术的飞速发展,数字产品的大众化及网络的普及,数字化产品的产权保护成为急需解决的问题。在此背景下产生的数字水印技术作为一种新的有效产权保护手段,必将具有广阔的应用前景和使用价值。
本论文首先针对数字水印技术的发展现状及其相关技术进行了讨论;然后引入傅立叶变换基本理论,作为实现数字水印算法的算法理论基础;接着提出了一种基于傅立叶域相关性检测的水印算法。本算法结合了Arnold置乱方法、经典相关性检测方法和傅立叶域特性,并在嵌入时采用嵌入两个不相关伪随机序列的方法,有效的提高了水印的安全性和相关性检测的准确率,是对经典相关性检测方法的一种改进。
基于信息隐藏的数字水印技术还是一个新兴的研究领域,还有许多未触及的研究课题,现有技术也需要改进和提高。而对于不同攻击鲁棒性的水印算法也是层出不穷。在这里,对数字水印技术未来几年内可能的研究方向做个展望:
1、鲁棒更高的不可见水印的嵌入与检测算法。主要是通过分析现有算法的弱点并进行改
进;参考人类感觉系统的模型;探索新的隐密途径。
2、确定不同水印算法承受各种攻击的能力,即水印的攻击分析,以促进水印系统的不断提高。目前水印系统在抗击几何变形攻击和多拷贝攻击能力上很不足,希望能从水印攻击分析的角度找出合适的抗攻击手段。
3、公钥数字水印系统,即作者使用一个专有的密钥来叠加水印信号,而任何人均可通过一个公开的密钥来检测出水印信号,但是从公开的密钥推导专有密钥和从公开的密钥来去除水印信号两个过程都应当是非常困难的。这一目标一旦有所突破,将最大限度的提高水印系统的实用价值,正如公钥系统在传统密码学领域的贡献一样。目前的公钥数字水印是利用公钥加密来达到的,安全的纯公钥数字水印算法是否存在在理论上还是一个未知数。也可以利用水印黑盒来实现公钥数字水印。这些都是值得研究的课题。
4、基于内容的数字水印系统。建立于统计特征集合上的系统很容易受到非线性变换等方法的攻击,而基于更高层的内容特征叠加水印信号似乎具有更强的抵抗力,这与目前的压缩编码研究领域的进展是一致的。数字水印技术广泛应用的最大障碍在于对非普通攻击的强壮性问题。普通攻击指由普通信号处理操作引起的攻击。而非普通攻击指由有经验的攻击者或固执的黑客所设计的攻击。但是,如果攻破一个水印所花费的代价足够高,那么这个水印系统就应该算是成功的。
应该注意到,数字水印要得到更广泛的应用必须建立一系列的标准和协议,如加载或嵌入数字水印的标准、提取或检测数字水印的标准、数字水印认证的标准等等都是急需的。因为不同的数字水印算法如果不具备兼容性,显然不利于推广数字水印技术的应用。同时还需要建立一些测试标准,以衡量数字水印的稳健性和抗攻击能力。这些标准的建立将会大大促进数字水印技术的应用和发展。
希望自己可以在数字水印领域贡献一份力量。
附录
嵌入水印
clear;
clc
trueImage=imread('kids.tif'); %读入原始图像,设置参数
alfa=.1;LENGTH=2500;
subplot(2,2,1);
imshow(trueImage);
title('原始图像');
dctF1=dct2(trueImage); %对原图像进行DCT变换
subplot(2,2,2);
imshow(log(abs(dctF1)),[]);
title('DCT coefficient matrix');
[m,n]=size(dctF1);
randn('state',10); %产生水印序列并对其进行排序
waterMark1=randn(LENGTH,1);
subplot(2,2,3);
plot(waterMark1);
title('watermark sequence');
[Y0,I0]=sort(waterMark1);
A=dctF1(:); %找出水印嵌入位置(幅值较大的n个频域成分)
[Y1,I1]=sort(A);
x=m*n;
l=x;
k=LENGTH;
M=zeros(x,1);
for i=1:x %修改幅值较大的n个频域成分的幅值,嵌入水印
if k>=1
M(l)=Y1(l)*(1+alfa*Y0(k));
k=k-1;
else
M(l)=Y1(l);
end
l=l-1;
end
N=zeros(x,1);
x=m*n;
for i=1:x
N(I1(i))=M(i);
end
a=1;
for j=1:n,
for i=1:m,
dctF2(i,j)=N(a);
a=a+1;
end
end
idctF1=idct2(dctF2); %DCT反变换,得到嵌入水印的图像
subplot(2,2,4);
imshow(idctF1,[]);
title('embedded image');
攻击实验
几种常见的攻击方法
disp('input your choice according to the following image processing operation');
disp('0--返回');
disp('1--无攻击');
disp('2--添加噪声');
disp('3--滤波');
disp('4--剪切');
disp('5--JPEG压缩');
disp('6--旋转');
d=input('请输入你的选择:');
while d~=0
switch d
case 1
figure;
subplot(2,1,1)
imshow(idctF1,[])
title('embedded image');
watermark_detect(idctF1,Y1,I0,waterMark1);
title('无攻击');
case 2
WImage2=idctF1;
noise0=10*rand(size(WImage2));
WImage2=WImage2+noise0;
figure;
subplot(2,1,1)
imshow(WImage2,[]);
title('adding uniform noise');
watermark_detect(WImage2,Y1,I0,waterMark1);
title('添加噪声')
case 3
WImage3=idctF1;
H=fspecial('gaussian',[10,10],5);
WImage3=imfilter(WImage3,H);
figure;
subplot(2,1,1)
imshow(WImage3,[]);
title('through filter [10 10]');
watermark_detect(WImage3,Y1,I0,waterMark1);
title('滤波')
case 4
WImage4=idctF1;
WImage4(1:128,1:128)=256;
figure;
subplot(2,1,1)
imshow(WImage4,[]);
title('cutting part of the image');
watermark_detect(WImage4,Y1,I0,waterMark1);
title('剪切')
case 5
WImage5=idctF1;
WImage5=im2double(WImage5);
cnum=10;
dctm=dctmtx(8);
P1=dctm;
P2=dctm.';
imageDCT=blkproc(WImage5,[8,8],'P1*x*P2',dctm,dctm.');
DCTvar=im2col(imageDCT,[8,8],'distinct').';
n=size(DCTvar,1);
DCTvar=(sum(DCTvar.*DCTvar)-(sum(DCTvar)/n).^2)/n;
[dum,order]=sort(DCTvar);
cnum=64-cnum;
mask=ones(8,8);
mask(order(1:cnum))=zeros(1,cnum);
im88=zeros(9,9);
im88(1:8,1:8)=mask;
im128128=kron(im88(1:8,1:8),ones(16));
dctm=dctmtx(8);
P1=dctm.';
P2=mask(1:8,1:8);
P3=dctm;
WImage5=blkproc(imageDCT,[8,8],'P1*(x.*P2)*P3',dctm.',mask(1:8,1:8),dctm);
figure;
subplot(2,1,1)
imshow(WImage5,[])
title('JPEG Image');
watermark_detect(WImage5,Y1,I0,waterMark1);
title('JPEG压缩')
case 6
WImage6=idctF1;
WImage6=imrotate(WImage6,45,'bilinear','crop');
figure;
subplot(2,1,1)
imshow(WImage6,[]);
title('rotate 45');
watermark_detect(WImage6,Y1,I0,waterMark1);
title('旋转')
case 0
break;
otherwise
error('You have input a valid value');
end
d=input('Please input your choice:');
end
水印检测函数
%image:嵌入水印的图象
%Y1:原始图象的序列排序
%I0:原始水印的序列排序
%waterMark1:原始水印序列
alfa=.1;
dctW1=dct2(image); %对嵌入水印图象进行DCT变化
B=dctW1(:); %找出幅值较大的系数
[Y2,I2]=sort(B);
[m1,n1]=size(dctW1);
y=m1*n1;
k=length(waterMark1);
N0=zeros(k,1);
while k>=1 %提取水印序列
N0(k)=(Y2(y)-Y1(y))/alfa/Y1(y);
k=k-1;
y=y-1;
end
k=length(waterMark1);
waterMark2=zeros(k,1);
for i=1:k
waterMark2(I0(i))=N0(i);
end
subplot(2,1,2); %选取50个测试序列,其中第10个为提取出的水印
for i=1:50
if i==10;
waterMark=waterMark2;
else
waterMark=randn(k,1);
end
%计算各个序列与原来水印序列的相关值
c=waterMark'*waterMark1/sqrt(waterMark'*waterMark);
stem(i,c);
hold on;
end
上一页 [1] [2] [3] [4] [5] [6] [7] [8] 下一页