matlab数字水印算法及实现和源代码
(完整word版)数字图像水印matlab实现

论文独创性声明本人所呈交的论文,是指导教师的指导下,独立进行研究和开发工作所取得的成果。
除文中已特别加以注明引用的内容外,论文中不包含任何其他个人或集体已经发表或撰写过的研究成果。
对本文的工作做出重要贡献的个人和集体,均已在文中以明确方式标明并致谢。
本人完全意识到本声明的法律结果由本人承担.特此声明。
论文作者(签名):20 年月日摘要随着计算机网络的迅速发展,包括数字图像在内的数字媒体得到了广泛的应用,数字媒体的数据逐渐成为人们获取信息的重要来源,但随之而来出现了一系列如随意复制、编辑、非法传播数字图像的信息安全问题,数字媒体的版权保护问题变的日益突出,数字图像水印技术由此应用而生,已成为信息安全领域的一个研究热点.本文比较系统地研究了数字水印技术在静止图像中的应用问题。
首先介绍了数字水印技术的发展背景,然后对数字水印的原理、特点、分类、典型算法、应用领域以及评价标准等等进行了简要的分析。
其次,本文主要是针对目前现有数字图像水印算法实现过程比较复杂,其中重点讨论关于DCT的数字图像水印技术的嵌入,提取和水印的攻击测试等.最后对数字图像水印的特征进行分析总结。
最终通过Matlab这一工具来实现其具体的过程.通过实验对比分析得到该种算法具有一定的可行性以及较好的鲁棒性。
关键词:数字图像水印,信息安全,DCT算法,Matlab.AbstractWith the rapid development of computer network,digital media, including digital image has been widely used,digital media data gradually become an important source of obtaining information,but there's a series of such as free to copy, edit,illegal dissemination of digital image information security,copyright protection of digital media has become increasingly outstanding, digital image watermarking technology and the application, has become a research hotspot in the field of information security。
数字水印技术及基于MATLAB的快速实现

数字水印技术及基于MATLAB的快速实现关键词:数字水印;MATLAB;DCT 1 引言多媒体及网络的迅速发展使得多媒体信息的交流和传输变得更加简单和快捷,然而,这也使盗版者能以低廉的成本复制及传播未经授权的数字产品,这种对数字产品保护和信息安全的迫切需求,导致了数字水印技术成为多媒体信息安全领域的一个热点问题。
数字水印技术是在不影响宿主媒体主观质量的情况下,在宿主媒体(文本、图像、视频、音频)中嵌入不易被人察觉的标识信息,用以证明原创对其作品的所有权,并作为鉴定、起诉非法侵权的证据。
2 数字水印的特征一般认为数字水印应具有以下特征:(1) 安全性数字水印应该是安全、难以被篡改的。
当数字作品发生变化时,数字水印应当也相应发生变化;同时,未经授权的个人不得修改水印,理论上是未经授权的用户不能检测到产品中是否含有水印。
(2) 鲁棒性当被保护的数据在经过攻击后,嵌入的水印信息仍能保持好的完整性并能以一定的正确概率被检测到。
这些可能的攻击包括噪声、滤波、剪切、旋转和编码等。
(3) 不可感知性数字水印的嵌入不应使得原始作品发生可以感知的变化,也不能使得被保护数据在质量上发生可以感觉到的失真。
(4) 可证明性在多媒体作品的实际应用过程中可能需要多次加入水印,这时水印系统必须能够允许水印被多次嵌入到被保护的数据,而且每个水印均能独立地被证明。
(5) 无歧义性恢复出的水印或对水印判决结果能够表明版权的惟一,不会发生多重版权纠纷问题。
3 数字水印的基本原理通用的水印技术包含两个方面:水印的嵌入和水印的提取或检测,如图1和图2所示。
图 1 水印信号嵌入图 2 水印信号提取或检测4 数字水印的研究现状4.1 文本水印文本水印就是将代表著作人身份的信息(水印)嵌入到电子出版物中,在产生版权纠纷时来验证版权的归属。
其主要分为三大类:基于文档结构的水印方法、基于自然语言处理技术的水印方法、基于传统图像的水印方法。
基于文档结构的各种水印方法都只是提留在文本的表层,无法抵抗对于文本结构和格式的攻击,简单的重新录入攻击就能使之失效,因此这些水印方法普遍存在鲁棒性差的缺点。
基于Matlab的数字水印设计——基于空域的水印实现

摘要数字水印(Digital Watermarking)技术是我们生活中经常见到的信息隐藏技术。
它将一些标识信息(即数字水印)直接嵌入数字载体中,但不影响原载体的使用价值,也不容易被人的知觉系统觉察或注意到。
空间数字水印是信息隐藏技术的一个重要研究方向,另一类是频率数字水印。
空间数字水印采用最低有效位(LSB)算法,通过修改表示数字图像的颜色或颜色分量的位平面,调整数字图像中感知不重要的像素来表达水印的信息,以达到嵌入水印的目的。
本实验是基于matlab的数字水印设计——基于空域的水印实现。
关键词:信息隐藏技术;空间数字水印; LSB算法;matlab目录1 设计任务与目的 (1)2 MATLAB的简介及应用 (1)2.1 MATLAB简介 (1)2.2 MATLAB应用 (1)3 数字水印技术 (2)3.1 数字水印技术的发展 (2)3.2 水印分类 (2)3.3 数字水印的特点 (3)3.4 数字水印技术的基本原理 (4)4 基于LSB的数字水印算法 (5)4.1 LSB算法原理 (5)4.2 LSB算法的实现 (6)4.2.1 水印嵌入算法 (7)4.2.2 水印提取算法 (9)5 MATLAB软件仿真 (11)5.1 仿真结果 (11)5.1.1 水印嵌入仿真 (11)5.1.2 水印提取仿真 (12)5.2 仿真分析 (13)结论 (14)参考文献 (15)基于Matlab的数字水印设计——基于空域的水印实现1 设计任务与目的(1)通过课程设计把自己在大学中所学的知识应用到实践当中。
(2)在课程设计的过程中掌握程序编译及软件设计的基本方法。
(3)深入了解利用Matlab设计基于Matlab的数字水印设计——基于空域的水印实现。
(4)提高自己对于新知识的学习能力及进行实际操作的能力。
(5)锻炼自己通过网络及各种资料解决实际问题的能力。
2 MATLAB的简介及应用2.1 MATLAB简介MATLAB 是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
matlab数字水印嵌入与提取代码

数字水印技术是一种用于保护数字信息安全和保护知识产权的重要技术手段。
Matlab作为一种强大的数学计算软件,具有丰富的数字信号处理和图像处理工具包,能够很好地支持数字水印的嵌入和提取。
本文将介绍如何使用Matlab进行数字水印的嵌入和提取,并给出相应的代码实现。
1. 数字水印嵌入数字水印嵌入是将一段隐藏的信息嵌入到载体中,使得这段信息对于一般观察者来说是不可察觉的。
在Matlab中,可以使用一些图像处理工具进行数字水印的嵌入。
需要读入载体图像和待嵌入的数字水印。
载体图像可以使用Matlab 中的imread函数进行读取,得到一个包含图像像素信息的矩阵。
待嵌入的数字水印可以是一段文本、一幅小型图像或者一段音频信号。
接下来,可以选择合适的嵌入算法进行数字水印的嵌入。
常用的算法包括LSB替换算法、DCT变换算法以及扩频水印算法等。
这些算法都可以在Matlab中找到相应的实现。
将得到的嵌入水印后的图像保存起来,成为带有数字水印的图像。
可以使用Matlab中的imwrite函数将处理后的图像保存到本地。
2. 数字水印提取数字水印提取是将嵌入在载体中的数字水印提取出来,还原成原始的水印信息。
在Matlab中,可以利用数字信号处理和图像处理工具进行数字水印的提取。
需要读入带有数字水印的载体图像。
同样可以使用Matlab中的imread函数进行读取。
接下来,根据数字水印嵌入时所采用的算法,使用相应的提取算法进行数字水印的提取。
提取算法通常与嵌入算法是对应的,可以在Matlab中找到相应的实现。
将提取得到的数字水印展示出来,可以是一段文本、一张图像或者一段音频信号。
在Matlab中可以利用文本处理工具、图像处理工具和音频处理工具展示提取得到的数字水印信息。
3. 示例代码以下是一个简单的示例代码,演示了如何在Matlab中进行数字水印的嵌入和提取:数字水印嵌入image = imread('carrier_image.jpg'); 读入载体图像watermark = imread('watermark_image.jpg'); 读入待嵌入的数字水印watermarked_image = embed_watermark(image, watermark); 使用embed_watermark函数进行数字水印的嵌入imwrite(watermarked_image, 'watermarked_image.jpg'); 保存带有数字水印的图像数字水印提取watermarked_image = imread('watermarked_image.jpg'); 读入带有数字水印的载体图像extracted_watermark = extract_watermark(watermarked_image); 使用extract_watermark函数进行数字水印的提取imshow(extracted_watermark); 展示提取得到的数字水印信息以上代码中,embed_watermark和extract_watermark分别是数字水印的嵌入和提取函数。
数字音频水印MATLAB程序

利用logistic映射产生混沌序列x(n)a=3.571x{1}=0.2while 0<x{n}<1x{n+1}=a.*x{n}.*(1-x{n})n=n+1enddisp(x)结果n=102再对x(n)进行量化得0-1序列于明文序列y(n)进行模2加,得到密文序列。
采样函数:linspace(0,0.8906,50)先将47168bit的宿主音频等步长分段,分为1000段,然后混沌序列选择其中的102段,对每段进行3及小波分解,挑选出绝对值最大的系数,运用嵌入公式。
进行3及小波分解及重构图象的程序问题:如何量化,进行模2加。
二进制如何按位进行加法。
生成水印程序%%%%%%%%%%%%%%%%%%%%%读取声音文件FILE='D:\audio\in\1.wav';[y,Fs,bits]=wavread(FILE);%绘制出原始声音信号图figure(1);subplot(3,1,1);plot(y);title(%用db4小波对读入的声音文件进行3级小波分解[c,l]=wavedec(y,3,'db4');%提取3级小波分解的低频系数和高频系数ca3=appcoef(c,l,'db4',3);cd3=detcoef(c,l,3);cd2=detcoef(c,l,2);cd1=detcoef(c,l,1);x=ca3;lx=length(x);subplot(3,1,2);plot(x);s=max(abs(x))*0.2;i=find(abs(x)>s);%插入位置lx=length(x(i));%产生水印信号,sinmark=[0.001:0.001:7.901];mm=[0.01:0.01:79.01];mark=sin(mm);randn('seed',10);mark=randn(1,lx);figure(2);subplot(3,1,1);plot(mark);ss=mark;rr=ss*0.02;%水印信号嵌入x(i)=x(i).*(1+rr');%小波重构,生成加入了水印信号的声音信号c1=[x',cd3',cd2',cd1'];s1=waverec(c1,l,'db4');figure(1);subplot(3,1,2);plot(s1);whos('s1');disp('');%把加入了水印信号的声音作为sample2.wav保存file1='sample2.wav';wavwrite(s1,Fs,bits,file1);figure(1);subplot(3,1,3);diff1=s1-y';plot(diff1);水印恢复程序%%%%%%%%%%%%%%%%%%%%%%读取原始声音信号FILE='s00.wav';[y,Fs,bits]=wavread(FILE);%用db4小波对读入的声音文件进行3级小波分解[c,l]=wavedec(y,3,'db4');%提取3级小波分解的低频系数和高频系数ca3=appcoef(c,l,'db4',3);cd3=detcoef(c,l,3);cd2=detcoef(c,l,2);cd1=detcoef(c,l,1);%读取含有水印的信号FILE1='sample2.wav';[y1,Fs1,bits1]=wavread(FILE1);%用db4小波对读入的含有水印的声音文件进行3级小波分解[c1,l1]=wavedec(y1,3,'db4');%提取3级小波分解的低频系数和高频系数ca31=appcoef(c1,l1,'db4',3);cd31=detcoef(c1,l1,3);cd21=detcoef(c1,l1,2);cd11=detcoef(c1,l1,1);x=ca3;x1=ca31;lx=length(x);lx1=length(x1);s=max(abs(x))*0.2;i=find(abs(x)>s);lx=length(x(i));z(i)=x1(i)-x(i);mark1=z(i)./x(i)';mark1=mark1/0.02;figure(2);subplot(3,1,2);plot(mark1);diff=mark1-mark;figure(2);subplot(3,1,3);plot(diff);压缩攻击%%%%%%%%%%%%%%%%%%% FILE='sam96.wav';[y7,Fs,bits]=wavread(FILE);[c1,l1]=wavedec(y7,3,'db4');%提取3级小波分解的低频系数和高频系数ca31=appcoef(c1,l1,'db4',3);cd31=detcoef(c1,l1,3);cd21=detcoef(c1,l1,2);cd11=detcoef(c1,l1,1);x=ca3;x1=ca31;lx=length(x);lx1=length(x1);s=max(abs(x))*0.2;i=find(abs(x)>s);lx=length(x(i));z(i)=x1(i)-x(i);mark1=z(i)./x(i)';mark1=mark1/0.02;figure(3);subplot(3,1,1);plot(mark1);%axis([0 8000 -1 1]);FILE='sam128.wav';[y7,Fs,bits]=wavread(FILE);[c1,l1]=wavedec(y7,3,'db4');%提取3级小波分解的低频系数和高频系数ca31=appcoef(c1,l1,'db4',3);cd31=detcoef(c1,l1,3);cd21=detcoef(c1,l1,2);cd11=detcoef(c1,l1,1);x=ca3;x1=ca31;lx=length(x);lx1=length(x1);s=max(abs(x))*0.2;i=find(abs(x)>s);lx=length(x(i));z(i)=x1(i)-x(i);mark1=z(i)./x(i)';mark1=mark1/0.02;figure(3);subplot(3,1,2);plot(mark1);axis([0 8000 -1 1]);FILE='sam160.wav';[y7,Fs,bits]=wavread(FILE);[c1,l1]=wavedec(y7,3,'db4');%提取3级小波分解的低频系数和高频系数ca31=appcoef(c1,l1,'db4',3);cd31=detcoef(c1,l1,3);cd21=detcoef(c1,l1,2);cd11=detcoef(c1,l1,1);x=ca3;x1=ca31;lx=length(x);lx1=length(x1);s=max(abs(x))*0.2;i=find(abs(x)>s);lx=length(x(i));z(i)=x1(i)-x(i);mark1=z(i)./x(i)';mark1=mark1/0.02;figure(3);subplot(3,1,3);plot(mark1);axis([0 8000 -1 1]); 低通滤波%%%%%%%%%%%%%%%%%%%%%%%%%%%[b,a]=butter(10,10000/Fs);y2=y1;y5=filtfilt(b,a,y2);figure(4);freqz(b,a,128,10000)figure(5);subplot(3,1,1)plot(y5);subplot(3,1,2)plot(y);subplot(3,1,3)plot(y-y5);file1='sample3.wav';wavwrite(y5,Fs,bits,file1);FILE1='sample3.wav';[y5,Fs1,bits1]=wavread(FILE1);%用db4小波对读入的含有水印的声音文件进行3级小波分解[c1,l1]=wavedec(y5,3,'db4');%提取3级小波分解的低频系数和高频系数ca31=appcoef(c1,l1,'db4',3);cd31=detcoef(c1,l1,3);cd21=detcoef(c1,l1,2);cd11=detcoef(c1,l1,1);x=ca3;x1=ca31;lx=length(x);lx1=length(x1);s=max(abs(x))*0.2;i=find(abs(x)>s);lx=length(x(i));z(i)=x1(i)-x(i);mark1=z(i)./x(i)';mark1=mark1/0.02;figure(4);subplot(2,1,1);plot(mark1);%%%%%%%%%%%%%%%%%%%%%产生随机信号作为噪声信号noise0=randn(size(y));y3=y1;y3=y3+noise0*200;%用db4小波对读入的含有水印的声音文件进行3级小波分解[c3,l3]=wavedec(y1,3,'db4');%提取3级小波分解的低频系数和高频系数ca32=appcoef(c3,l3,'db4',3);cd32=detcoef(c3,l3,3);cd22=detcoef(c3,l3,2);cd12=detcoef(c3,l3,1);x=ca3;x1=ca32;lx=length(x);lx1=length(x1);s=max(abs(x))*0.2;i=find(abs(x)>s);lx=length(x(i));z(i)=x1(i)-x(i);mark3=z(i)./x(i)';mark3=mark3/0.02;figure(4);subplot(2,1,2);plot(mark3);nbsp;重采样%%%%%%%%%%%%%%%%%%%%%%%%fs1=Fs*0.5;wavwrite(y1,fs1,bits,'ss.wav');[y6,fs2,bits]=wavread('ss.wav');%用db4小波对读入的含有水印的声音文件进行3级小波分解[c4,l4]=wavedec(y6',3,'db4');%提取3级小波分解的低频系数和高频系数ca33=appcoef(c4,l4,'db4',3);cd33=detcoef(c4,l4,3);cd23=detcoef(c4,l4,2);cd13=detcoef(c4,l4,1);x=ca3;x1=ca33;lx=length(x);lx1=length(x1);s=max(abs(x))*0.2;i=find(abs(x)>s);lx=length(x(i));z(i)=x1(i)-x(i)';mark4=z(i)./x(i)';mark4=mark4/0.02;figure(5);subplot(2,1,1);plot(mark4);axis([0 8000 -1 1]);fs1=Fs*0.25;wavwrite(y1,fs1,bits,'ss.wav');[y6,fs2,bits]=wavread('ss.wav');%用db4小波对读入的含有水印的声音文件进行3级小波分解[c4,l4]=wavedec(y6',3,'db4');%提取3级小波分解的低频系数和高频系数ca33=appcoef(c4,l4,'db4',3);cd33=detcoef(c4,l4,3);cd23=detcoef(c4,l4,2);cd13=detcoef(c4,l4,1);x=ca3;x1=ca33;lx=length(x);lx1=length(x1);s=max(abs(x))*0.2;i=find(abs(x)>s);lx=length(x(i));z(i)=x1(i)-x(i)';mark4=z(i)./x(i)';mark4=mark4/0.02;figure(5);subplot(2,1,2);plot(mark4);axis([0 8000 -1 1]);信号裁剪%%%%%%%%%%%%%%%%%%%%%%%%llx=length(y1);llx=fix(llx*0.75);i=[1:llx];y4(i)=y1(i);file1='sample4.wav';wavwrite(y4,Fs,bits,file1);i=[llx+1:length(y1)];y4(i)=y(i);%用db4小波对读入的含有水印的声音文件进行3级小波分解[c4,l4]=wavedec(y4',3,'db4');%提取3级小波分解的低频系数和高频系数ca33=appcoef(c4,l4,'db4',3);cd33=detcoef(c4,l4,3);cd23=detcoef(c4,l4,2);cd13=detcoef(c4,l4,1);x=ca3;x1=ca33;lx=length(x);lx1=length(x1);s=max(abs(x))*0.2;i=find(abs(x)>s);lx=length(x(i));z(i)=x1(i)-x(i)';mark4=z(i)./x(i)';mark4=mark4/0.02;figure(6);subplot(2,1,1);plot(mark4);。
LSB算法水印安全性测试及MATLAB实现

MATLAB - Matlab的优势和特点:(1)友好的工作平台和编程环境MATLAB由一系列工具组成。
这些工具方便用户使用MATLAB的函数和文件,其中许工具采用的是图形用户界面。
包括MATLAB桌面和命令窗口、历史命令窗口、编辑器和调试器、路径搜索和用于用户浏览帮助、工作空间、文件的浏览器。
随着MATLAB的商业化以及软件本身的不断升级,MATLAB的用户界面也越来越精致,更加接近Windows的标准界面,人机交互性更强,操作更简单。
而且新版本的MATLAB提供了完整的联机查询、帮助系统,极大的方便了用户的使用。
简单的编程环境提供了比较完备的调试系统,程序不必经过编译就可以直接运行,而且能够及时地报告出现的错误及进行出错原因分析。
(2)简单易用的程序语言Matlab一个高级的距阵/阵列语言,它包含控制语句、函数、数据结构、输入和输出和面向对象编程特点。
用户可以在命令窗口中将输入语句与执行命令同步,也可以先编写好一个较大的复杂的应用程序(M文件)后再一起运行。
新版本的MATLAB语言是基于最为流行的C++语言基础上的,因此语法特征与C+语言极为相似,而且更加简单,更加符合科技人员对数字表达式的书写格式。
使之更利于非计算机专业的科技人员使用。
而且这种语言可移植性好、可拓展性极强,这也是MATLAB之所以能够深入到科学研究及工程计算各个领域的重要原因。
LSB算法水印安全性测试LSB算法水印源码1、嵌入源码clear all;% 保存开始时间start_time=cputime;% 读入原图像file_name='1.jpeg';[cover_object,map]=imread(file_name);% 读入水印图像file_name='2.jpeg';[message,map1]=imread(file_name);message1=message;message=double(message); %%转换为double数message=fix(message./2); %%转换为0,1组成的矩阵message=uint8(message); %%转换为uint8数% 原图的行数与列数Mc=size(cover_object,1); %原图的行数Nc=size(cover_object,2); %原图的列数% 水印的行数与列数Mm=size(message,1); %水印的行数Nm=size(message,2); %水印的列数% 将水印扩展为原图像大小,并写入watermarkfor ii = 1:Mcfor jj = 1:Ncwatermark(ii,jj)=message(mod(ii,Mm)+1,mod(jj,Nm)+1);endend% 将原图的最低有效位值换为水印的值watermarked_image=cover_object;for ii = 1:Mcfor jj = 1:Ncwatermarked_image(ii,jj)=bitset(watermarked_image(ii,jj),1,watermark(ii,jj)); endend% 将嵌入水印图像写入lsb_watermarked.jpegimwrite(watermarked_image,'lsb_watermarked.jpeg','jpeg');% 显示运行时间elapsed_time=cputime-start_time,% 显示嵌入水印图像figure(1)subplot(1,2,1)imshow(watermarked_image,[])title('嵌入水印图像')subplot(1,2,2)imshow(cover_object,[])title('原图像')%%扩展后水印for ii = 1:Mcfor jj = 1:Ncwatermark1(ii,jj)=message1(mod(ii,Mm)+1,mod(jj,Nm)+1);endendfigure(2)imshow(watermark1,[])title('扩展后的水印')figure(3)imshow(message1,[])title('原水印')2、提取源码clear all;% 保存开始时间start_time=cputime;% 读入嵌入水印图像file_name='lsb_watermarked.jpeg ';watermarked_image=imread(file_name);% 嵌入水印图像的行数与列数Mw=size(watermarked_image,1); %嵌入水印图像行数Nw=size(watermarked_image,2); %嵌入水印图像列数%读入原始水印file_name='2.jpeg';orig_watermark=imread(file_name);%%原始水印的行数与列数Mm=size(orig_watermark,1); %水印的行数Nm=size(orig_watermark,1); %水印的列数% 用嵌入水印图像的最低有效位重建水印for ii = 1:Mwfor jj = 1:Nwwatermark(ii,jj)=bitget(watermarked_image(ii,jj),1);endend% 将提取水印变为原始水印大小watermark=2*double(watermark);for ii = 1:Mm-1for jj = 1:Nm-1watermark1(ii+1,jj+1)=watermark(ii,jj);endendwatermark1(1,1)=watermark(Mm,Nm);% 显示运行时间elapsed_time=cputime-start_time,% 显示提取水印与原始水印figure(4)subplot(1,2,1)imshow(watermark1,[])title('提取水印')subplot(1,2,2)imshow(orig_watermark,[])title('原始水印')3、中值滤波处理二维中值滤波器对图像的处理是用一个二维的窗口去依次成块地覆盖图像中的像素,用覆盖的那些像素值的中值去取代窗口正中的那个像素的值。
基于Matlab的数字水印设计基于空域的水印实现

摘要数字水印(Digital Watermarking)技术是我们生活中经常见到的信息隐藏技术。
它将一些标识信息(即数字水印)直接嵌入数字载体中,但不影响原载体的使用价值,也不容易被人的知觉系统觉察或注意到。
空间数字水印是信息隐藏技术的一个重要研究方向,另一类是频率数字水印。
空间数字水印采用最低有效位(LSB)算法,通过修改表示数字图像的颜色或颜色分量的位平面,调整数字图像中感知不重要的像素来表达水印的信息,以达到嵌入水印的目的。
本实验是基于matlab的数字水印设计——基于空域的水印实现。
关键词:信息隐藏技术;空间数字水印; LSB算法;matlab目录1 设计任务与目的 (1)2 MATLAB的简介及应用 (1)2.1 MATLAB简介 (1)2.2 MATLAB应用 (1)3 数字水印技术 (2)3.1 数字水印技术的发展 (2)3.2 水印分类 (2)3.3 数字水印的特点 (3)3.4 数字水印技术的基本原理 (4)4 基于LSB的数字水印算法 (5)4.1 LSB算法原理 (5)4.2 LSB算法的实现 (6)4.2.1 水印嵌入算法 (7)4.2.2 水印提取算法 (9)5 MATLAB软件仿真 (11)5.1 仿真结果 (11)5.1.1 水印嵌入仿真 (11)5.1.2 水印提取仿真 (12)5.2 仿真分析 (13)结论 (14)参考文献 (15)基于Matlab的数字水印设计——基于空域的水印实现1 设计任务与目的(1)通过课程设计把自己在大学中所学的知识应用到实践当中。
(2)在课程设计的过程中掌握程序编译及软件设计的基本方法。
(3)深入了解利用Matlab设计基于Matlab的数字水印设计——基于空域的水印实现。
(4)提高自己对于新知识的学习能力及进行实际操作的能力。
(5)锻炼自己通过网络及各种资料解决实际问题的能力。
2 MATLAB的简介及应用2.1 MATLAB简介MATLAB 是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
基于LSB的数字水印算法及MATLAB实现

基于LSB 的数字水印算法及MATLAB 实现加密算法宗岳,王恺山东科技大学 山东,中国 ***************摘要—LSB 是一种简单传统的信息隐藏算法,属于数字水印技术中的一种。
本文首先介绍了LSB 技术的原理和特点,然后讨论了基于LSB 的数字水印算法。
最后利用MATLAB 2010 b2对这一算法的加密过程进行了仿真。
关键词:LSB 数字水印 信息隐藏 MATLABI. 介绍随着计算机应用逐渐广泛、网络技术的迅速发展,使音频、视频等多媒体信息都能以数字形式传输和播放,从而使大规模非授权拷贝成为了可能,而这样会损害音乐、电影、书籍和软件等出版业的发展,为了保护知识产权引发了一个很有意义的研究方向:信息隐藏。
本文首先介绍了了数字水印技术的原理和分类,接着对LSB 算法原理及LSB 算法实现进行了介绍,最后使用MATLAB 对其加密过程进行了仿真。
II. 数字水印技术的基本原理数字水印的主要 目的是将特定的信息加入到需要保护的媒体信息中,加入的信息一般是能够代表媒体信息版权的内容,如公司标志、媒体作者、特定代码等,而且要保证数字水印能够抵抗一定的攻击,而不被轻易的破坏和修改,同时数字水印要能够被提取或者能够被检测到。
数字水印的具体内容、算法、提取或检测过程根据实际应用有不同的要求。
数字水印的嵌入和提取过程如图1,图2所示。
图1 数 字水印的嵌入过程图2 数字水印的提取过程图1是数字水印的嵌入过程,加入密钥可以提高数字水印的隐蔽性、抗攻击性,而并非是必须的。
根据用途不同,,嵌入的水印有些是需要还原的,而有些则只需验证水印的存在性,前者需要数字水印的提取算法,而图2需要数字水印的检测算法,根据具体的水印算法,嵌入或提取的过程可能有所不同。
III. 数字水印的分类数字水印技术可以从不同的角度进行分类,因此有多种分类方法。
按数字水印的特性可分为鲁捧数字水印和脆弱数字水印。
鲁棒数字水印主要用于标识数字媒体信息的版权信息,它要求嵌入的水印能够抵抗对媒体的常规编辑和恶意攻击,在对媒体进行如:裁剪、旋转、缩放、压缩的变换后水印信息不受到较大损害。
matlab数字水印算法及实现和源代码

摘要:数字水印技术作为数字媒体版权保护的有效办法,近年来在国内外引起了人们极大的兴趣。
但是由于数字水印技术涉及到的知识面比较广,即使是专业人员有时也感到力不从心,那么如何选择一种有效的编程工具便成为一个亟待解决的问题。
本文从数字水印技术本身的特点、一般模型和典型算法出发,简要地介绍了一种可以快速上手的高效的实用语言——Matlab。
最后,作者给出一个用Matlab实现数字水印实例。
关键词:数字水印Matlab Visual C++6.0 DWT DCT1 引言作为传统加密系统的有效补充办法,从1993年Caronni正式提出数字水印到现在短短几年里,无论是在国内还是在国外对数字水印的研究都引起了人们极大的关注。
但数字水印技术的发展还很不成熟,应用也处于初级阶段。
在我国,知识产权问题是一个敏感的话题,只有深入开展数字水印技术的研究,尽快制定我国的版权保护水印标准,才能使我们在未来可能的国际知识产权纠纷中取得主动权。
那么掌握高效的工具,便成为一个必须解决的问题。
本文就针对数字水印本身的特点,介绍了一种高效的实用工具——MATLAB。
2 数字水印技术2.1 数字水印技术的复杂性数字水印技术涉及到通信理论、编码理论、噪声理论、视听觉感知理论、扩频技术(Spre ad Spectrum)、信号处理(Signal Processing ) 技术、数字图像处理(Digital Image Processing)技术、多媒体(Multimedia)技术、模式识别(Pattern Reorganization)技术、算法设计(Algorithm Design)等理论,用到经典的DFT(Discrete Fourier Transf orm)、DCT(Discrete Cosine Transform)变换和近代最先进的数学工具----小波(Wa velet)。
数字水印又是一个横跨计算机科学、生理学、密码学、数字、数字通信等多门学科,并与I nternet的发展密切相关的交叉科学。
基于Matlab的图像数字水印技术

基于Matlab的图像数字水印技术摘要:信息技术和计算机网络的迅速发展,使得包括图像在内的数字媒体信息的交流达到了前所未有的深度和广度,与此同时,也使得在网上传播的图像版权保护和服务认证面临着日益严峻的挑战。
做为信息隐藏技术在计算机领域的一项重要应用,数字水印具有双重安全性,即水印的添加与否具有不可知性以及水印的提取受秘钥的保护,因而非常适用于信息安全问题,为保护多媒体信息的版权及信息的合法使用提供了一种新的解决思路。
关键字:数字图像水印技术 Matlab正文:1.图像数字水印技术的概念与特点数字水印可以看作是插入到数字媒体中的数字信号或模板。
水印技术把媒体从一种形式转换为另一种形式,但是水印技术基本上没有改变媒体,确保媒体可以认知,一旦解密后,密码术对媒体没有任何保护,但水印可以始终保存在媒体中。
把与媒体、作者、版权和使用许可的有关信息作为水印嵌入到媒体中,需要时从媒体中检测或提取出这些信息,用于证明原创作者对作品的所有权的证据。
水印与宿主数据紧密结合并隐藏其中,成为宿主数据不可分离的组成部分。
1.1基本原理图像数字水印技术是指用信号处理的方法在图像数据中嵌入隐含标记,水印分为可感知和不易感知两种。
(1)可感知水印。
这是一种可以看见的水印,就像插入或覆盖在图像上的标识。
它与可视纸上的水印相似,这类水印一般选用较淡或半透明图案。
它既可以证明作品的归属,又不妨碍对作品的欣赏,主要应用于标识那些可在图像数据库或Internet上得到的图像预览,防止这些图像被作为商业用途。
(2)不易感知水印。
这是一种应用更加广泛的水印,主要用来鉴别产品的真伪及产权保护。
人们在感觉上的冗余是这种水印存在的前提。
与可视水印相反,它加在图像当中从表面上是不易察觉的。
由于数字产品都是为了满足感官需求,这就要求它的水印不可破坏其欣赏价值与使用价值,要求水印不引人注目。
虽然不易感知的数字水印不能阻止合法产品被非法复制,但是当发生版权纠纷时,所有者可以从中提取出标记,从而证明物品为某人所有。
图像数字水印Matlab源代码

图像数字⽔印Matlab源代码1、运⾏MAIN.m即可开始⽔印的嵌⼊和提取。
2、⽂件夹中的两幅图⽚为载体图像和⽔印图像。
3、其他⽂件为主程序所调⽤的⾃定义函数,说明如下:sdwt.m:对图像依视觉能量进⾏树状⼩波分解embed.m:对标记的嵌⼊点进⾏⽔印嵌⼊nembed.m:对每个节点实施⽔印嵌⼊sidwt.m:对嵌⼊后的树形⼦图以⼩波逆变换进⾏重组sdwt_ex.m:依密钥树对含⽔印图像进⾏分解extract.m:依密钥树抽取⽔印nextract.m:对每个节点实施⽔印抽取jadeR.m:JADE算法,⽤于实现ICAfuse_pca.m:PCA算法,⽤于实现融合rand_orth.m:⽣成混叠矩阵随机数MAIN.m 主程序%-------------------⽔印嵌⼊------------------------------------------------while 1clear;c=0.3;a=imread('lina.jpg');%原图像b=imread('changsha.bmp')*255;%⼆值⽔印图像[m1,n1]=size(a);[m2,n2]=size(b);e0=(sum(sum(a.^2)))/(m1*n1);e0=c*e0;%计算基准能量[t,tkey]=sdwt(double(a),'db2',m2,n2,e0);%树状⼩波分解[t,tkey]=embed(t,tkey,b);%嵌⼊⽔印aw=sidwt(t,'db2');%重组figure(1);subplot(1,2,1);imshow(uint8(a));title('原图');subplot(1,2,2);imshow(uint8(aw));title('嵌⼊图');imwrite(uint8(aw),'watermark.jpg');% csvwrite('key.txt',reshape(tkey,m2,n2));v1=m1*m1*255*255;v2=sum(sum((double(a)-aw).^2));snr=10*log10(v1/v2);% 峰值信噪⽐snr。
小波变换的数字水印算法及其matlab实现

小波变换的数字水印算法及其matlab实现1. 概述数字水印技术是信息安全领域的重要研究方向之一,在数字水印技术中,小波变换被广泛应用于数字图像的隐写和水印嵌入。
小波变换是一种时域和频域综合分析的数学工具,它具有多分辨率分析的特点,因此适用于数字水印的隐藏和提取。
2. 小波变换的数字水印算法小波变换的数字水印算法包括水印嵌入和水印提取两个部分。
在水印嵌入部分,首先将原始图像进行小波变换,然后将水印信息嵌入到小波系数中,最后进行逆小波变换得到带有水印的图像。
在水印提取部分,首先对带有水印的图像进行小波变换,然后提取小波系数中的水印信息,最后还原出原始的水印信息。
3. 小波变换的数字水印算法的matlab实现假设我们要对一幅图像进行数字水印嵌入和提取,我们可以使用matlab工具进行实现。
我们可以利用matlab中的小波变换函数对图像进行小波变换,得到小波系数。
我们可以将水印信息以一定的规则嵌入到小波系数中,得到带有水印的小波系数。
利用matlab中的逆小波变换函数将带有水印的小波系数还原成具有水印的图像。
在水印提取部分,我们同样可以利用matlab中的小波变换函数对带有水印的图像进行小波变换,得到小波系数,然后提取出小波系数中的水印信息,最后还原出原始的水印信息。
4. 结论小波变换的数字水印算法是一种具有较高安全性和鲁棒性的数字水印算法,它广泛应用于数字图像的隐写和水印嵌入中。
利用matlab工具实现小波变换的数字水印算法不仅可以加快开发的速度,还可以便于算法的验证和分析。
希望本文可以对小波变换的数字水印算法及其matlab实现有所帮助。
5. 参考文献[1] Cox I J, Miller M L, Bloom J A, et al. Digital Watermarking: Princi-ples Practices. Morgan Kaufmann,2001.[2] 刘昆, 李煜,王裴,等.一种新的基于小波变换的数字图像不可见水印算法[J].计算机应用与软件,2005,22(6):42-44.数字水印技术是一种在数字媒体中隐藏信息的技术,旨在保护作品的版权、完整性、认证及追踪,同时又不会对原始媒体造成太大的修改,因此在当前的数字化信息传输和存储领域具有广泛的应用。
基于MATLAB的数字图像水印算法研究与应用

基于MATLAB的数字图像水印算法研究与应用数字图像水印技术是一种信息隐藏技术,通过在数字图像中嵌入特定的信息,实现对图像的认证、版权保护、身份验证等功能。
在当今信息爆炸的时代,数字图像水印技术越来越受到人们的关注和重视。
本文将围绕基于MATLAB的数字图像水印算法展开研究与应用探讨。
一、数字图像水印技术概述数字图像水印技术是一种将特定信息嵌入到数字图像中并能够提取出来的技术。
通过在图像中添加水印信息,可以实现对图像的认证、完整性验证、版权保护等功能。
数字图像水印技术主要包括空域水印和频域水印两种类型,其中频域水印技术又包括离散余弦变换(DCT)域水印和小波变换域水印等。
二、MATLAB在数字图像处理中的应用MATLAB是一种强大的科学计算软件,广泛应用于数字图像处理领域。
其丰富的工具箱和便捷的编程环境使得MATLAB成为研究者和工程师首选的工具之一。
在数字图像处理中,MATLAB提供了丰富的函数和工具,可以实现图像的读取、显示、处理、分析等操作,为数字图像水印算法的研究与实现提供了便利。
三、数字图像水印算法原理1. 空域水印算法空域水印算法是将水印信息直接嵌入到原始图像的像素值中。
常见的空域水印算法包括LSB替换算法、LSB匹配算法等。
LSB替换算法是将水印信息嵌入到原始图像的最低有效位中,以保证对原始图像影响最小;LSB匹配算法则是通过调整像素值使得其最低有效位与水印信息相匹配。
2. 频域水印算法频域水印算法是将水印信息嵌入到原始图像的频域表示中,常见的频域水印算法包括DCT域水印和小波变换域水印。
DCT域水印是将水印信息嵌入到原始图像的DCT系数中,利用DCT变换的性质实现对原始图像的保护;小波变换域水印则是将水印信息嵌入到原始图像的小波系数中,具有更好的鲁棒性和安全性。
四、基于MATLAB的数字图像水印算法实现在MATLAB环境下,可以通过编写相应的代码实现数字图像水印算法。
首先需要读取原始图像和水印信息,然后根据所选的算法进行水印嵌入和提取操作。
基于MATLAB数字水印系统设计

• 4.按内容划分
• 按数字水印的内容可以将水印划分为有意义水印 和无意义水印。有意义水印是指水印本身也是某 个数字图像(如商标图像)或数字音频片段的编 码;无意义水印则只对应于一个序列号。有意义 水印的优势在于,如果由于受到攻击或其他原因 致使解码后的水印破损,人们仍然可以通过视觉 观察确认是否有水印。但对于无意义水印来说, 如果解码后的水印序列有若干码元错误,则只能 通过统计决策来确定信号中是否含有水印。
• 2)通用性:比较好水印算法大多都实用于多类媒 体格式与文件格式。通用性在特定程度上也代表 易用性。
• 3)计算效率高:在软件和硬件方面,水印算法也 应该能被有效的实现。需要特别注意的是,在分 布式网络上的多媒体数据监视方面,水印检测算 法的能够快速完成。
2.2数字水印技术的分类
• 数字水印的分类方法有很多种,不同的出发点导 致了不同的分类,他们之间既有联系又有区别, 本文主要介绍按水印的嵌入域划分。
•
II=II+1;
•
end
•
end
•
end
• end
•
%分块DCT反变换
• watermarked_image(y:y+blocksize-
1,x:x+blocksize-1)=idct2(dct_block);
1)*8:j*8),(1+(i-1)*8):i*8)));
•
fc(xx)=1/64*sum(sum((cover_object((1+(j-
1)*8:j*8),(1+(i-1)*8):i*8)-pjhd(xx)).^2));
•
xx=xx+1;
• end
• end
matlab 基于奇异值分解的数字水印算法

基于奇异值分解(Singular Value Decomposition,SVD)的数字水印算法是一种常用的信息隐藏技术,它通过在原始载体数据(如图像、音频或视频)中嵌入秘密信息(即水印)来实现数据的版权保护和完整性验证。
SVD 是一种强大的矩阵分解技术,可以用于提取和修改图像的关键特征,从而实现水印的嵌入和提取。
以下是一个基于SVD 的简单数字水印算法的基本步骤,以及如何在MATLAB 中实现它:步骤1:选择载体图像和水印信息•载体图像:选择一张用于嵌入水印的图像。
•水印信息:可以是文本、二值图像或灰度图像等。
步骤2:对载体图像进行奇异值分解•使用MATLAB 的svd函数对载体图像的某个重要部分(如DCT 或小波变换的系数矩阵)进行奇异值分解。
步骤3:嵌入水印信息•修改分解得到的奇异值矩阵中的某些值,以嵌入水印信息。
通常,可以选择修改较小的奇异值,以减少对原始图像视觉质量的影响。
步骤4:重构图像•使用修改后的奇异值矩阵和原始的左右奇异向量矩阵重构图像。
步骤5:提取水印信息•当需要验证图像版权或提取水印时,再次对嵌入水印后的图像进行奇异值分解,并从分解得到的奇异值矩阵中提取出水印信息。
MATLAB 示例代码以下是一个简化的MATLAB 示例代码,展示了如何在图像中嵌入和提取基于SVD 的水印:matlab% 读取载体图像和水印图像carrier_image = imread('carrier.png');watermark_image = imread('watermark.png');% 将图像转换为灰度图像(如果需要)if size(carrier_image, 3) == 3carrier_image = rgb2gray(carrier_image);endif size(watermark_image, 3) == 3watermark_image = rgb2gray(watermark_image);end% 对载体图像进行奇异值分解A = double(carrier_image); % 将图像转换为双精度矩阵[U, S, V] = svd(A); % 进行奇异值分解% 嵌入水印信息(简化示例)% 假设水印是一个简单的二值矩阵,且其大小远小于载体图像watermark_vector = double(watermark_image(:)); % 将水印图像转换为一维向量% 选择要修改的奇异值的位置(这里简单选择第一个非零奇异值)idx = find(S > 0, 1);S(idx) = S(idx) + sum(watermark_vector); % 修改奇异值以嵌入水印% 重构图像watermarked_image = U * diag(S) * V'; % 使用修改后的奇异值重构图像watermarked_image = uint8(watermarked_image); % 转换回 uint8 格式以显示和保存imshow(watermarked_image); % 显示嵌入水印后的图像% 提取水印信息(简化示例)% 重新进行奇异值分解以提取水印[U_ext, S_ext, V_ext] = svd(double(watermarked_image));% 从修改的奇异值中提取水印信息extracted_watermark_value = S_ext(idx) - S(idx); % 减去原始奇异值以得到水印信息extracted_watermark_vector = round(extracted_watermark_value /length(watermark_vector)); % 将水印值转换回水印向量extracted_watermark_image = reshape(extracted_watermark_vector,size(watermark_image)); % 将水印向量重塑为图像大小imshow(extracted_watermark_image, []); % 显示提取的水印图像请注意,这个示例代码是非常简化的,并且可能不适用于所有情况。
数字水印matlab程序

clear all;close all;clc;V=double(imread('D:\lena\lena.jpg'));imshow(mat2gray(V));[i u]=size(V); %计算V的规格r=100; %设置分解矩阵的秩W=rand(i,r) %初始化WH,为非负数H=rand(r,u)maviter=100; %最大迭代次数for iter=1:maviterW=W.*((V./(W*H))*H'); %注意这里的三个公式和文中的是对应的W=W./(ones(i,1)*sum(W));H=H.*(W'*(V./(W*H)));endimg_V=W*H;figure;imshow(mat2gray(img_V));首先读入原始图象并设置参数,然后嵌入水印信息,程序代码如下:clear%size=256;block=8;blockno=size/block;LENGTH=size*size/64;Alpha1=0.02; Alpha2=0.1; T1=3; I=zeros(size,size); D=zeros(size,size);BW=zeros(size,size); block_dct1=zeros(block,block);%产生水印序列并对其排序randn('seed',10);watermark1=randn(1,LENGTH);subplot(2,2,1);plot(watermark1);title('watermarc:Gaussian noise');subplot(2,2,3);title('edge of origine image')[Y0,I0]=sort(watermark1);%%读入原图象trueImage=imread('H:\Documents and Settings\sunhw\My Documents\My Pictures\biaozhun.bmp');alfa=.1;LENGTH=2500;subplot(2,2,2);imshow(trueImage);title('origine image:I');%%对原图象进行DCT变换dctF1=dct2('H:\Documents and Settings\sunhw\My Documents\MyPictures\biaozhun.bmp');[m,n]=size(dctF1);%%找出水印嵌入位置(幅值较大的n个频域成分)A=dctF1(:);[Y1,I1]=sort(A);x=m*n;k=LENGTH;M=zeros(x,1);%%修改幅值较大的n个频域成分的幅值,嵌入水印(因为两个问题不同,所以有两个注释符)for i=1:xif k>=1M(x)=Y1(x)*(1+alfa*Y0(k));k=k-1;elseM(x)=Y1(x);endx=x-1;endN=zeros(x,1);x=m*n;for i=1:xN(I1(i))=M(i);enda=1;for j=1:nfor i=1:mdctF2(i,j)=N(a);a=a+1;endend%%DCT反变换,得到嵌入水印的图象idctF1=idct2(dctF2);subplot(2,2,4);imshow(log(abs(idctF1)),[ ]);title('embeded image:D');%endI=imread('D:\lena\1.jpg');disp(I);I=double(I)/255;disp(I);I=ceil(I);%%%%%%%%%%显示水印图像%%%%%%%%%%%%%figure(1);subplot(2,3,1);imshow(I),title('水印图像')dimI=size(I);rm=dimI(1);cm=dimI(2);%%%%%%%%%%%%%%%5 以下生成水印信息 %%mark=I;alpha=0.05;V=imread('D:\lena\lena.jpg');[i u]=size(V); %计算V的规格r=100; %设置分解矩阵的秩W=rand(i,r) %初始化WH,为非负数H=rand(r,u)maviter=100; %最大迭代次数for iter=1:maviterW=W.*((V./(W*H))*H'); %注意这里的三个公式和文中的是对应的 W=W./(ones(i,1)*sum(W));H=H.*(W'*(V./(W*H)));endk1=H;psnr_cover=double(V);subplot(2,3,2),imshow(a0,[]),title('载体图像');[r,c]=size(a0);cda0=blkproc(a0,[8,8],'dct2'); %%%%%%%%%%%%%%%%%%%% 嵌入 %%%%%% cda1=cda0; % cda1 = 256_256for i=1:rm % i=1:32for j=1:cm % j=1:32x=(i-1)*10;y=(j-1)*10;if mark(i,j)==1k=k1;elsek=k2;endcda1(x+1,y+8)=cda0(x+1,y+8)*(1+alpha*k(1));cda1(x+2,y+7)=cda0(x+2,y+7)*(1+alpha*k(2));cda1(x+3,y+6)=cda0(x+3,y+6)*(1+alpha*k(3));cda1(x+4,y+5)=cda0(x+4,y+5)*(1+alpha*k(4));cda1(x+5,y+4)=cda0(x+5,y+4)*(1+alpha*k(5));cda1(x+6,y+3)=cda0(x+6,y+3)*(1+alpha*k(6));cda1(x+7,y+2)=cda0(x+7,y+2)*(1+alpha*k(7));cda1(x+8,y+1)=cda0(x+8,y+1)*(1+alpha*k(8));endend%%%%% 嵌入水印后图像 %%%%%%%%%%%%%%a1=blkproc(cda1,[8,8],'idct2');a_1=uint8(a1);imwrite(a_1,'withmark.bmp','bmp');subplot(2,3,3),imshow(a1,[]),title('嵌入水印后的图像');size=256;block=8;blockno=size/block;%一行有32格LENGTH=size*size/64;Alpha1=0.025;Alpha2=0.1;T1=3;I=zeros(size,size);%产生全矩阵D=zeros(size,size);BW=zeros(size,size);Block_dct1=zeros(block,block);%产生水印,并显示水印信息;subplot(3,2,1);Info='dcf';InfoStrSize=length(Info);%将字符串转换为位数组array=zeros(1,InfoStrSize*8);for m=1:InfoStrSizeInfochar=double(Info(m)); %% 'c'为99for n=1:8array(8*(m-1)+n)=bitget(Infochar,n);%%获得Infochar第n位的值 endendplot(array);title('原始水印信息');%显示原图subplot(3,2,2);i=imread('lena.bmp');imshow(i,[]);title('原始图像')%显示prewitt为算子的边缘图BW=edge(i,'prewitt');%BW=edge(I,’Roberts’);%BW=edge(I,’Sobel’);%BW=edge(I,’zerocross’);subplot(3,2,3);imshow(BW);Title('原始图像边缘图');%嵌入水印l=1;k=1;for m=1:blocknofor n=1:blocknox=(m-1)*block+1; y=(n-1)*block+1;%算出每格图像的坐标(x,y),block=8,8*8的图像小格block_dct1=H(x:x+block-1,y:y+block-1);%取原始图像小格中的像素点到block_dct1矩阵中。
数字水印技术LSB算法MATLAB源代码

close allclear all;% save start timestart_time=cputime;% read in the cover objectfile_name='E:\Phd\My Paper\Second paper -- Experiment\Experiment\Cover and Secretlmage\le na.bmp:[cover_object,map]=imread(file _n ame);% read in the secret imagefile_name='E:\Phd\My Paper\Second paper -- Experiment\Experiment\Cover and SecretImage\hat.bmp';[secret,map1]=imread(file_ name);secret仁secret;% convert to double for n ormalizatio n, the n back aga insecret=double(secret);secret=fix(secret./2); %rounds the eleme nts of A toward zero, result ing in an array of in tegers secret=uin t8(secret);% determ ine size of cover objectMc=size(cover_object,1); %HeightNc=size(cover_object,2); %Width% determ ine size of secret objectMm=size(secret,1); %HeightNm=size(secret,2); %Width% title the secret object out to cover object size to gen erate watermarkfor ii = 1:Mcfor jj = 1:Ncif (secret(ii,jj)>75)watermark(ii,jj)=255;elsewatermark(ii,jj)=0;endendend% now we set the lsb of cover_object(ii,jj) to the value of watermark(ii,jj)watermarked_image=cover_object;for ii = 1:Mcfor jj = 1:Ncif (watermark(ii,jj)==O)watermarked 」m age(ii,jj)=bitset(watermarked 」m age(ii,jj),1,0);%Set bit certa in positi onelsewatermarked 」m age(ii,jj)=bitset(watermarked 」m age(ii,jj),1,1); %Set bit certa in positi onendendend% write the watermarked image out to a fileimwrite(watermarked 」mage,'lsb_watermarked.bmp','bmp');%==================================Extracti on===========================% determ ine size of watermarked imageMw=size(watermarked 」mage,1); %HeightNw=size(watermarked 」mage,2); %Width% use lsb of watermarked image to recover watermarkfor ii = 1:Mwfor jj = 1:NwRecoveryWatermark(ii,jj)=bitget(watermarked 」m age(ii,jj),1);endend% scale the recovered watermarkRecoveryWatermark=2*double(RecoveryWatermark);%====================================================================%===========================SharpAttack================= SharpedWatermarkImage = watermarked 」m age;H = fspecial('u nsharp',0.001); %the alpha from 0.005 to 0.1 20 numberssharpImage = imfilter(SharpedWatermarklmage,H,'replicate');figure(6);colormap(gray(256));imshow(sharpImage); atattitle('sharp Image');imwrite(sharplmage, gray(256), 'sharplmage.bmp');% determ ine size of watermarked imageMSw=size(sharpImage,1); %HeightNSw=size(sharplmage,2); %Width% use lsb of watermarked image to recover watermarkfor ii = 1:MSwfor jj = 1:NSwRecoverySharpWatermark(ii,jj)=bitget(abs(sharplmage(ii,jj)),1);endend% scale the recovered watermarkRecoverySharpWatermark=2*double(RecoverySharpWatermark);psn rSharp = psn r(RecoveryWatermark, RecoverySharpWatermark)figure(7);colormap(gray(256));imshow(RecoverySharpWatermark,[])title('RecoverySharpWatermark');%====================================================================%%%===========================Gaussia n Blur=================Gaussia nBlurWatermarkedlmage = watermarked_image;H = fspecial('gaussian',size(GaussianBlurWatermarkedlmage),0.035); %the alpha from 0.005 to 0.1 20 numbersGaussia nBlurlmage = imfilter(Gaussia nBlurWatermarkedlmage,H,'replicate');figure(8);colormap(gray(256));imshow(Gaussia nBlurlmage』)title('Gaussia n Blur Image');imwrite(Gaussia nBlurlmage, gray(256), 'Gaussia nBlurlmage.bmp');% determ ine size of watermarked imageMSw=size(Gaussia nBlurlmage,1); %HeightNSw=size(Gaussia nBlurlmage,2); %Width% use lsb of watermarked image to recover watermarkfor ii = 1:MSwfor jj = 1:NSwRecoveryGaussia nBlurWatermark(ii,jj)=bitget(Gaussia nBlurlmage(ii,jj),1);end end% scale the recovered watermarkRecoveryGaussia nBlurWatermark=2*double(RecoveryGaussia nBlurWatermark);psn rBlur = psn r(RecoveryWatermark, RecoveryGaussia nBlurWatermark) figure(9);colormap(gray(256));imshow(RecoveryGaussia nBlurWatermark』) title('RecoveryGaussia nWatermark');% %% %===========================================================% %HistogramhistogramWatermarkedlmage = watermarked」m age;histogramimage = histeq(watermarked_image,10); % from 10 to 200 figure(10);colormap(gray(256));image(histogramimage);title('histogramimage Image');imwrite(histogramimage, gray(256), 'histogramimage.bmp');MSw=size(histogramlmage,1); %HeightNSw=size(histogramlmage,2); %Width% use lsb of watermarked image to recover watermarkfor ii = 1:MSwfor jj = 1:NSwRecoveryHistogramWatermarked(ii,jj)=bitget(histogramlmage(ii,jj),1); endend% scale the recovered watermarkRecoveryHistogramWatermarked=2*double(RecoveryHistogramWatermarked); psn rHistorgram = psn r(RecoveryWatermark, RecoveryHistogramWatermarked) figure(11);colormap(gray(256));imshow(RecoveryHistogramWatermarked,[]) title('RecoveryHistogramWatermarked');%%%% %==========================Noise=============================NoiseWatermarked = watermarked_image;Noiseimage = imno ise(NoiseWatermarked,'gaussia n',0.001);figure(12);colormap(gray(256));imshow(NoiseImage);title(' no iselmage');imwrite(Noiselmage, gray(256), 'no iselmage.bmp');MSw=size(Noiselmage,1); %HeightNSw=size(Noiselmage,2); %Width% use lsb of watermarked image to recover watermarkfor ii = 1:MSwfor jj = 1:NSwRecoveryNoiseWatermarked(ii,jj)=bitget(Noiselmage(ii,jj),1);endend% scale the recovered watermarkRecoveryNoiseWatermarked=2*double(RecoveryNoiseWatermarked);psn rNoise = psn r(RecoveryWatermark, RecoveryNoiseWatermarked)figure(13);colormap(gray(256));imshow(RecoveryNoiseWatermarked,[]) title('RecoveryNoiseWatermarked'); %%===================================================================% display process ing time elapsed_time=cputime-start_time,。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
摘要:数字水印技术作为数字媒体版权保护的有效办法,近年来在国内外引起了人们极大的兴趣。
但是由于数字水印技术涉及到的知识面比较广,即使是专业人员有时也感到力不从心,那么如何选择一种有效的编程工具便成为一个亟待解决的问题。
本文从数字水印技术本身的特点、一般模型和典型算法出发,简要地介绍了一种可以快速上手的高效的实用语言——Matlab。
最后,作者给出一个用Matlab实现数字水印实例。
关键词:数字水印Matlab Visual C++6.0DWT DCT1引言作为传统加密系统的有效补充办法,从1993年Caronni正式提出数字水印到现在短短几年里,无论是在国内还是在国外对数字水印的研究都引起了人们极大的关注。
但数字水印技术的发展还很不成熟,应用也处于初级阶段。
在我国,知识产权问题是一个敏感的话题,只有深入开展数字水印技术的研究,尽快制定我国的版权保护水印标准,才能使我们在未来可能的国际知识产权纠纷中取得主动权。
那么掌握高效的工具,便成为一个必须解决的问题。
本文就针对数字水印本身的特点,介绍了一种高效的实用工具——MATLAB。
2数字水印技术2.1数字水印技术的复杂性数字水印技术涉及到通信理论、编码理论、噪声理论、视听觉感知理论、扩频技术(Sprea d Spectrum)、信号处理(Signal Processing)技术、数字图像处理(Digital Image Pr ocessing)技术、多媒体(Multimedia)技术、模式识别(Pattern Reorganization)技术、算法设计(Algorithm Design)等理论,用到经典的D FT(Discrete Fourier Transform)、DCT(Discrete Cosine Transform)变换和近代最先进的数学工具----小波(Wavelet)。
数字水印又是一个横跨计算机科学、生理学、密码学、数字、数字通信等多门学科,并与I nternet的发展密切相关的交叉科学。
数字水印的多学科性导致数字水印技术研究的难度和复杂性。
所以,针对数字水印技术本身的跨学科特点,找出一种合适的编程工具,往往可以起到事半功倍的效果。
下面我们从数字水印的一般模型出发,来逐步介绍MATLAB。
2.2数字水印的一般模型数字水印的一般模型如图1所示:频域法加入数字水印的原理是首先将原始信号(语音一维信号、图像二维信号)变换到频域,常用的变换一般有DWT、DCT、DFT、WP和分形。
然后,对加入了水印信息的信号进行频域反变换(IDWT、IDCT、DFT、WP),得到含有水印信息的信号。
频域法检测水印的原理是将原始信号与待检测信号同时进行变换域变换,比较两者的区别,进行嵌入水印的逆运算,得出水印信息。
如果是可读的水印,那么就此结束,如果是不可读水印,如高斯噪声,就将得出的水印与已知水印作比较,由相关性判断,待检测信号含不含水印,故水印的检测有两个结束点。
2.3数字水印技术的常用算法数字水印算法一般可分为两种空域法和频域法,频域法有以下优点:1)嵌入的水印信号能量可以分布到空域的所有像素上,有利于保证水印的不可见性;2)视觉系统(HVS)的某些特性(如频率的掩蔽特性)可以更方便地结合到水印编码过程中;3)频域法可与国际数据压缩标准兼容,从而实现在压缩域(compressed domain)内的水印编码。
所以我们也以频域法为主介绍MATLAB在数字水印技术中的使用。
DCT法(Discreste CosineλTransformation)对原始信号做DCT的算法:Cox和Piva等人提出的DCT技术的经典之作。
Cox利用随机数发生器产生标准正态序列作为水印信息对图像进行整体DCT变换后,选取除去DC系数之外部分较低频率系数叠加水印信息;Piva则修改整幅图像的中频部分。
对原始信号分块后,再作DCT的算法:Hsu和Wu把图像进行8*8分块,将一个二进制序列作为水印放入DCT的中频区;有些学者则计算整个图像的DCT,把一个实数序列嵌入DCT的中频系数上。
选择中频区的好处是一方面尽量减少嵌入信息对图像主观视觉的影响;同时,尽量避免有损压缩对水印信息可能带来的损失。
还有一种DCT方法就是把水印信息嵌入到高频系数上,但是采用这种方法,抗压缩性非常差。
DFT法(DiscreteλFourier Transformation)Swanson等利用时域小波变换和频率掩蔽特性结合,实现多分辨率视频水印;Kundur和Hatzinakos把水印植入灰度图像的小波变换域。
其它变换域还有Fourier-mellin域、Fourier变换域、分形或WP(WaveletλPacka ge)等。
以上的变换域算法计算量都非常大,编程实现这些变换和逆变换也需要好好下一番功夫,由此造成研究人员把大量的时间和精力浪费在与水印算法研究无关的问题上。
3可实现数字水印技术的高效实用工具——Matlab3.1Matlab简介Matlab是当前在国内外十分流行的工程设计和系统仿真软件包。
它是MathWorks公司于1982年推出的一套高性能的数值计算和可视化软件,它集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一人方便的、界面友好的用户环境。
Matlab的推出得到了各个领域专家、学者的广泛关注,其强大的扩展功能为各个领域的应用提供了基础。
由各个专家学者相继推出了MATLAB工具箱,其中的信号处理(signal pro cessing)、控制系统(control system)、神经网络(neural network)、图像处理(image processing)、鲁棒控制(robust control)、非线性系统控制设计(nonlinear system co ntrol design)、系统辨识(system identification)、最优化(optimization)、模糊逻辑(f uzzy logic)、小波(wavelet)、通信(communication)、统计(statistics)等工具箱,这些工具箱给各个领域的研究和工程应用提供了有力的工具,借助于这些“巨人肩上的工具”,各个层次的研究人员可直观、方便地进行分析、计算及设计工作,从而大大地节省了时间。
3.2用Matlab研究数字水印的优点集成了DCT、DWT等函数有丰富的小波函数和处理函数,这不仅方便了研究人员,而且使源程序简洁明了、易实现。
λ强大的数学运算功能。
能够方便、高效地实现音频、视频中的大量矩阵运算。
λ提供了图像处理工具箱、小波分析工具箱、数字信号处理工具箱。
用来编制跨数字图像处理技术、数字信号处理等多学科的数字水印技术是非常好的选择。
λMATLAB与目前最强大的编程工具——VisualλC++具有良好的接口。
3.3Matlab函数介绍(以MATLAB5.3为例)在介绍函数之前,我们必须明确一点:作水印程序时,处理的图像数据是二维信号,而声音信号是一维信号。
这里,我们仅仅简单介绍与水印有关的函数,具体函数的用法请读者参考文献[2]。
数据输入输出函数λimread()和imwrite():可以读写bmp,jpg/jpeg,tif/tiff,png,hdf,pcx,wxd格式文件。
读索引文件时,还可以得到相应的调色板数据。
auread()、auwrite()、wavread()和wavwrite():可以方便地读写au和wa v文件,并可控制其中的位及频率。
图像显示与声音播放λimshow():显示一幅图像;imfinfo():可以得到读入图像的信息。
如文件的大小、格式、格式版本号、图像的高度、宽度、颜色类型(真彩色,灰度图还是索引图)等wavplay():播放wav声音文件。
当然,也可以把处理后的wav文件保存后再用其它工具播放。
wavrecord():可以对处理后的wav文件进行录音。
变换频函数λ对信号采用不同的变换,是实现频域法水印的至关重要的一步,MATLAB中对一维信号和二维信号分别提供了各种变换和逆变换函数。
离散余弦变换(DCT)λdct(),dct2():分别实现一维信号和二维信号的DCT(离散余弦变换);idct(),idct2():分别实现一维信号和二维信号的IDCT(逆向离散余弦变换);离散傅里叶变换(DFT)λfft(),fft2():分别实现一维信号和二维信号的DFT(离散傅里叶变换);ifft(),ifft2():分别实现一维信号和二维信号的IDFT(逆向离散傅里叶变换);离散小波变换(DWT)λdwt(),dwt2():分别实现一维信号和二维信号的DWT(离散小波变换);idwt(),idwt2():分别实现一维信号和二维信号的IDWT(离散小波变换);Wavedec2():多级二维小波分解函数;Waveinfo():提供小波包中所有的小波信息;另外,MATLAB中还有丰富的小波包处理函数,有兴趣的读者可参考文献[2]。
攻击函数λ对算法进行攻击测试是对水印鲁棒性检测的一种重要手段,一个好的水印算法必须经过各种攻击测试才能对之做出客观的评价。
MATLAB中的许多函数可以直接用来做的攻击测试。
旋转:rotate()可以对图像进行任意角度的旋转;剪裁:imcrop()可以按精确定位的各点坐标进行剪裁;滤波:filter()和filter2()可实现对一维信号和二维信号的滤波;抖动:dither()对图像进行抖动;抖动攻击考验水印鲁棒性的一个很好的攻击;jpeg压缩:imwrite()中jpg和quality参数能对图像进行可控jpg压缩;加各种噪声:imnoise()可以对图像加入各种噪声,如白噪声、椒盐噪声等,加入噪声是对水印鲁棒性考验的一种常见的攻击;放大/缩小:imresize()可以以指定的插值方法来对图像进行放大和缩小。
3.4一个用MATLAB编写的数字水印算法实例为证明MATLAB的高效性与实现简便性,我们以文献[1]的算法为例,给出在Windows98环境下MATLAB5.3中调试通过的完整源程序。
嵌入水印λ%定义常量size=256;block=8;blockno=size/block;LENGTH=size*size/64;Alpha1=0.02;Alpha2=0.1;T1=3;I=zeros(size,size);D=zeros(size,size);B W=zeros(size,size);block_dct1=zeros(block,block);%产生高斯水印,并显示水印信息;randn('seed',10);mark=randn(1,LENGTH);subplot(2,2,1);plot(mark);title('watermarc:Gaussian noise');%显示原图subplot(2,2,2);I=imread('lena264_264','bmp');imshow(I);title('origine image:I');%显示prewitt为算子的边缘图BW=edge(I,'prewitt');subplot(2,2,3);imshow(BW);title('edge of origine image');%嵌入水印k=1;for m=1:blocknofor n=1:blocknox=(m-1)*block+1;y=(n-1)*block+1;block_dct1=I(x:x+block-1,y:y+block-1);block_dct1=dct2(block_dct1);BW_8_8=BW(x:x+block-1,y:y+block-1);if m<=1|n<=1T=0;elseT=sum(BW_8_8);T=sum(T);endif T>T1Alpha=Alpha2elseAlpha=Alpha1;endblock_dct1(1,1)=block_dct1(1,1)*(1+Alpha*mark(k));block_dct1=idct2(b lock_dct1);D(x:x+block-1,y:y+block-1)=block_dct1;k=k+1;endend%显示嵌入水印后的图像subplot(2,2,4);imshow(D,[]);title('embeded image:D');由些可以看到用MATLAB的编写一个完整的水印嵌入算法只需几十条语句便可以完成,而这些程序如果用C语言或其它高级语言编写程序至少在100行以上。