数字水印技术LSB算法MATLAB源代码

合集下载

基于-小波-变换的数字水印-matlab的-实现

基于-小波-变换的数字水印-matlab的-实现

基于小波变换的数字水印与matlab的实现摘要:通过对数字水印的原理和算法的分析,了解信息隐藏的实现手段与效果。

在信息加载和提取过程中,突破传统的加密技术,用更具专业性的检测手段来保护专属的信息产权。

本文利用了水印良好的鲁棒性和不可感知性,致力于对图像的处理,通过实验与测试证实了数字水印可以达到理想的效果,并且运用恰当的算法可以更加简化操作的复杂性。

在此之外,数字水印还可以应用于声音,视频等领域。

其技术手段的实现的更加完善化会带来其更加广阔的应用前景。

关键字:数字水印;信息隐藏;MATLAB;水印检测与提取;JPEG压缩;1 数字水印技术简介1.1数字水印的发展背景随着数字技术和Internet网络的发展,各种形式的多媒体数字作品(图像、视频、音频等)纷纷以网络形式发表,然而数字作品的便利性和不安全性是并存的,它可以低成本、高速度地被复制和传播,而这些特性也容易被盗版者所利用。

因而,采用多种手段对数字作品进行保护、对侵权者进行惩罚己经成为十分迫切的工作。

数字水印技术的研究就是在这种应用要求下迅速发展起来的。

数字水印(digital watermarking)技术也称为数字指纹技术,它将具有特定意义的水印标记不可感知地嵌入到被保护的数字产品中,在产生版权纠纷时,通过相应的算法提取该水印,用以证明作者对该数字产品的所有权,并可作为鉴证、起诉非法侵权的证据。

数字水印技术基本上应当满足隐蔽性、安全性、鲁棒性和水印容量等几个方面的要求。

研究数字水印技术的最初目的是用于保护数字产品的版权,但随着研究的进一步深入,它在信息安全保护领域的应用越来越广泛,并在广播检测、图像认证、盗版跟踪、数字签名、交易水印、拷贝控制、标题与注释等各个领域产生了许多新的用途。

数字水印从正式提出到现在虽然时间不长,但它与传统的密码学相比有明显的优越性,为解决版权保护和内容完整性认证、来源认证、篡改认证、网上发行、用户跟踪等一系列问题提供了一个崭新的研究方向,因此它在数字产品的知识产权保护、商务交易中的票据防伪、声像数据的隐藏标识和篡改提示、隐蔽通信及其对抗等方面具有十分广阔的应用前景。

基于LSB的数字水印算法及MATLAB实现

基于LSB的数字水印算法及MATLAB实现

基于LSB的数字水印算法及MATLAB实现
黄仿元
【期刊名称】《现代机械》
【年(卷),期】2008(000)002
【摘要】数字水印技术是近些年提出的一种信息隐藏技术,该技术为多媒体信息的版权保护提供了一种新的方法.本文首先介绍了数字水印技术的原理、特点及分类,然后讨论了基于LSB的数字水印算法,最后利用MATLAB7.0对这一算法进行了仿真.
【总页数】3页(P67-69)
【作者】黄仿元
【作者单位】贵州大学,职业技术学院,贵州,贵阳,550003
【正文语种】中文
【中图分类】TP3
【相关文献】
1.一种基于Wavelet-SVD数字水印算法的MATLAB实现 [J], 马婷
2.基于DCT数字水印算法的Matlab实现 [J], 任晓扬;韩勇
3.基于图像预处理的DCT数字水印算法及其MATLAB实现 [J], 冯战申;贺勤;臧振戎
4.基于LSB数字水印算法的研究与实现 [J], 王东东;王福明
5.基于DCT域的图像数字水印算法及matlab实现 [J], 吴和静;闵昆龙;刘芳;刘兴鹏
因版权原因,仅展示原文概要,查看原文内容请购买。

基于Matlab的数字水印设计——基于空域的水印实现

基于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作为一种强大的数学计算软件,具有丰富的数字信号处理和图像处理工具包,能够很好地支持数字水印的嵌入和提取。

本文将介绍如何使用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数字水印算法及实现和源代码

matlab数字水印算法及实现和源代码

1.数字作品的知识产权保护----数字作品(如电脑美术、扫描图像、数字音乐、视频、三维动画)的版权保护是当前的热点问题。

由于数字作品的拷贝、修改非常容易,而且可以做到与原作完全相同,所以原创者不得不采用一些严重损害作品质量的办法来加上版权标志,而这种明显可见的标志很容易被篡改。

----“数字水印”利用数据隐藏原理使版权标志不可见或不可听,既不损害原作品,又达到了版权保护的目的。

目前,用于版权保护的数字水印技术已经进入了初步实用化阶段,IBM公司在其“数字图书馆”软件中就提供了数字水印功能,Adobe公司也在其著名的Photoshop软件中集成了Digimarc公司的数字水印插件。

然而实事求是地说,目前市场上的数字水印产品在技术上还不成熟,很容易被破坏或破解,距离真正的实用还有很长的路要走。

2.商务交易中的票据防伪----随着高质量图像输入输出设备的发展,特别是精度超过 1200dpi 的彩色喷墨、激光打印机和高精度彩色复印机的出现,使得货币、支票以及其他票据的伪造变得更加容易。

----另一方面,在从传统商务向电子商务转化的过程中,会出现大量过度性的电子文件,如各种纸质票据的扫描图像等。

即使在网络安全技术成熟以后,各种电子票据也还需要一些非密码的认证方式。

数字水印技术可以为各种票据提供不可见的认证标志,从而大大增加了伪造的难度。

3.证件真伪鉴别----信息隐藏技术可以应用的范围很广,作为证件来讲,每个人需要不只一个证件,证明个人身份的有:身份证、护照、驾驶证、出入证等;证明某种能力的有:各种学历证书、资格证书等。

国内目前在证件防伪领域面临巨大的商机,由于缺少有效的措施,使得“造假”、“买假”、“用假”成风,已经严重地干扰了正常的经济秩序,对国家的形像也有不良影响。

通过水印技术可以确认该证件的真伪,使得该证件无法仿制和复制。

4.声像数据的隐藏标识和篡改提示----数据的标识信息往往比数据本身更具有保密价值,如遥感图像的拍摄日期、经/纬度等。

数字音频水印MATLAB程序

数字音频水印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]);&nbsp;低通滤波%%%%%%%%%%%%%%%%%%%%%%%%%%%[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实现

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的数字水印设计基于空域的水印实现

基于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两大部分。

(完整word版)数字水印源码

(完整word版)数字水印源码

数字水印源码,希望对大家学习有帮助.%由高斯正态分布序列g1 产生36×4 的水印信%号w0,w0 由(0,1)组成。

clearrandn(’state’,1106);g1=randn(36,4);for i=1:36for j=1:4if g1(i,j)〉=0w0(i,j)=1;else w0(i,j)=0;end;end;end;figure;imshow(w0);title('水印');%对水印信号w0 进行(7,4)汉明编码,得到一%36×7 的分组码x0。

x0=w0;for i=1:36s=8*x0(i,1)+4*x0(i,2)+2*x0(i,3)+x0(i,4);x0(i,5)=0;x0(i,6)=0;x0(i,7)=0;case 1x0(i,5)=0;x0(i,6)=1;x0(i,7)=1; case 2x0(i,5)=1;x0(i,6)=1;x0(i,7)=0; case 3x0(i,5)=1;x0(i,6)=0;x0(i,7)=1; case 4x0(i,5)=1;x0(i,6)=1;x0(i,7)=1; case 5x0(i,5)=1;x0(i,6)=0;x0(i,7)=0;case 6x0(i,5)=0;x0(i,6)=0;x0(i,7)=1;case 7x0(i,5)=0;x0(i,6)=1;x0(i,7)=0;case 8x0(i,5)=1;x0(i,6)=0;x0(i,7)=1;case 9x0(i,5)=1;x0(i,6)=1;x0(i,7)=0;case 10x0(i,5)=0;x0(i,6)=1;x0(i,7)=1;case 11x0(i,5)=0;x0(i,6)=1;x0(i,7)=0;case 13x0(i,5)=0;x0(i,6)=0;x0(i,7)=1;case 14x0(i,5)=1;x0(i,6)=0;x0(i,7)=0;case 15x0(i,5)=1;x0(i,6)=1;x0(i,7)=1;end;end;% 对x0 进行行向位扩展,得到一个由(—1,1)组成%的扩展序列y。

基于LSB的数字水印算法及MATLAB实现

基于LSB的数字水印算法及MATLAB实现

基于LSB 的数字水印算法及MATLAB 实现加密算法宗岳,王恺山东科技大学 山东,中国 ***************摘要—LSB 是一种简单传统的信息隐藏算法,属于数字水印技术中的一种。

本文首先介绍了LSB 技术的原理和特点,然后讨论了基于LSB 的数字水印算法。

最后利用MATLAB 2010 b2对这一算法的加密过程进行了仿真。

关键词:LSB 数字水印 信息隐藏 MATLABI. 介绍随着计算机应用逐渐广泛、网络技术的迅速发展,使音频、视频等多媒体信息都能以数字形式传输和播放,从而使大规模非授权拷贝成为了可能,而这样会损害音乐、电影、书籍和软件等出版业的发展,为了保护知识产权引发了一个很有意义的研究方向:信息隐藏。

本文首先介绍了了数字水印技术的原理和分类,接着对LSB 算法原理及LSB 算法实现进行了介绍,最后使用MATLAB 对其加密过程进行了仿真。

II. 数字水印技术的基本原理数字水印的主要 目的是将特定的信息加入到需要保护的媒体信息中,加入的信息一般是能够代表媒体信息版权的内容,如公司标志、媒体作者、特定代码等,而且要保证数字水印能够抵抗一定的攻击,而不被轻易的破坏和修改,同时数字水印要能够被提取或者能够被检测到。

数字水印的具体内容、算法、提取或检测过程根据实际应用有不同的要求。

数字水印的嵌入和提取过程如图1,图2所示。

图1 数 字水印的嵌入过程图2 数字水印的提取过程图1是数字水印的嵌入过程,加入密钥可以提高数字水印的隐蔽性、抗攻击性,而并非是必须的。

根据用途不同,,嵌入的水印有些是需要还原的,而有些则只需验证水印的存在性,前者需要数字水印的提取算法,而图2需要数字水印的检测算法,根据具体的水印算法,嵌入或提取的过程可能有所不同。

III. 数字水印的分类数字水印技术可以从不同的角度进行分类,因此有多种分类方法。

按数字水印的特性可分为鲁捧数字水印和脆弱数字水印。

鲁棒数字水印主要用于标识数字媒体信息的版权信息,它要求嵌入的水印能够抵抗对媒体的常规编辑和恶意攻击,在对媒体进行如:裁剪、旋转、缩放、压缩的变换后水印信息不受到较大损害。

LSB算法的MATLAB实现

LSB算法的MATLAB实现

LSB算法的MATLAB实现LSB(Least Significant Bit)算法是一种隐写术,用于在图像或音频中隐藏秘密信息。

在这种方法中,最不显著的比特位被用来存储隐藏的数据,这样可以尽量不对原始图像或音频造成明显的变化。

下面是MATLAB中实现LSB算法的步骤:1. 读入原始图像:使用`imread`函数将图像读入到MATLAB中。

例如,`image = imread('original_image.png');`2. 将图像转换为灰度图像:如果原始图像是彩色图像,则需要将其转换为灰度图像。

可以使用`rgb2gray`函数实现。

例如,`gray_image = rgb2gray(image);`3.将隐藏信息转换为二进制:将要隐藏的信息转换为二进制,并将其存储为一个向量或字符串。

4.检查隐藏信息长度:检查隐藏信息的长度是否小于图像中可用的像素数量。

如果隐藏信息过长,可能无法完全嵌入到图像中。

如果需要,可以考虑压缩或加密隐藏信息。

5.将隐藏信息嵌入到图像中:对于每个像素,在最不显著的比特位中存储隐藏信息。

可以使用位操作和移位操作来实现。

例如,如果要将隐藏信息的第一个比特位嵌入到像素的最不显著比特位上,可以使用以下代码:```matlabbit = 1; % 要嵌入的隐藏信息比特pixel = 100; % 图像中的一个像素值new_pixel = bitset(pixel, 1, bit); % 将bit设置为pixel的第一个比特位```6.将修改后的像素重新组装为图像:重复上述步骤,对每个像素进行处理,然后将修改后的像素重新组装为一个新的图像。

7. 保存隐藏信息的图像:使用`imwrite`函数将隐藏信息的图像保存到硬盘上。

例如,`imwrite(new_image, 'hidden_image.png');`8.提取隐藏信息:如果需要,可以使用类似的方法从隐藏信息的图像中提取出隐藏的信息。

图像数字水印Matlab源代码

图像数字水印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。

基于LSB的图像数字水印实验

基于LSB的图像数字水印实验

基于LSB的图像数字⽔印实验1. 实验类别设计型实验:MATLAB设计并实现基于LSB的图像数字⽔印算法。

2. 实验⽬的了解信息隐藏中最常⽤的LSB算法的特点,掌握LSB算法原理,设计并实现⼀种基于图像的LSB隐藏算法。

条件实验条件3. 实验(1) Windows 2000或Windows Xp以上操作系统;(2) MATLAB 6.5以上版本软件;(3)图像⽂件4. 实验原理基于LSB的图像数字⽔印任何多媒体信息在数字化时都会产⽣物理随机噪声,⽽⼈的感官系统对这些随机噪声并不敏感。

替换技术就是利⽤这个原理,通过使⽤秘密信息⽐特替换随机噪声,从⽽实现信息隐藏⽬的。

图像⾼位平⾯对图像感官质量起主要作⽤,去除图像最低⼏个位平⾯并不会造成画⾯质量的下降。

利⽤这个原理可⽤秘密信息(或称⽔印信息)替代载体图像低位平⾯以实现信息嵌⼊。

LSB算法选⽤最低位平⾯来嵌⼊秘密信息,最低位平⾯对图像的视觉效果影响最轻微,但很容易受噪声影响和攻击,可采⽤冗余嵌⼊的⽅式来增强稳健性加以解决,即在⼀个区域中嵌⼊相同的信息,提取时根据该区域中的所有像素判断。

1.嵌⼊⽔印.m脚本代码:clear all;clc;picpath = input('请输⼊图⽚绝对路径(加单引号):');watermark_path = input('请输⼊⽔印⽂件绝对路径(加单引号):');msgfid = fopen(watermark_path,'r'); % 打开秘密⽂件,读⼊秘密信息[key,count] = fread(msgfid,'ubit1'); % 读取秘密信息,存⼊key,count为成功读⼊了多少位fclose(msgfid); % 关闭⽂件i = imread(picpath);i1 = i(:,:,1); % 提取RGB第1层嵌⼊⽔印[row,col] = size(i1); % x⾏y列contents = row * col; % 图像能嵌⼊⽔印最⼤⽐特数if count > contentsdisp('warning: 当前图⽚容量⽆法通过LSB⽅法嵌⼊所有⽔印信息!按enter退出matlab.');pause;quit;elsedisp(['当前图⽚通过LSB能嵌⼊的最⼤⽔印⽐特数为: ',num2str(contents),' bits']);endkey_counter = 1;round_counter = 0;total_watermark_bits = 0;if mod(count,row) == 0round = floor(count/row);elseround = floor(count/row) + 1;endfor ii=1:1:roundfor jj = 1:1:rowi1(jj,ii) = bitset(i1(jj,ii),1,key(key_counter,1));% bitset函数改变像素值最后⼀位bit为⽔印bit值key_counter = key_counter + 1;total_watermark_bits = total_watermark_bits + 1;if key_counter > countbreak;endend %内层forround_counter = round_counter + 1;disp(['当前嵌⼊轮数: ',num2str(round_counter)]);if key_counter > countdisp(['LSB嵌⼊正常结束!共嵌⼊⽔印⽐特数: ',num2str(total_watermark_bits),' bits']);break;endend %外层fori(:,:,1) = i1;imwrite(i,'E:\new\LSB_watermarked.bmp');figure;subplot(1,2,1);imshow(picpath);title('原始图像');subplot(1,2,2);imshow(i);title('LSB嵌⼊⽔印后的图像');运⾏截图:2.提取⽔印.m脚本代码:clear all;clc;picpath = input('请输⼊待提取LSB⽔印图⽚绝对路径(加单引号):');watermark_bits = input('请输⼊提取的⽔印⽐特数:');i = imread(picpath); % 读取含有⽔印信息的彩⾊图像i1 = i(:,:,1);key = zeros(watermark_bits,1); % 创建⼀个watermark_bits⾏1列的全0矩阵,⽤于存放⽔印⽐特[row,col] = size(i1);key_counter = 1;round = 0;round_counter = 0;total_watermark_bits = 0;if mod(watermark_bits,row) == 0round = floor(watermark_bits/row);elseround = floor(watermark_bits/row) + 1;endfor ii = 1:1:roundfor jj = 1:1:rowkey(key_counter,1) = bitget(i1(jj,ii),1); % 提取图像矩阵的bit⽔印信息key_counter = key_counter + 1;total_watermark_bits = total_watermark_bits + 1;if key_counter > watermark_bitsbreak;endend %内层forround_counter = round_counter + 1;disp(['当前提取轮数: ',num2str(round_counter)]);if key_counter > watermark_bitsdisp(['LSB⽔印提取正常结束!共提取⽔印⽐特数:',num2str(total_watermark_bits),' bits']);break;endend %外层forfobject = fopen('E:\new\LSB_watermark.txt','w'); % 以只写模式打开⼀个名为mark_message.txt的⽂件,不存在则创建之fwrite(fobject,key,'bit1'); % 将key矩阵中的数作为bit写⼊⽂件句柄为fobject的⽂件fclose(fobject); % 关闭⽂件句柄所对应的⽂件运⾏后hidden.txt与LSB_watermark.txt⽂件⽔印内容LSB⽔印实验的要点1.该实验选取的是彩⾊RGB图像,是3维图像,因此要选RGB中的某⼀层进⾏⽔印嵌⼊,可以选第1,2或3层,分别对于R,G,B层,本实验选择R层及第⼀层i1 = i(:,:,1)2.还应对图像所能容纳⽔印⽐特最⼤数进⾏检查,以防⽔印信息太多导致嵌⼊失败.3.嵌⼊完成后,要将选取的RGB层赋给原3维矩阵对应层i(:,:,1) = i14.代码注意if及for与end配对,⼀个if或for配⼀个end上述脚本在matlab6.5能正确运⾏.。

小波变换的数字水印算法及其matlab实现

小波变换的数字水印算法及其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.数字水印技术是一种在数字媒体中隐藏信息的技术,旨在保护作品的版权、完整性、认证及追踪,同时又不会对原始媒体造成太大的修改,因此在当前的数字化信息传输和存储领域具有广泛的应用。

LSB算法的matlab实现

LSB算法的matlab实现

一实验目的1、了解隐显密码学相关的密码算法;2、熟悉不同“位平面"对图像质量的影响;3、掌握基于图像的LSB信息隐藏算法;4、用MATLAB函数实现LSB信息隐藏;5、掌握LSB信息提取算法。

二实验条件1、熟练使用matlab2、掌握LSB算法知识,了解其原理3、安装了matlab的计算机三实验原理1、BMP位图格式BMP文件是一种常见格式图形文件,是隐藏信息的一种好载体。

一副位图是由许多像素点组成,每个像素点用若干二进制位来描述其灰度或颜色;而每个像素点的这些二进制的低位对改点灰度或颜色的影响很小,故改变像素点的低位所引起的图像变化人眼不易发觉。

正因如此,可利用这些低位存储秘密信息以实现信息的隐藏。

BMP图像文件格式,是微软公司为其WINDOWS环境设置的标准图像格式,BMP表示的是将一幅图像分割成栅格,栅格的每一点称为像素,每一个像素具有自己的RGB值,即一幅图像是由一系列像素点构成的点阵.位图文件格式支持4b RLE(行程长度编码)以及8b和24b编码。

位图头文件包含位图文件的类型大小信息和版面信息。

位图信息头包含图像本身的属性,包括位图的宽度、高度、压缩类型等。

2、LSB算法原理对空域的LSB做替换,用来替换LSB的序列就是需要加入的水印信息、水印的数字摘要或者由水印生成的伪随机序列。

由于水印信息嵌入的位置是LSB,为了满足水印的不可见性,允许嵌入的水印强度不可能太高。

然而针对空域的各种处理,如游程编码前的预处理,会对不显著分量进行一定的压缩,所以LSB 算法对这些操作很敏感,其最初是用于脆弱性水印的.LSB算法基本步骤:1)将得到的隐藏有秘密信息的十进制像素值转换为二进制数据;2)用二进制秘密信息中的每一比特信息替换与之相对应的载体数据的最低有效位;3)将得到的含秘密信息的二进制数据转换为十进制像素值,从而获得含秘密信息的图像.四、程序设计1、程序开发平台及工具平台:windows xp软件版本:matlab7。

基于MATLAB的数字图像水印算法研究与应用

基于MATLAB的数字图像水印算法研究与应用

基于MATLAB的数字图像水印算法研究与应用数字图像水印技术是一种信息隐藏技术,通过在数字图像中嵌入特定的信息,实现对图像的认证、版权保护、身份验证等功能。

在当今信息爆炸的时代,数字图像水印技术越来越受到人们的关注和重视。

本文将围绕基于MATLAB的数字图像水印算法展开研究与应用探讨。

一、数字图像水印技术概述数字图像水印技术是一种将特定信息嵌入到数字图像中并能够提取出来的技术。

通过在图像中添加水印信息,可以实现对图像的认证、完整性验证、版权保护等功能。

数字图像水印技术主要包括空域水印和频域水印两种类型,其中频域水印技术又包括离散余弦变换(DCT)域水印和小波变换域水印等。

二、MATLAB在数字图像处理中的应用MATLAB是一种强大的科学计算软件,广泛应用于数字图像处理领域。

其丰富的工具箱和便捷的编程环境使得MATLAB成为研究者和工程师首选的工具之一。

在数字图像处理中,MATLAB提供了丰富的函数和工具,可以实现图像的读取、显示、处理、分析等操作,为数字图像水印算法的研究与实现提供了便利。

三、数字图像水印算法原理1. 空域水印算法空域水印算法是将水印信息直接嵌入到原始图像的像素值中。

常见的空域水印算法包括LSB替换算法、LSB匹配算法等。

LSB替换算法是将水印信息嵌入到原始图像的最低有效位中,以保证对原始图像影响最小;LSB匹配算法则是通过调整像素值使得其最低有效位与水印信息相匹配。

2. 频域水印算法频域水印算法是将水印信息嵌入到原始图像的频域表示中,常见的频域水印算法包括DCT域水印和小波变换域水印。

DCT域水印是将水印信息嵌入到原始图像的DCT系数中,利用DCT变换的性质实现对原始图像的保护;小波变换域水印则是将水印信息嵌入到原始图像的小波系数中,具有更好的鲁棒性和安全性。

四、基于MATLAB的数字图像水印算法实现在MATLAB环境下,可以通过编写相应的代码实现数字图像水印算法。

首先需要读取原始图像和水印信息,然后根据所选的算法进行水印嵌入和提取操作。

数字水印matlab程序

数字水印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源代码

数字水印技术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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

close allclear all;% save start timestart_time=cputime;% read in the cover objectfile_name='E:\Phd\My Paper\Second paper -- Experiment\Experiment\Cover and Secret Image\lena.bmp';[cover_object,map]=imread(file_name);% read in the secret imagefile_name='E:\Phd\My Paper\Second paper -- Experiment\Experiment\Cover and Secret Image\hat.bmp';[secret,map1]=imread(file_name);secret1=secret;% convert to double for normalization, then back againsecret=double(secret);secret=fix(secret./2); %rounds the elements of A toward zero, resulting in an array of integers secret=uint8(secret);% determine size of cover objectMc=size(cover_object,1); %HeightNc=size(cover_object,2); %Width% determine size of secret objectMm=size(secret,1); %HeightNm=size(secret,2); %Width% title the secret object out to cover object size to generate 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)==0)watermarked_image(ii,jj)=bitset(watermarked_image(ii,jj),1,0); %Set bit at certain positionelsewatermarked_image(ii,jj)=bitset(watermarked_image(ii,jj),1,1); %Set bit at certain positionendendend% write the watermarked image out to a fileimwrite(watermarked_image,'lsb_watermarked.bmp','bmp');%==================================Extraction=========================== ========================% determine size of watermarked imageMw=size(watermarked_image,1); %HeightNw=size(watermarked_image,2); %Width% use lsb of watermarked image to recover watermarkfor ii = 1:Mwfor jj = 1:NwRecoveryWatermark(ii,jj)=bitget(watermarked_image(ii,jj),1);endend% scale the recovered watermarkRecoveryWatermark=2*double(RecoveryWatermark);%==================================================================== ===============================%===========================SharpAttack================= SharpedWatermarkImage = watermarked_image;H = fspecial('unsharp',0.001); %the alpha from 0.005 to 0.1 20 numbers sharpImage = imfilter(SharpedWatermarkImage,H,'replicate');figure(6);colormap(gray(256));imshow(sharpImage);title('sharp Image');imwrite(sharpImage, gray(256), 'sharpImage.bmp');% determine size of watermarked imageMSw=size(sharpImage,1); %HeightNSw=size(sharpImage,2); %Width% use lsb of watermarked image to recover watermarkfor ii = 1:MSwfor jj = 1:NSwRecoverySharpWatermark(ii,jj)=bitget(abs(sharpImage(ii,jj)),1);endend% scale the recovered watermarkRecoverySharpWatermark=2*double(RecoverySharpWatermark);psnrSharp = psnr(RecoveryWatermark, RecoverySharpWatermark)figure(7);colormap(gray(256));imshow(RecoverySharpWatermark,[])title('RecoverySharpWatermark');%==================================================================== %%%===========================Gaussian Blur================= GaussianBlurWatermarkedImage = watermarked_image;H = fspecial('gaussian',size(GaussianBlurWatermarkedImage),0.035); %the alpha from 0.005 to0.1 20 numbersGaussianBlurImage = imfilter(GaussianBlurWatermarkedImage,H,'replicate');figure(8);colormap(gray(256));imshow(GaussianBlurImage,[])title('Gaussian Blur Image');imwrite(GaussianBlurImage, gray(256), 'GaussianBlurImage.bmp');% determine size of watermarked imageMSw=size(GaussianBlurImage,1); %HeightNSw=size(GaussianBlurImage,2); %Width% use lsb of watermarked image to recover watermarkfor ii = 1:MSwfor jj = 1:NSwRecoveryGaussianBlurWatermark(ii,jj)=bitget(GaussianBlurImage(ii,jj),1);endend% scale the recovered watermarkRecoveryGaussianBlurWatermark=2*double(RecoveryGaussianBlurWatermark);psnrBlur = psnr(RecoveryWatermark, RecoveryGaussianBlurWatermark)figure(9);colormap(gray(256));imshow(RecoveryGaussianBlurWatermark,[])title('RecoveryGaussianWatermark');% %% %===========================================================% %% % %==========================================Histogram=============== ========histogramWatermarkedImage = watermarked_image;histogramImage = histeq(watermarked_image,10); % from 10 to 200figure(10);colormap(gray(256));image(histogramImage);title('histogramImage Image');imwrite(histogramImage, gray(256), 'histogramImage.bmp');MSw=size(histogramImage,1); %HeightNSw=size(histogramImage,2); %Width% use lsb of watermarked image to recover watermarkfor ii = 1:MSwfor jj = 1:NSwRecoveryHistogramWatermarked(ii,jj)=bitget(histogramImage(ii,jj),1);endend% scale the recovered watermarkRecoveryHistogramWatermarked=2*double(RecoveryHistogramWatermarked); psnrHistorgram = psnr(RecoveryWatermark, RecoveryHistogramWatermarked)figure(11);colormap(gray(256));imshow(RecoveryHistogramWatermarked,[])title('RecoveryHistogramWatermarked');%% %================================================================== ========%%% %==========================Noise============================= NoiseWatermarked = watermarked_image;NoiseImage = imnoise(NoiseWatermarked,'gaussian',0.001);figure(12);colormap(gray(256));imshow(NoiseImage);title('noiseImage');imwrite(NoiseImage, gray(256), 'noiseImage.bmp');MSw=size(NoiseImage,1); %HeightNSw=size(NoiseImage,2); %Width% use lsb of watermarked image to recover watermarkfor ii = 1:MSwfor jj = 1:NSwRecoveryNoiseWatermarked(ii,jj)=bitget(NoiseImage(ii,jj),1);endend% scale the recovered watermarkRecoveryNoiseWatermarked=2*double(RecoveryNoiseWatermarked);psnrNoise = psnr(RecoveryWatermark, RecoveryNoiseWatermarked)figure(13);colormap(gray(256));imshow(RecoveryNoiseWatermarked,[])title('RecoveryNoiseWatermarked');%%=================================================================== ==% display processing timeelapsed_time=cputime-start_time,。

相关文档
最新文档