参 考 文 献
[1] 王颖,肖俊,王蕴红.数字水印原理与技术[M].北京:科学出版社,2007.62-64.
[2] 李道远,常敏,袁春风.基于小波变换的数字水印综述[J].计算机工程与应用,2003,(3): 65-67. [3] 谢海宁,王先培,楼越焕等.数字水印在谱图共享系统中的一种应用[J].武汉大学学报(工学版), 2004,37(6):62-67.
[4] 张旭东,卢国栋,冯健.图像编码基础和小波压缩技术---原理,算法和标准[M].北京:清华大学出版社,2004.165-186.
[5] 张春田,苏育挺,张静.数字图像压缩编码[M].北京:清华大学出社,2006.218-241. [6] 彭玉华.小波变换与工程应用[M].北京:科学出版社,2000.
[7] 宋玉杰,谭铁牛.基于小波域数字水印的图像完整性验证研究[J].中国图像图形学报,2003,8(1): 1-7.
[8] 张辉曹,丽娜.现代通信原理与技术[M].西安:西安电子科技大学出版社,2002.
[9] 邓小颖,胡学龙,高燕. 一种二值文本图像的数字水印算法[J].扬州大学学报(自然科学版),2005,(8):42—45.
[10] 鲁江,王旭强,蔺鹏等.基于小波变换的数字水印算法[J].计算机工程与设计,2006,42(4):1685-1688.
[11] RUANAIDH J K O,PUN. TRotationscale and translation invariant spread spectrum digital image watermark [J].Signal Processing,2002,86(4):303-315.
[12] I J Cox,J Kilian,T Leighton,T Shamoon.Secure Spread Spectrum Watermarking for Multimedia[J].IEEE Transactions on Image Processing,1997,6(12):1673-1687.
[13] 黄达人,刘九芬,黄继武.小波变换域图像水印嵌入对策和算法[J].软件学报,2002,3(7): 1290—1324.
[14] 韦志辉,秦鹏,欧阳宏彬.基于小波域中视觉门限模型的数字水印技术[N].东南大学学报, 1998-2-8(5).
27
附 录
%% ---------------------------------------------------------------------%% % 基于小波变换的扩频图象数字水印-->水印嵌入
%% ---------------------------------------------------------------------%% start_time=cputime; k=1; % 扩频因子
% 读取载体图像 file_name='ship.bmp'; iCover = imread(file_name); dCover = double(iCover); dOrigCover = dCover; Mc=size(iCover,1); Nc=size(iCover,2);
% 读取水印图像 file_name='copyright.bmp'; iWatermark = imread(file_name); dWatermark = double(iWatermark); Mm=size(iWatermark,1); Nm=size(iWatermark,2);
% 将水印图像转变为一维数组
dWatermarkVector=round(reshape(dWatermark,Mm*Nm,1)./256);
% 读取秘钥 file_name='key.bmp';
key=double(imread(file_name))./256;
rand('state',key); % 根据密钥生成随机数种子
28
% 高度 % 宽度
h = waitbar(0,'Embedding, please wait...'); % haar小波变换
[cA1,cH1,cV1,cD1] = dwt2(dCover,'haar');
% 扩频叠加水印
iLength = length(dWatermarkVector); for (kk=1:iLength)
pn_sequence_h=round(2*(rand(Mc/2,Nc/2)-0.5)); pn_sequence_v=round(2*(rand(Mc/2,Nc/2)-0.5));
if (dWatermarkVector(kk) == 0) cH1=cH1+k*pn_sequence_h; cV1=cV1+k*pn_sequence_v; end
waitbar(kk/iLength,h); end close(h);
% 逆小波变换
dEmbed = idwt2(cA1,cH1,cV1,cD1,'haar',[Mc,Nc]);
% 保存嵌入了水印的图像 uEmbed = uint8(dEmbed); imwrite(uEmbed,'~dwt.bmp','bmp');
PSNR = psnr(dOrigCover,dEmbed); % 计算最大信噪比elapsed_time=cputime-start_time
% 对比显示
figure(1),imshow(iCover,[]);
29
title('Original Image'); figure(2),imshow(uEmbed,[]);
title(strcat('Watermarked Image',',PSNR=',num2str(PSNR))); %% END------------------------------------------------------------------%%
%% ---------------------------------------------------------------------%% % 基于小波变换的扩频图象数字水印-->水印检测
%% ---------------------------------------------------------------------%% start_time=cputime; k=1; % 扩频因子
% 读取嵌入了水印的载体图像 file_name='~dwt.bmp'; iEmbed = imread(file_name); dEmbed = double(iEmbed); Mc=size(iEmbed,1); % 高度 Nc=size(iEmbed,2); % 宽度
% 读取水印图像 file_name='copyright.bmp'; iWatermark = imread(file_name); dWatermark = double(iWatermark); ddWatermark=dWatermark;
Mw=size(iWatermark,1); Nw=size(iWatermark,2);
% 读取秘钥 file_name='key.bmp';
key=double(imread(file_name))./256;
30
rand('state',key); % 根据密钥生成随机数种子 MessageVector=ones(1,Mw*Nw);
h = waitbar(0,'Detecting, please wait...'); % haar小波变换
[cA1,cH1,cV1,cD1] = dwt2(dEmbed,'haar');
% 扩频检测水印
iLength = length(MessageVector); for (kk=1:iLength)
pn_sequence_h=round(2*(rand(Mc/2,Nc/2)-0.5)); pn_sequence_v=round(2*(rand(Mc/2,Nc/2)-0.5));
correlation_h(kk)=corr2(cH1,pn_sequence_h); correlation_v(kk)=corr2(cV1,pn_sequence_v);
correlation(kk)=(correlation_h(kk)+correlation_v(kk))/2; waitbar(kk/iLength,h); end
for (kk=1:iLength)
if (correlation(kk) > mean(correlation)) MessageVector(kk)=0; end end close(h);
% 生成水印文件
DDetect=reshape(255*MessageVector,Mw,Nw); Detect=uint8(DDetect);
imwrite(Detect,'~watermark.bmp','bmp');
31