数字水印课程设计(DCT+DWT算法比较)

poeme_1990 贡献于2014-01-05

作者 Administrator  创建于2012-06-28 02:30:00   修改者Administrator  修改于2012-07-03 05:42:00字数35655

文档摘要:  一个有效的数字水印系统至少具备以下三个最基本的特性:、安全性、隐蔽性、鲁棒性。本文的数字水印技术的基本原理,介绍了离散余弦变换(DCT)和离散小波变换(DWT)水印算法,并通过攻击实验,对DWT和DCT水印技术的鲁棒性进行了比较分析,阐述了两种MATLAB数字水印算法的优缺点,实验结果表明两种算法具有较好的性能,实现的水印具有不可见性,而且具有较好的鲁棒性。但分别在不同方面各有优势。
关键词:

 武汉理工大学《信息处理课群综合训练与设计》 目录 摘要 2 Abstract 3 1 方案论证与比较 4 2 数字水印的相关理论 5 2.1 数字水印基本原理 5 2.2 数字水印算法 6 2.3 数字水印的鲁棒性问题和攻击行为 7 3 基于变换域图像水印 9 3.1 DCT域数字图像水印 9 3.1.1 DCT变换原理 9 3.1.2 DCT水印嵌入算法 10 3.1.3 DCT水印提取算法 11 3.1.4 算法流程图 12 3.2 基于DWT域图像水印 12 3.2.1 DWT变换原理 12 3.2.2 DWT水印嵌入算法 14 3.2.3 DWT水印提取算法 16 3.2.4 算法流程图 17 4 Matlab函数介绍 18 4.1 图像显示 18 4.2 变换频函数 18 4.3 攻击函数 18 4.4 图像文件输入输出函数 19 4.5 图像颜色及类型转换函数 19 5 Matlab运行结果比较 20 5.1 DCT水印嵌入运行结果 20 5.1.1 水印嵌入与提取 20 5.1.2 水印鲁棒性检测 22 5.2 DWT水印嵌入运行结果 26 5.2.1 水印嵌入与提取 26 5.2.2 水印鲁棒性检测 28 5.3 实验结果总结分析 32 6 实验心得体会 34 7 参考文献 35 附录 36 武汉理工大学《信息处理课群综合训练与设计》 摘要 数字水印技术近年来得到了较大的发展,基于变换域的水印技术是目前研究的热点。数字水印技术是一种将特定的标记,利用数字内嵌方法隐藏在数字图像、声音、视频等数字内容中,在保证不影响原内容的感知质量和完整性的同时提供一种确认数字内容来源真实性、确保版权拥有者权益、跟踪版权行为、认证用户使用权、隐藏附加其他信息于数字内容中的技术手段。 一个有效的数字水印系统至少具备以下三个最基本的特性:、安全性、隐蔽性、鲁棒性。本文的数字水印技术的基本原理,介绍了离散余弦变换(DCT)和离散小波变换(DWT)水印算法,并通过攻击实验,对DWT和DCT水印技术的鲁棒性进行了比较分析,阐述了两种MATLAB数字水印算法的优缺点,实验结果表明两种算法具有较好的性能,实现的水印具有不可见性,而且具有较好的鲁棒性。但分别在不同方面各有优势。 关键词:数字水印;DCT变换;DWT变换 武汉理工大学《信息处理课群综合训练与设计》 Abstract Digital watermarking technology in recent years the development of large, based on the transform domain watermark technology is currently research hot spot. Digital watermarking technology is a kind of specific markers will, using a digital embedded method in the digital images, sounds, hidden, video and digital content, avoiding no impact on the original content in the perception of the quality and integrity of also provides a digital content sources confirm the authenticity, ensure the copyright owners equity, tracking the Copyright Act, the authentication user use any additional information, hidden in the digital content of technical means. A valid digital watermarking system at least have the following three of the most basic characteristics:, safety, concealment and robustness. In this paper the basic principle of digital watermarking technology, introduces the discrete cosine transform (DCT) and discrete wavelet transform (DWT) the watermark algorithm, and through the attack experiments, the DWT and DCT watermarking technology robustness makes a comparative analysis, this paper expounds the two kinds of MATLAB and the advantages and disadvantages of the digital watermarking algorithm, experimental results show that the two algorithm has better performance, and realize the watermark is not visible, and has good robustness. But in different aspects respectively each have an advantage. Key words: Digital watermarking; DCT transform; DWT transform 武汉理工大学《信息处理课群综合训练与设计》 1 方案论证与比较 近几年来数字水印技术研究取得了很大的进步,见诸于文献的水印算法很多,这里对一些典型的算法进行了分析。 1、空间域算法 时(空)域数字水印是直接在信号空间上叠加水印信息,具有较大的信息嵌入量,但鲁棒性较弱, 数字水印直接加载在原始数据上,有最低有效位方法(LSB),Patchwork方法及纹理块映射编码方法等 空间算法的特点是:算法简单,实用性较强;嵌入的信息量不能太多;鲁棒性差,尤其对于滤波,量化和压缩攻击。 2、变换域算法 基于变换域的技术可以嵌入大量比特数据而不会导致可察觉的缺陷,往往采用类似扩频图像的技术来隐藏数字水印信息。这类技术一般基于常用的图像变换,基于局部或是全部的变换,这些变换包括离散余弦变换(DCT)、小波变换(WT)、傅氏变换(FT或FFT)以及哈达马变换(Hadamardtransform)等等。其特点是物理意义明确;可以充分利用人类的感知特性;不可见性和鲁棒性好;与压缩算法兼容。 3、其他一些水印算法 近年来利用混沌映射模型实现数字水印、保密通信等成为混沌应用研究的热点。特别是自从Cox等借用通信技术中的扩频原理将水印信号嵌入到一些DCT变换系数或者多层分解的小波变换系数以来,人们已经提出了一些混沌数字水印方法。水印的嵌入与检测是基于人类视觉系统(HVS)的亮度掩蔽特性和纹理掩蔽特性,折衷水印的不可见性和鲁棒性之间的矛盾.结果表明:该方法嵌入的水印具有不可见性和鲁棒性,并且这种基于密钥的混沌水印方法更好的抗破译性能。 方案分析:时空域算法不可见性太差,且鲁棒性差,因此选择频域算法。目前比较流行的是基于盲水印检测的DCT和DWT算法,这两种算法较易实现,且不可见性也很好,但是各有优缺点,本文将这两种算法实现并进行比较,以便对数字水印技术有更深刻的理解。 武汉理工大学《信息处理课群综合训练与设计》 2 数字水印的相关理论 2.1 数字水印基本原理 以下几个引起普遍关注的问题构成了数字水印的研究背景。 (1)数字作品的知识产权保护 (2)商务交易中的票据防伪 (3)证件真伪鉴别 (4)声像数据的隐藏标识和篡改提示 (5)隐蔽通信及其对抗 数字水印的基本特性要求如下: (1)安全性:数字水印的信息应是安全的,难以篡改或伪造,同时,应当有较低的误检测率,当原内容发生变化时,数字水印应当发生变化,从而可以检测原始数据的变更;当然数字水印同样对重复添加有有强的抵抗性。 (2)隐蔽性:数字水印应是不可知觉的,而且应不影响被保护数据的正常使用,不会降质。 (3)鲁棒性:是指在经历多种无意或有意的信号处理过程后,数字水印仍能保持部分完整性并能被准确鉴别。可能的信号处理过程包括信道噪声、滤波、数/模与模/数转换、重采样、剪切、位移、尺度变化以及有损压缩编码等。主要用于版权保护的数字水印属于鲁棒性数字水印(Robust Watermarking),而易损水印(Fragile Watermarking),主要用于完整性保护,这种水印同样是在内容数据中嵌入不可见的信息。当内容发生改变时,这些水印信息会发生相应的改变,从而可以鉴定原始数据是否被篡改。 数字水印系统的基本框架如图2.1所示。 武汉理工大学《信息处理课群综合训练与设计》 图2.1 数字水印的基本框架 这里的原始媒体信息S,一般是音频,视频,图像等媒体信息;水印信息M可以是二进制的一维序列,实值序列,音频信号,图像(二值图像,灰度图像,彩色图像)等;附加信息是密钥或是与原始信息有关的信息(也可以是原始媒体信息)。数字水印主要利用人类的感知系统的冗余特性,通过修改原始媒体信息数据来嵌入水印信息;加入水印后的媒体信息通过两系统个独立的接受渠道:1、人类的感知系统(眼睛,耳朵等);2、水印检测器来提取水印信息。 从以上可看出,数字水印系统中心算法主要由水印嵌入算法和水印检测算法组成。 2.2 数字水印算法 为了保证由于水印的嵌入而导致宿主数据失真不被察觉到,必须应用某种感知准则,不管是隐性还是显形。水印算法要结合加密方法以提供其安全性,通过的水印算法包含两个基本方面:水印的嵌入和水印的提取。水印可以由多种模型构成,如随机数字序列、数字标识、文本以及图像等。 数字水印的嵌入过程如图2.2所示: 水印信号 原始信号 嵌入过程 含水印的信号 图2.2 数字水印嵌入过程 武汉理工大学《信息处理课群综合训练与设计》 频域法加入数字水印的原理是首先将原始信号(语音一维信号、图像二维信号)变换到频域,常用的变换一般有DWT、DCT、DFT、WP和分形。然后,对加入了水印信息的信号进行频域反变换(IDWT、IDCT、DFT、WP),得到含有水印信息的信号。 数字水印的检测过程如图2.3所示. 原始的信号 带检测的信号 抽取/检测过程 抽取的水印 水印信息 有/无水印 结束 结束 图2.3 数字水印的检测过程 频域法检测水印的原理是将原始信号与待检测信号同时进行变换域变换,比较两者的区别,进行嵌入水印的逆运算,得出水印信息。如果是可读的水印,那么就此结束,如果是不可读水印,如高斯噪声,就将得出的水印与已知水印作比较,由相关性判断,待检测信号含不含水印,故水印的检测有两个结束点。 2.3 数字水印的鲁棒性问题和攻击行为 数字水印必须很难(希望不可能)被清除。当然从理论上讲,只要具有足够的知识,任何水印都可以去掉。但是如果只能得到部分信息,如水印在图像中的精确位置未知,那么破坏水印将导致图像质量的严重下降。特别的,一个实用的水印算法应该对信号处理、通常的几何变形(图像或视频数据),以及恶意攻击具有鲁棒性。它们通常包括: (1)图像压缩:图像压缩算法是去掉图像信息中的冗余量。水印的不可见性要求水印信息驻留于图像不重要的视觉信息中,通常为图像的高频分量。而一般图像的主要能量均集中于低频分量上。经过图像压缩后,高频分量被当作冗余信息清除掉,因此有的文献将水印嵌入图像的最显著的低频分量中或使用带低通特性的水印,虽然这可能会降低图像的质量。目前的一些水印算法对现有的图像 武汉理工大学《信息处理课群综合训练与设计》 压缩标准(如JPEG 、MPEG )具有较好的鲁棒性,但对今后有更高压缩比的压缩算法则不能保证也具有同样好的鲁棒性。 (2)滤波:图像中的水印应该具有低通特性,即低通滤波(如均值滤波和中值滤波)应该无法删掉图像中的水印,事实上当前很多针对水印的攻击行为是用滤波完成的。 (3)图像量化与图像增强:一些常规的图像操作,如图像在不同灰度级上的量化、亮度与对比度的变化、直方图修正与均衡,均不应对水印的提取和检测有严重影响。 (4)几何失真:几何失真包括图像尺寸大小变化、图像旋转、裁剪、删除或增加图像线条以及反射等等。很多水印算法对这些几何操作都非常脆弱,容易被去掉。因此研究水印在图像几何失真的鲁棒性也是人们所关注的。 武汉理工大学《信息处理课群综合训练与设计》 3 基于变换域图像水印 3.1 DCT域数字图像水印 3.1.1 DCT变换原理 在傅里叶级数展开式中,如果被展开的函数是实偶函数,那么,其傅里叶技术中只包含余弦项,在将其离散化由此可导出余弦变换,或称之为离散余弦变换(DCT,Discrete Cosine Transform)。 经过DCT变换的数据有2个优点: 1、信号常将其能量的大部分集中于频率域的一个小范围内,这样一来,描述不重要的分量只需要很少的比特数; 2、频率域分解映射了人类视觉系统的处理过程,并允许后继的量化过程满足其灵敏度的要求。 二维离散余弦正变换公式为 Fu,v=c(u)c(v)2Nx=0N-1y=0N-1F(x,y)cosπ(2x+1)u2Ncosπ(2y+1)v2N 式中: x,y,u,v=0,1,……,N-1 cu=cv=12 u=0,v=01 其它 DCT反变换是DCT变换的逆过程 fx,y=u=0N-1v=0N-1c(u)c(v)F(u,v)cosπ(2x+1)u2Ncosπ(2y+1)v2N 式中: x=0,1,……N-1,y=0,1,……N-1 cu=1N u=0 2N u=1,2,……N cv=1N v=0 2N v=1,2,……N 武汉理工大学《信息处理课群综合训练与设计》 3.1.2 DCT水印嵌入算法 数字图像水印算法选择二值化灰度图像作为水印信息,在充分考虑了人眼视觉模型(HVS),并将其与宿主图像的 DCT 变换相结合来选择嵌入水印信息的 DCT 系数,将数字水印的灰度值直接植入到载体灰度图像的DCT变换域中,实现水印的嵌入。基本思想是:先将原始图像分成 8×8 的子块。并分别对每一子块进行离散余弦变换,然后根据人类视觉模型频率响应函数来选取每一水印待嵌入的DCT 变换系数的位置,再利用最小可察觉误差(JND) 来确定在图像的每一子块所能嵌入的数字水印信号的最大强度,把已经过预处理的水印信息自适应地嵌入到原始图像,然后将嵌入水印信息的DCT系数的子块进行逆DCT变换,最后合成为嵌入水印图像。提取算法与嵌入算法相似。 设原始图像和待嵌入水印图像分别为I(N1×N2),W(M1×M2)。为了方便计算,取M1=N1/4,M2=N2/4。 第一步:用Arnold图像置乱技术将二值水印图像置乱(可逆),然后转换成一维二值序列,记为w(i),i =1,2,……,M1 ×M2 。 第二步:将原始图像I分为互不覆盖的8×8的子块Fmn(i,j),m=N1/8, n=N2/8,i,j=1,2,……,8。对每个子块分别进行 DCT 变换。 第三步:根据人类视觉频域特性结论,适当选取第二步完成后得到的各子块系数矩阵中的(64×M1×M2)N1×N2中频系数作为嵌入水印的位置(为了增强算法的稳健性,本算法利用了多重嵌入技术,即选择嵌入的区域多于嵌入的水印比特数,在本算法中,每 8×8子块嵌入的水印4比特,选取的嵌入区域24个)。 第四步:根据人类视觉掩蔽特征公式求得每块图像里被选定区域的水印嵌入强度Qmn(i,j)。 第五步:相应的从二值序列中按顺序取出4比特水印,运用公式嵌入到选定的区域上。其中Qm(i,j)为系数 Fm(i,j)对应的步长或嵌入强度。如下式。 Fm,n'i,j=round(Fm,n(i,j)/(Qm,ni,j×Qm,ni,j))+Qm,n(i,j)/2round(Fm,n(i,j)/(Qm,ni,j×Qm,ni,j)/2 第六步:对加入水印后 DCT 系数矩阵进行 DCT 逆变换,得到嵌入水印后的图像 I′。 武汉理工大学《信息处理课群综合训练与设计》 3.1.3 DCT水印提取算法 设图像D为已经加载了水印的载体图像,现要将所加载的水印从D中提取出来,其过程为上述加载水印算法的逆运算: 第一步:将加入水印的图像I′分为互不覆盖的8×8子块Fm′(i, j ),m = N1/8,n=N2/8,i,j=1,2,……,8,对每个子块分别进行IDCT变换。 第二步:同样按照前面的结论选择出子块DCT系数矩阵中嵌入水印信号的中频系数位置,根据其所对应的嵌入强度用下式从嵌入位置上得到嵌入的水印分量。 w'i=mod(round(fm,n'(i,j)/(Qm,n(i,j)/2)),2)=1mod(round(fm,n'(i,j)/(Qm,n(i,j)/2)),2)=0 其中w′(i)为水印分量。 第三步:当对所有嵌入水印的子块处理完后,所提取出的水印分量可构成一个二值序列,(如果在水印嵌入之前将水印信号置乱过,此时要用置乱逆运算对该序列处理一下) ,将该二值序列转换成二维矩阵,从而得到水印图像 W ′。 此算法有如下几个优点 1、提取水印时,不需要原始图像。 2、在嵌入时充分考虑了人眼视觉频率响应函数来选取最佳嵌入区域,提高了水印的不可见性。 3、对人眼视觉(HVS)模型中的两个局部特性(亮度遮蔽和对比度遮蔽)的充分利用,优化了水印分量在嵌入位置上的嵌入强度,使得在保证了水印的不可见性的前提下,最大限度地嵌入水印分量,增强了水印的鲁棒性。 4、水印嵌入过程中运用了多重嵌入技术,大大增强了水印算法的鲁棒性。 5、选取图像作为水印信息,使得水印的检测结果更具有视觉效果。 6、实验结果表明,本算法简单,易行,对高斯噪声、滤波、JPEG 压缩具有很好的鲁棒性。 武汉理工大学《信息处理课群综合训练与设计》 3.1.4 算法流程图 图3.1 DCT算法嵌入(左)DCT算法提取(右) 3.2 基于DWT域图像水印 3.2.1 DWT变换原理 1、小波变换理论 小波变换主要思想是把信号分解成将原始小波经过移位和缩放之后的一系列小波,由这些小波来重构原始信号,因此小波是小波变换的基函数,小波系数反映的是不同缩放尺度和平移参数的小波基函数在重构原函数时所占的比重 在图像处理中应用的小波变换是二维小波变换,定义为: Wfa,bx,by=-∞∞-∞∞f(x,y)Ψa,bx,by*(x,y)dxdy 式中,分别表示在x,y轴的平移; 逆变换为: fx,y=1cΨ0∞-∞∞-∞∞Wfa,bx,byΨa,bx,by(x,y)dbxdbydaa3 武汉理工大学《信息处理课群综合训练与设计》 式中,cΨ为系数, Ψa,bx,by(x,y)为: Ψa,bx,byx,y=1aΨ(x-bxa,y-bya) 而Ψ(x,y)是一个二维基本小波。 执行离散小波变换的有效方法是使用滤波器,该方法是Mallat于1988年提出的,称为Mallat算法。这种方法实际上是一种信号分解的方法,在数字信号处理中常称为双通道子带编码。 用滤波器执行离散小波变换的概念如图3.2所示。S表示原始的输入信号,通过两个互补的滤波器组,其中一个滤波器为低通滤波器,通过该滤波器可得到信号的近似值A(Approximations),另一个为高通滤波器,通过该滤波器可得到信号的细节值D(Detail)。 图3.2 Mallat算法框图 A是信号的低频分量,表示信号的近似值,是由大的缩放因子产生的系数 D是信号的高频分量,表示信号的细节值,是由小的缩放因子产生的系数 在小波分析中,近似值是大的缩放因子计算的系数,表示信号的低频分量,而细节值是小的缩放因子计算的系数,表示信号的高频分量。实际应用中,信号的低频分量往往是最重要的,而高频分量只起一个修饰的作用。如同一个人的声音一样, 把高频分量去掉后,听起来声音会发生改变,但还能听出说的是什么内容,但如果把低频分量删除后,就会什么内容也听不出来了。 2、用小波变换进行图像分解 原始图像经过一级小波分解后可以分成4个频率带,分别是低频LL1,水平HL1,垂直LH1及对角线HH1。以此类推,第二小波分解对低频带LL1进一步分解成以上4个频率带。将原始图像进行三级小波分解,得到HLi,LHi,HHi和LL3共10个频率带,其中i=1……3,LL3为低频率带。 武汉理工大学《信息处理课群综合训练与设计》 图像的三层小波分解示意图如图3.3。 图3.3 图像3层小波分解 3.2.2 DWT水印嵌入算法 1、水印的预处理图像置乱 Arnold变换是Arnold在遍历理论研究中提出的一种变换,俗称猫脸变换原意为cat mapping。设想在平面单位正方形内绘制一个猫脸图像,通过如下变换: x'y'=1112xymod1 这个猫脸图像将由清晰变为模糊,这就是Arnold变换。注意到Arnold变换实际上是一种点的位置移动,并且这种变换是一一对应的。此外,这个变换可以迭代地做下去。 对于数字图像来说,可以将其看成是一个函数在离散网格点处的采样值,这样我们就得到了一个表示图像的矩阵,矩阵中元素的值是对应点处的灰度值或RGB颜色分量值。对于正方形数字图像,我们有离散化的Arnold变换: x'y'=1112xymodN,x,yϵ0,1…N-1 其中N为图像的高度和宽度。 对于数字化图像而言,我们所说的位置移动实际上是对应点的灰度值或者RGB 武汉理工大学《信息处理课群综合训练与设计》 颜色值的移动,即将原来点(x,y)处象素对应的灰度值或RGB颜色值移动至变换后的点(x ,y)处。如果我们对一个数字图像迭代地使用离散化的Arnold变换,即将左端输出的(x ,y)作为下一次Arnold变换的输入可以重复这个过程一直作下去当迭代到某一步时,如果出现的图像符合我们对图像的“杂乱无章”标准的要求,这即是一幅置乱了的图像。 需要注意的是,Arnold变换具有周期性,即当迭代到某一步时,将重新得到 原始图像。Dyson和Falk分析了离散Arnold变换的周期性,给出了对于任意N>2, Arnold变换的周期性几TN≤N2/2,这也许是迄今为止最好的结果了。 2、水印的嵌入算法 依据Cox的观点,水印信息应该具有不可预测的随机性,具有与噪声相同的特性,这不仅可以提高水印的透明性,而且可以加强水印抗千扰的能力,提高水印的鲁棒性。但是无意义的伪随机序列通常应用价值不大,有意义水印可附带许多证明信息,如原作者的个人标志,产品序列号等,在版权证明上显然较无意义水印更具有直观性和可验证性。所以在本算法中,选取有特殊意义的二值图像做为原始水印。 另外 ,为了提高水印的不可见性和鲁棒性,在水印嵌入之前,我们先对原始水印进行Arnold变换预处理。以前的很多算法不在低频系数中加入水印,原因是避免出现方块效应,但经过实验证明,不在低频部分嵌入所有水印,只嵌入一部分水印,再在中频部分嵌入一部分水印,既能保证不可见性又有很好的鲁棒性。 在小波域,为了使数字水印具有较好的鲁棒性,用于嵌入水印的小波系数就应该满足以下两个条件:小波系数不应该过多的被信号处理和噪声干扰所改变;具有较大的感觉容量,以便嵌入一定强度的水印后不会引起原始图像视觉质量的明显改变。 综合考虑上述嵌入位置的探讨以及小波分解系数的特点,本文将水印的嵌入位置选择为原始图像经过小波三级分解后的中频和低频分量上。为了权衡水印不可见性和鲁棒性,决定优先选择在原始图像小波分解后的第三级分量上嵌入水印。 3、水印嵌入过程 第一步:分别输入原始图像X和水印图像W; 第二步:利用Arnold变换将水印图像W置乱,置乱后的水印记为W'置乱次数k 武汉理工大学《信息处理课群综合训练与设计》 作为密钥; 第三步:对置乱后的水印图像W’采用Haar小波变换进行一级小波分解,得到平w'(LH,i,j)、垂直w'(HL,i,j)、对角分量小波系数w'(HH,i,j)和低频分量小波系数w'(LL,i,j); 第四步:对原始图像为X采用Haar小波变换对其进行三级小波分解,得到低频分量小波系数x(LL,i,j)、水平分量小波系数x(LH,i,j)、垂直分量小波系数x(HL,i,j)和对角分量小波系数x(HH,i,j),n =1,2,3; 第五步:参照对嵌入位置的分析,用水印的小波系数按下式修改原始图像的波系数 :X'(i,j ) = X(i ,j) + a*W'(i ,j) (4. 3) 其中X'(i,j )是嵌入水印图像的小波系数,X(i,j) 是原始图像的小波系数,W'(i ,j)是 在 原 始图像的(i ,j)位置上嵌入的水印小波系数值,a是嵌入强度,其取值应权衡不可见性和鲁棒性要求,a越大,水印虽越强壮,但是嵌入水印的图像质量就会降低。反之,取值小,图像质量虽提高了,但同时会削弱水印的鲁棒性。本文经过反复实验,高频分量a的取值范围为0.06~0 .08,低频分量a的取值范围为0.1~0.2较合适。 第六步:按照新的小波系数进行小波逆变换,重构得到含水印图像X。 3.2.3 DWT水印提取算法 水印的提取过程是嵌入过程的逆过程,提取时需要借助于原始图像,其过程如下: 第一步:对含水印图像X进行三级小波分解,得到低频分量小波系数X(LL,i,j)和X(LL,i,j)、水平分量小波系数x'(LH,i,i)和x(LH,i,j)、垂直分量小波系 数x'(LH,i,j)和x(LH,i,j)以及对角分量小波系数x(HH,i,j)和x'(HH,i,j),n=1,2,3; 第二步:参照下式提取出嵌入的水印小波系数: W'(i,j)= (X '(i ,j)-X (i ,j))/a 其中,X '(i ,j) 是含水印图像的小波系数,X(i,j) 是原始图像的小波系数, 武汉理工大学《信息处理课群综合训练与设计》 W'(i,j)是提取出的水印小波系数; 第三步:用计算出的小波系数进行小波逆变换(重构)提取出水印图像W'; 第四步:根据嵌入时设置的密钥k,并根据水印图像的尺寸求得其置乱周期T,对W'进行(T- k)次置乱操作,得到最终的提取水印图像W。 3.2.4 算法流程图 图3.4 DWT算法嵌入(左)DWT算法提取(右) 武汉理工大学《信息处理课群综合训练与设计》 4 Matlab函数介绍 4.1 图像显示 imshow():显示一幅图像; imfinfo():可以得到读入图像的信息。如文件的大小、格式、格式版本号、图像的高度、宽度、颜色类型(真彩色,灰度图还是索引图)等。 4.2 变换频函数 对信号采用不同的变换,是实现频域法水印的至关重要的一步,MATLAB中对一维信号和二维信号分别提供了各种变换和逆变换函数。 (1) 离散余弦变换(DCT) dct( ),dct2( ):分别实现一维信号和二维信号的DCT(离散余弦变换); idct( ),idct2( ):分别实现一维信号和二维信号的IDCT(逆向离散余弦变换); (2) 离散傅里叶变换(DFT) fft( ),fft2( ):分别实现一维信号和二维信号的DFT(离散傅里叶变换); ftshift:实现快速傅里叶变换的直流组件移到光谱中心; ifft( ),ifft2( ):分别实现一维信号和二维信号的IDFT(逆向离散傅里叶变换); (3) 离散小波变换(DWT) dwt( ),dwt2( ):分别实现一维信号和二维信号的DWT(离散小波变换); idwt( ),idwt2( ):分别实现一维信号和二维信号的IDWT(离散小波变换); Wavedec2( ):多级二维小波分解函数; Waveinfo( ):提供小波包中所有的小波信息; 4.3 攻击函数 对算法进行攻击测试是对水印鲁棒性检测的一种重要手段,一个好的水印算 武汉理工大学《信息处理课群综合训练与设计》 法必须经过各种攻击测试才能对之做出客观的评价。MATLAB中的许多函数可以直接用来做的攻击测试。 (1) 旋转:rotate( )可以对图像进行任意角度的旋转; (2) 剪裁:imcrop( )可以按精确定位的各点坐标进行剪裁; (3) 滤波:filter( )和filter2( )可实现对一维信号和二维信号的滤波; (4) 抖动:dither( )对图像进行抖动;抖动攻击考验水印鲁棒性的一个很好的攻击; (5) 压缩:imwrite( )中jpg和quality参数能对图像进行可控jpg压缩; (6) 加各种噪声:imnoise( )可以对图像加入各种噪声,如白噪声、椒盐噪声等,加入噪声是对水印鲁棒性考验的一种常见的攻击; (7) 放大/缩小:imresize( )可以以指定的插值方法来对图像进行放大和缩小。 4.4 图像文件输入输出函数 imread:从图形文件中读取图像;可以读bmp,jpg/jpeg, tif/tiff, png, hdf, pcx,wxd格式文件。读索引文件时,还可以得到相应的调色板数据。 imwrite:把图像写入图形文件中; imcrop:剪切图像; imresize:改变图像大小; imrotate:旋转图像; 4.5 图像颜色及类型转换函数 im2bw:转换图像为二进制图像; rgb2gray:转换RGB图像或颜色映象表为灰度图像; unit8:转换数据为八位无符号整型; double:转换数据为双精度类型 武汉理工大学《信息处理课群综合训练与设计》 5 Matlab运行结果比较 5.1 DCT水印嵌入运行结果 5.1.1 水印嵌入与提取 进行水印置乱的代码如下: function c=Arnold(o,n) L=size(o); K=[1 1;1 2]; for k=1:n for i=0:L(1)-1 for j=0:L(2)-1 loc=mod(K*[i j]',[L(1) L(2)]'); c(loc(1)+1,loc(2)+1)=o(i+1,j+1); end end o=c; end 结果如图5.1,可以看出,水印置乱后已经完全看不出规律,提高了水印的透明性和抗干扰的能力。且当经过预处理的水印被提取出来并利用Arnold变换恢复出原始水印图像时,被损坏的部分就被分散到了全图,对人类视觉的影响不明显, 提高了水印的鲁棒性。由于提取出的水印是一幅被置乱的图像,只有原始嵌入者知道采用的何种变换及变换次数,而非法攻击者面对杂乱图像,不仅不能够得到有用信息,并且很难进行伪造,故预处理也增强了算法的安全性。 图5.1 原图与原水印图(左)置乱处理的水印图(右) 武汉理工大学《信息处理课群综合训练与设计》 进行水印嵌入的代码如下,提取是嵌入和置乱的逆过程,代码略: deta=0.15 for i=1:numOfBlock for j=1:numOfBlock if (changedMark((i-1)*2+1,(j-1)*2+1)==0) dctImage((i-1)*8+2,(j-1)*8+6)=(dctImage((i-1)*8+1,(j-1)*8+6)+dctImage((i-1)*8+2,(j-1)*8+5)+dctImage((i-1)*8+2,(j-1)*8+7)+dctImage((i-1)*8+3,(j-1)*8+6))/4-deta; else dctImage((i-1)*8+2,(j-1)*8+6)=(dctImage((i-1)*8+1,(j-1)*8+6)+dctImage((i-1)*8+2,(j-1)*8+5)+dctImage((i-1)*8+2,(j-1)*8+7)+dctImage((i-1)*8+3,(j-1)*8+6))/4+deta; end if (changedMark((i-1)*2+1,(j-1)*2+2)==0) dctImage((i-1)*8+4,(j-1)*8+5)=(dctImage((i-1)*8+3,(j-1)*8+5)+dctImage((i-1)*8+5,(j-1)*8+5)+dctImage((i-1)*8+4,(j-1)*8+4)+dctImage((i-1)*8+4,(j-1)*8+6))/4-deta; else dctImage((i-1)*8+4,(j-1)*8+5)=(dctImage((i-1)*8+3,(j-1)*8+5)+dctImage((i-1)*8+5,(j-1)*8+5)+dctImage((i-1)*8+4,(j-1)*8+4)+dctImage((i-1)*8+4,(j-1)*8+6))/4+deta; end if (changedMark((i-1)*2+2,(j-1)*2+1)==0) dctImage((i-1)*8+6,(j-1)*8+4)=(dctImage((i-1)*8+5,(j-1)*8+4)+dctImage((i-1)*8+7,(j-1)*8+4)+dctImage((i-1)*8+6,(j-1)*8+3)+dctImage((i-1)*8+6,(j-1)*8+5))/4-deta; else dctImage((i-1)*8+6,(j-1)*8+4)=(dctImage((i-1)*8+5,(j-1)*8+4)+dctImage((i-1)*8+7,(j-1)*8+4)+dctImage((i-1)*8+6,(j-1)*8+3)+dctImage((i-1)*8+6,(j-1)*8+5))/4+deta; end if(changedMark((i-1)*2+2,(j-1)*2+2)==0) dctImage((i-1)*8+7,(j-1)*8+2)=(dctImage((i-1)*8+6,(j-1)*8+2)+dctImage((i-1)*8+8,(j-1)*8+2)+dctImage((i-1)*8+7,(j-1)*8+1)+dctImage((i-1)*8+7,(j-1)*8+3))/4-deta; else dctImage((i-1)*8+7,(j-1)*8+2)=(dctImage((i-1)*8+6,(j-1)*8+2)+dctImage((i-1)*8+8,(j-1)*8+2)+dctImage((i-1)*8+7,(j-1)*8+1)+dctImage((i-1)*8+7,(j-1)*8+3))/4+deta; end end end fun=@idct2; 武汉理工大学《信息处理课群综合训练与设计》 newImage=blkproc(dctImage,[8 8],fun); 嵌入后的水印图及提取出来的水印如图5.2所示。可以看出系数为0.15时水印是有良好的隐蔽性的,基本上看着和原图差不多。 图5.2 嵌入深度0.15(左)嵌入深度0.5(右) 5.1.2 水印鲁棒性检测 1、JPEG压缩攻击 JPEG压缩比50%情况下提取水印代码如下: imwrite(newImage,'lena_50.jpg','jpeg','Quality',50); jpg50Image=imread('lena_50.jpg'); pickedMark=getTheWaterMark(jpg50Image,numOfBlock,markSize); pickedMark=iArnold(pickedMark,Ln); 得到的PSNR和NC值为: JPEG有损压缩后图像质量变差,水印可以提取出来,但是有一些不清晰,但是可以用来进行认证是没有问题的。结果如图5.3所示。 武汉理工大学《信息处理课群综合训练与设计》 图5.3 JPEG压缩比50%(左)压缩比70%(右) 2、旋转攻击 旋转攻击代码如下: rotateImage = imrotate(newImage,2,'crop'); imwrite(rotateImage,'lena_rot.jpg','jpg'); pickedMark=getTheWaterMark(rotate2Image,numOfBlock,markSize); pickedMark=iArnold(pickedMark,Ln); 得到的PSNR和NC值为: 结果如图5.4所示,对于旋转攻击,DCT算法鲁棒性很差,基本上不能应对。所以DCT算法是有很大的缺陷的。 图5.4 旋转2度(左)旋转10度(右) 3、噪声攻击 武汉理工大学《信息处理课群综合训练与设计》 旋转攻击代码如下: noiseImage=imnoise(newImage,'gaussian'); pickedMark=getTheWaterMark(noiseImage,numOfBlock,markSize); pickedMark=iArnold(pickedMark,Ln); 得到的PSNR和NC值为: 结果如图5.5所示,对于噪声攻击,DCT算法鲁棒性一般,可以提取出较清晰的水印。 图5.5 高斯噪声(左)椒盐噪声(右) 4、缩放攻击 缩放攻击代码如下: resizeImage=imresize(newImage,2); pickedMark=getTheWaterMark(resizeImage,numOfBlock,markSize); pickedMark=iArnold(pickedMark,Ln); 得到的PSNR和NC值为: 武汉理工大学《信息处理课群综合训练与设计》 结果如图5.6所示,对于放大攻击,DCT算法鲁棒性很强,提取的水印很清晰,而对于缩小攻击,DCT算法鲁棒性很差,提取出的水印只能勉强看得到。 图5.6 放大2倍(左)缩小2倍(右) 5、剪切攻击 旋转攻击代码如下: thirdFourImage=newImage; thirdFourImage(64:128,64:128)=255; pickedMark=getTheWaterMark(thirdFourImage,numOfBlock,markSize); pickedMark=iArnold(pickedMark,Ln); 得到的PSNR和NC值为: 结果如图5.7所示,对于剪切攻击,DCT算法鲁棒性一般,提取的水印效果 武汉理工大学《信息处理课群综合训练与设计》 较好。 图5.7剪切1/4(左)剪切1/2(右) 5.2 DWT水印嵌入运行结果 5.2.1 水印嵌入与提取 反置乱代码如下,置乱代码略: function r=iArnold(c,n) L=size(c); K=[1 1;1 2]; K=inv(K); for k=1:n for i=0:L(1)-1 for j=0:L(2)-1 loc=mod(K*[i j]',[L(1) L(2)]'); r(loc(1)+1,loc(2)+1)=c(i+1,j+1); end end c=r; end 原图与原水印及提取的置乱后的水印如图5.8, 武汉理工大学《信息处理课群综合训练与设计》 图5.8 原图与原水印图(左)置乱处理的水印图(右) 嵌入水印的代码如下,提取是嵌入和置乱的逆过程,代码略:: [XCsource,XSsource]=wavedec2(X,3,'db1'); lowarray=reshape(XCsource(1:4096),64,64); for i = 1:64 ref1(i)=mean(lowarray(:,i)); ref2(i)=mean(lowarray(i,:)); for j=1:64 w(i,j,:)=int8(dec2bin(W(i,j),8))-48; result(i,j,1)=xor(w(i,j,1),(lowarray(i,j)>ref1(i))); result(i,j,2)=xor(w(i,j,2),(lowarray(i,j)>ref2(i))); end end for i=1:4096 ref3tmp=[XCsource(16381+4*i:16384+4*i)]; ref3(i)=mean(ref3tmp); ref4tmp=[XCsource(32765+4*i:32768+4*i)]; ref4(i)=mean(ref3tmp); ref5tmp=[XCsource(49149+4*i:49152+4*i)]; ref5(i)=mean(ref5tmp); ref6tmp=[XCsource(65521+16*i:65536+16*i)]; ref6(i)=mean(ref6tmp); ref7tmp=[XCsource(131057+16*i:131072+16*i)]; ref7(i)=mean(ref7tmp); ref8tmp=[XCsource(196593+16*i:196608+16*i)]; ref8(i)=mean(ref8tmp); end alaph3=double(mean(low)/mean(ref3)); alaph4=double(mean(low)/mean(ref4)); alaph5=double(mean(low)/mean(ref5)); alaph6=double(mean(low)/mean(ref6)); alaph7=double(mean(low)/mean(ref7)); 武汉理工大学《信息处理课群综合训练与设计》 alaph8=double(mean(low)/mean(ref8)); reref3=reshape(ref3,64,64); reref4=reshape(ref4,64,64); reref5=reshape(ref5,64,64); reref6=reshape(ref6,64,64); reref7=reshape(ref7,64,64); reref8=reshape(ref8,64,64); for i =1:64 for j=1:64 result(i,j,3)=xor(w(i,j,3),(lowarray(i,j)>(alaph3*reref3(i,j)))); result(i,j,4)=xor(w(i,j,4),(lowarray(i,j)>(alaph4*reref4(i,j)))); result(i,j,5)=xor(w(i,j,5),(lowarray(i,j)>(alaph5*reref5(i,j)))); result(i,j,6)=xor(w(i,j,6),(lowarray(i,j)>(alaph6*reref6(i,j)))); result(i,j,7)=xor(w(i,j,7),(lowarray(i,j)>(alaph7*reref7(i,j)))); result(i,j,8)=xor(w(i,j,8),(lowarray(i,j)>(alaph8*reref8(i,j)))); end end X_dou=double(X);%'Watermaked Image' pickedMark=tiqu(X_dou); 图5.9 水印图和提取出的水印 5.2.2 水印鲁棒性检测 水印的峰值信噪比(PSNR)计算代码如下: function [A] = psnr(image,image_prime,M,N) image=double(image); image_prime=double(image_prime); if ((sum(sum(image-image_prime))) == 0) error('Input vectors must not be identical') else psnr_num=M*N*max(max(image.^2)); % calculate numerator 武汉理工大学《信息处理课群综合训练与设计》 psnr_den=sum(sum((image-image_prime).^2)); % calculate denominator A=psnr_num/psnr_den; % calculate PSNR End 水印相关性(NC)计算代码如下: function y=matrix_nc(w,v) w=double(w); v=double(v); [wrow,wcol]=size(w); [vrow,vcol]=size(v); if wrow<1||wcol<1||vrow<1||vcol<1 error('输入有误--------维数不能小于一'); elseif wrow~=vrow||wcol~=vcol error('输入矩阵维数不相等!'); end y=sum(sum(w.*v))./(sqrt(sum(sum(w.^2))).*sqrt(sum(sum(v.^2)))); 1、JPEG压缩攻击 imwrite(X,'lenaattack4.jpg','Q',50); Z4=imread('lenaattack4.jpg'); Z4_dou=double(Z4);%'Watermaked Image' pickedMark=tiqu(Z4_dou); 得到的PSNR和NC值为: 运行结果如图5.10。可以看出,DWT算法对压缩攻击鲁棒性较高。 图5.10 50%压缩(左)70%压缩(右) 武汉理工大学《信息处理课群综合训练与设计》 2、旋转攻击 Z1_dou=double(Z1);%'Watermaked Image' pickedMark=tiqu(Z1_dou); X=imread('water_lena.bmp');%'Watermaked Image' Z1 = imrotate(X,2,'crop'); 得到的PSNR和NC值为: 运行结果如图5.11。可以看出,DWT算法对旋转攻击鲁棒性一般,当旋转度数太大,就基本看不到水印了。 图5.11 旋转2度(左)旋转10度(右) 3、噪声攻击 Z3=imnoise(X,'gaussian');%加噪声 选择参数 help imnoise imwrite(Z3,'lenaattack3.jpg','jpg'); Z3_dou=double(Z3);%'Watermaked Image' pickedMark=tiqu(Z3_dou); 得到的PSNR和NC值为: 运行结果如图5.12。可以看出,DWT算法对噪声攻击鲁棒性较强,可以看到较清晰的水印。 武汉理工大学《信息处理课群综合训练与设计》 图5.12 高斯噪声(左)椒盐噪声(右) 4、缩放攻击 Z5=imresize(X,2); imwrite(Z5,'lenaattack5.jpg','jpg'); Z5_dou=double(Z5);%'Watermaked Image' pickedMark=tiqu(Z5_dou); 得到的PSNR和NC值为: 运行结果如图5.13。可以看出,DWT算法对缩放攻击鲁棒性都很强,提取出的水印不管是压缩还是放大都很清晰。 图5.13 放大2倍(左)放大4倍(右) 武汉理工大学《信息处理课群综合训练与设计》 5、剪切攻击 Z2=X; Z2(128:256,256:384)=255;%剪切 区间和嵌入值可以控制 imwrite(Z2,'lenaattack2.jpg','jpg'); Z2_dou=double(Z2);%'Watermaked Image' pickedMark=tiqu(Z2_dou); 得到的PSNR和NC值为: 运行结果如图5.14。可以看出,DWT算法对剪切攻击鲁棒性一般,当剪切太多,就基本看不到水印了。 图5.14 剪切1/4 (左)剪切1/2(右) 5.3 实验结果总结分析 首先,从不可见性上看,不可见性与鲁棒性密切相关,因此比较不可见性必须以相同的鲁棒性为前提。DWT算法的不可见性优于DCT算法,尤其当嵌入多个水印时,差别很明显。其次,从鲁棒性上看,对于高斯噪声,DWT算法效果好于DCT算法。对于有损压缩,DCT算法有较强的鲁棒性。 实验结果表明,DCT和DWT算法都有较好的水印不可见性,并且对各种常见的图像处理攻击,具有很强的鲁棒性。但从算法实现方法上来看,DWT算法和DCT算法各有灵活性。从效果上来看,DWT算法明显好于DCT算法,这都预示着DWT 武汉理工大学《信息处理课群综合训练与设计》 算法在数字水印领域有着更广阔的发展前景。 其次,对于离散余弦变换嵌入水印,是嵌入在原图像的低频部分。本文提出的盲水印算法的鲁棒性虽然不及一些需要原图的水印算法,但是相比而言不需要未加水印的原始图像,而且这种算法可以抵抗一些常见的攻击方法。且嵌入水印的图像还是比较清晰的,这说明离散余弦变换法还是具有实用价值的。这种算法对JPEG压缩攻击和放大攻击来说,提取水印的效果还是比较好的;但对于旋转攻击和剪切攻击来说,效果却并不理想。这证明离散余弦变换还是具有一定的局限性的; 对于离散小波变换嵌入的水印,嵌入了小波域的低频和中频部分。同样是基于盲水印算法,可以抵抗一些常见的攻击方法,如:JPEG压缩,噪声,缩放,旋转、裁减。各种攻击都能达到较强的鲁棒性,但是一旦攻击程度变强,其提取的水印质量也很差,所以算法上需要更多的改进,经过调查发现,数字水印算法要综合各种算法的优缺点才能得到提高,数字水印的方法有很多,但是每一种单独的方法都无法禁得起多种方法的图像处理,只有组合不同的方法才能达到更好的效果。 最后,程序使用了最一般的循环语句,而没有考虑到代码的优化。在本论文中,程序的执行花销时间很少,但若是图像比较大的话,是一定要考虑代码优化问题的。特别是for循环,当采用向量化循环方法将使运行时间成百上千倍的缩减!另外也没有考虑预分配数组的问题,当加入预分配数组后,运行时间也会明显缩短,而且会使内存有较大的连续空间。通过比较DCT算法和DWT算法的NC值,把DCT算法和DWT算法和效果进行对比如表5-1所示。 表5-1 DCT与DWT效果对比 NC_jpeg NC_rot NC_noi NC_res_u NC_res_d NC_cut DCT 0.9964 0.6533 0.9492 1.0000 0.9374 0.9664 DWT 0.9965 0.9627 0.9883 0.9993 0.9975 0.9690 从表中可以看出,少数时候DCT算法效果比DWT算法效果好,但是在大部分时候,DWT算法的效果都比DCT算法好,且从不可见性上看,DWT算法明显优于DCT算法,综合起来考虑,DWT算法要优于DCT算法,如果把两种算法综合起来,也许能得到不可见性更强,鲁棒性更高的算法。 武汉理工大学《信息处理课群综合训练与设计》 6 实验心得体会 在这次信息处理课群综合训练与设计中,我做的是数字水印技术,看到这个题目就让人很兴奋,因为看起来似乎很有趣,所以自己做起来就很认真。之前用MATLAB做过图像处理,还尝试过视频处理,所以也比较容易上手。还好网上有很多资料,图书馆里也可以借到书,开始似乎很顺利。但是当我开始调试程序时,就发现其实还是有点难度的,最初打算做的是DCT域的水印,先做分块DCT变换再进行水印嵌入和水印提取,水印自己用画图工具画了一个64*64的水印图,图片采用LENA,开始想做灰度水印的嵌入来着,做到中间觉得自己开始弄不清了,后来就决定用二值水印,把水印图片先做二值化,再进行嵌入,我发现多数都是这样做的,这时才用自己画的一个图,这样识别起来更清晰容易。进行攻击实现后发现DCT水印有很多弱点,这时才打算重新做,于是又看DWT 域的,之前没接触过DWT,但是觉得它好像很出名,于是开始了DWT 学习,又做了DWT域的水印,做攻击实验时发现其效果确实比DCT要好,所以,综合了我做的这些,我就在本次课设中对它们进行比较,虽然好像花了更多时间,好像之前不应该从DCT开始做,但是我知道我确实学到了更多知识。 平时的学习中我们只注重看书,很少真正做实际的东西,就算学MATLAB也是在老师的指导下把书本上的程序运行一遍,每次都是一次成功,根本不能体会到调试程序是个什么滋味。而且MATLAB书上的程序也是一下就能调出来,几遍就能看懂的小程序,要真的学到东西,就一定要真正的做一个大的设计。 课程设计实践不单是将所学的知识应用于实际,在设计的过程中,只拥有理论知识是不够的。逻辑思维、考虑问题的思路和角度等也是很重要,需要我们着重注意锻炼的能力。在这次设计中还发现理论与实际常常存在很大差距。同时课程设计可以锻炼自己查找资料,综合所学知识,提炼有用知识的能力,这对自己是一次很好的实践锻炼机会。 武汉理工大学《信息处理课群综合训练与设计》 7 参考文献 [1] MATLAB 通信工程仿真 张德丰等著 机械工业出版社 [2] MATLAB图像处理宝典 秦襄培,郑贤中等著 电子工业出版社 [3]基于小波变换的数字水印算法设计 连华,赵瑞梅,胡勃宁 内蒙古大学学报 2010.1 第41卷第1期 102-106页 [4]DCT数字水印算法与DWT数字水印算法的性能比较 程兴国,张建华 襄樊学院学报 2007.2 第28卷第2期 41-45页 [5]基于HVS的DCT数字水印算法 周泓 电脑知识与技术 2009.11 第5卷第33期 附录 1、水印置乱程序 function c=Arnold(o,n) L=size(o); K=[1 1;1 2]; for k=1:n for i=0:L(1)-1 for j=0:L(2)-1 loc=mod(K*[i j]',[L(1) L(2)]'); c(loc(1)+1,loc(2)+1)=o(i+1,j+1); end end o=c; end 2、水印反置乱程序 function r=iArnold(c,n) L=size(c); K=[1 1;1 2]; K=inv(K); for k=1:n for i=0:L(1)-1 for j=0:L(2)-1 loc=mod(K*[i j]',[L(1) L(2)]'); 武汉理工大学《信息处理课群综合训练与设计》 r(loc(1)+1,loc(2)+1)=c(i+1,j+1); end end c=r; end 3、峰值信噪比计算程序 function [A] = psnr(image,image_prime,M,N) image=double(image); % convert to doubles image_prime=double(image_prime); psnr_num=M*N*max(max(image.^2)); % calculate numerator psnr_den=sum(sum((image-image_prime).^2)); % calculate denominator A=psnr_num/psnr_den; % calculate PSNR return 4、相关系数计算程序 function y=matrix_nc(w,v) w=double(w);v=double(v); [wrow,wcol]=size(w); [vrow,vcol]=size(v); y=sum(sum(w.*v))./(sqrt(sum(sum(w.^2))).*sqrt(sum(sum(v.^2)))); 5、DWT水印程序 Main.m clear; X=imread('lena.jpg'); W=imread('water.bmp'); %'double'将矩阵的元素变成双精度元素 figure; subplot(121);imshow(X,[]); title('Original Image'); subplot(122);imshow(W,[]); title('Waited Watermaked Image'); %水印置乱 Ln=10; W=Arnold(W,Ln); figure imshow(W) title('anold water'); X_dou=double(X); W_dou=double(W); X_r=qianru(X_dou,W_dou); Z1 = imrotate(X_r,2,'crop');%旋转 角度可以控制 imwrite(Z1,'lenaattack1.jpg','jpg'); 武汉理工大学《信息处理课群综合训练与设计》 Z1_1 = imrotate(X_r,10,'crop');%旋转 角度可以控制 imwrite(Z1_1,'lenaattack1_1.jpg','jpg'); Z2=X_r; Z2(128:256,256:384)=255;%剪切 区间和嵌入值可以控制 imwrite(Z2,'lenaattack2.jpg','jpg'); Z2_1=X_r; Z2_1(128:384,128:384)=255;%剪切 区间和嵌入值可以控制 imwrite(Z2_1,'lenaattack2_1.jpg','jpg'); Z3=imnoise(X_r,'gaussian');%加噪声 imwrite(Z3,'lenaattack3.jpg','jpg'); Z3_1=imnoise(X_r,'salt & pepper');%加噪声 imwrite(Z3_1,'le1naattack3_1.jpg','jpg'); imwrite(X_r,'lenaattack4.jpg','Q',50);%压缩输出(可选择压缩比例) Z4=imread('lenaattack4.jpg'); imwrite(X_r,'lenaattack4_1.jpg','Q',70);%压缩输出(可选择压缩比例) Z4_1=imread('lenaattack4_1.jpg'); Z5=X_r; Z5=uint8(Z5); Z5=imresize(Z5,2);%suofanggongji imwrite(Z5,'lenaattack5.jpg','jpg'); Z5_1=X_r; Z5_1=uint8(Z5_1); Z5_1=imresize(Z5_1,0.5); imwrite(Z5_1,'lenaattack5_1.jpg','jpg'); X_r_dou=double(X_r);%'Watermaked Image' pickedMark=tiqu(X_r_dou); pickedMark=iArnold(pickedMark,Ln); figure; subplot(121);imshow(X_r_dou,[]); title('Original water Image'); subplot(122);imshow(pickedMark,[]); title('Extracted Water'); Z4_dou=double(Z4);%'Watermaked Image' pickedMark=tiqu(Z4_dou); PSNR_jpeg=psnr(W,pickedMark,64,64) NC_jpeg=matrix_nc(W,pickedMark) pickedMark=iArnold(pickedMark,Ln); figure; 武汉理工大学《信息处理课群综合训练与设计》 subplot(121);imshow(Z4_dou,[]); title('jpeg50 Image'); subplot(122);imshow(pickedMark,[]); title('jpeg50 water'); Z41_dou=double(Z4_1);%'Watermaked Image' pickedMark=tiqu(Z41_dou); pickedMark=iArnold(pickedMark,Ln); figure; subplot(121);imshow(Z41_dou,[]); title('jpeg70 Image'); subplot(122);imshow(pickedMark,[]); title('jpeg70 water'); Z1_dou=double(Z1);%'Watermaked Image' pickedMark=tiqu(Z1_dou); PSNR_rot=psnr(W,pickedMark,64,64) NC_rot=matrix_nc(W,pickedMark) pickedMark=iArnold(pickedMark,Ln); figure; subplot(121);imshow(Z1_dou,[]); title('rotate2 Image'); subplot(122);imshow(pickedMark,[]); title('rotate2 water'); Z11_dou=double(Z1_1);%'Watermaked Image' pickedMark=tiqu(Z11_dou); pickedMark=iArnold(pickedMark,Ln); figure; subplot(121);imshow(Z11_dou,[]); title('rotate10 Image'); subplot(122);imshow(pickedMark,[]); title('rotate10 water'); Z3_dou=double(Z3);%'Watermaked Image' pickedMark=tiqu(Z3_dou); PSNR_noi=psnr(W,pickedMark,64,64) NC_noi=matrix_nc(W,pickedMark) pickedMark=iArnold(pickedMark,Ln); figure; subplot(121);imshow(Z3_dou,[]); title('noisegaus Image'); subplot(122);imshow(pickedMark,[]); title('noisegaus water'); 武汉理工大学《信息处理课群综合训练与设计》 Z31_dou=double(Z3_1);%'Watermaked Image' pickedMark=tiqu(Z31_dou); pickedMark=iArnold(pickedMark,Ln); figure; subplot(121);imshow(Z31_dou,[]); title('noisesalt Image'); subplot(122);imshow(pickedMark,[]); title('noisesalt water'); figure; subplot(121);imshow(Z5); title('resize2 Image'); Z5=imresize(Z5,[512,512],'bicubic'); Z5_dou=double(Z5);%'Watermaked Image' pickedMark=tiqu(Z5_dou); PSNR_res_u=psnr(W,pickedMark,64,64) NC_res_u=matrix_nc(W,pickedMark) pickedMark=iArnold(pickedMark,Ln); subplot(122);imshow(pickedMark,[]); title('resize2 water'); figure; subplot(121);imshow(Z5_1); title('resize05 Image'); Z5_1=imresize(Z5_1,[512,512],'bicubic'); Z51_dou=double(Z5_1);%'Watermaked Image' pickedMark=tiqu(Z51_dou); PSNR_res_d=psnr(W,pickedMark,64,64) NC_res_d=matrix_nc(W,pickedMark) pickedMark=iArnold(pickedMark,Ln); subplot(122);imshow(pickedMark,[]); title('resize05 water'); Z2_dou=double(Z2);%'Watermaked Image' pickedMark=tiqu(Z2_dou); PSNR_cut=psnr(W,pickedMark,64,64) NC_cut=matrix_nc(W,pickedMark) pickedMark=iArnold(pickedMark,Ln); figure; subplot(121);imshow(Z2_dou,[]); title('cut14 Image'); subplot(122);imshow(pickedMark,[]); title('cut14 water'); 武汉理工大学《信息处理课群综合训练与设计》 Z21_dou=double(Z2_1);%'Watermaked Image' pickedMark=tiqu(Z21_dou); pickedMark=iArnold(pickedMark,Ln); figure; subplot(121);imshow(Z21_dou,[]); title('cut12 Image'); subplot(122);imshow(pickedMark,[]); title('cut12 water'); qianru.m function [Y]=qianru(X,W) [XCsource,XSsource]=wavedec2(X,3,'db1'); lowarray=reshape(XCsource(1:4096),64,64); %convert matrix XCsource(1:4096) to a 64*64 matrix low=XCsource(1:4096); for i = 1:64 ref1(i)=mean(lowarray(:,i)); %对矩阵每列求均值 ref2(i)=mean(lowarray(i,:)); %对矩阵每行求均值 for j=1:64 w(i,j,:)=int8(dec2bin(W(i,j),8))-48; %dec2bin将矩阵W的每个元素转换成二进制值,每个二进制长度为8 result(i,j,1)=xor(w(i,j,1),(lowarray(i,j)>ref1(i))); result(i,j,2)=xor(w(i,j,2),(lowarray(i,j)>ref2(i))); end end for i=1:4096 ref3tmp=[XCsource(16381+4*i:16384+4*i)];%128*128=16384 ref3(i)=mean(ref3tmp); ref4tmp=[XCsource(32765+4*i:32768+4*i)];%128*256=32768 ref4(i)=mean(ref3tmp); ref5tmp=[XCsource(49149+4*i:49152+4*i)];%(128+64)*256=49152 or (128+256)*128=49152 ref5(i)=mean(ref5tmp); ref6tmp=[XCsource(65521+16*i:65536+16*i)];%256*256=65536 or 128*512=65536 ref6(i)=mean(ref6tmp); ref7tmp=[XCsource(131057+16*i:131072+16*i)];%256*512=131072 ref7(i)=mean(ref7tmp); ref8tmp=[XCsource(196593+16*i:196608+16*i)];%(128+256)*512=196608 ref8(i)=mean(ref8tmp); end 武汉理工大学《信息处理课群综合训练与设计》 alaph3=double(mean(low)/mean(ref3)); alaph4=double(mean(low)/mean(ref4)); alaph5=double(mean(low)/mean(ref5)); alaph6=double(mean(low)/mean(ref6)); alaph7=double(mean(low)/mean(ref7)); alaph8=double(mean(low)/mean(ref8)); reref3=reshape(ref3,64,64); reref4=reshape(ref4,64,64); reref5=reshape(ref5,64,64); reref6=reshape(ref6,64,64); reref7=reshape(ref7,64,64); reref8=reshape(ref8,64,64); for i =1:64 for j=1:64 result(i,j,3)=xor(w(i,j,3),(lowarray(i,j)>(alaph3*reref3(i,j)))); result(i,j,4)=xor(w(i,j,4),(lowarray(i,j)>(alaph4*reref4(i,j)))); result(i,j,5)=xor(w(i,j,5),(lowarray(i,j)>(alaph5*reref5(i,j)))); result(i,j,6)=xor(w(i,j,6),(lowarray(i,j)>(alaph6*reref6(i,j)))); result(i,j,7)=xor(w(i,j,7),(lowarray(i,j)>(alaph7*reref7(i,j)))); result(i,j,8)=xor(w(i,j,8),(lowarray(i,j)>(alaph8*reref8(i,j)))); end end save('key','result'); Y=waverec2(XCsource,XSsource,'db1'); Y=uint8(Y); imwrite(Y,'water_lena.bmp','bmp'); tiqu.m function [pickedMark]=tiqu(X) load key [XCsource,XSsource]=wavedec2(X,3,'db1'); low=XCsource(1:4096); lowarray=reshape(XCsource(1:4096),64,64); std=result; for i = 1:64 ref1(i)=mean(lowarray(:,i)); ref2(i)=mean(lowarray(i,:)); for j=1:64 pick(i,j,1)=xor(std(i,j,1),(lowarray(i,j)>ref1(i))); pick(i,j,2)=xor(std(i,j,2),(lowarray(i,j)>ref2(i))); end 武汉理工大学《信息处理课群综合训练与设计》 end for i=1:4096 ref3tmp=[XCsource(16381+4*i:16384+4*i)]; ref3(i)=mean(ref3tmp); ref4tmp=[XCsource(32765+4*i:32768+4*i)]; ref4(i)=mean(ref3tmp); ref5tmp=[XCsource(49149+4*i:49152+4*i)]; ref5(i)=mean(ref5tmp); ref6tmp=[XCsource(65521+16*i:65536+16*i)]; ref6(i)=mean(ref6tmp); ref7tmp=[XCsource(131057+16*i:131072+16*i)]; ref7(i)=mean(ref7tmp); ref8tmp=[XCsource(196593+16*i:196608+16*i)]; ref8(i)=mean(ref8tmp); end alaph3=double(mean(low)/mean(ref3)); alaph4=double(mean(low)/mean(ref4)); alaph5=double(mean(low)/mean(ref5)); alaph6=double(mean(low)/mean(ref6)); alaph7=double(mean(low)/mean(ref7)); alaph8=double(mean(low)/mean(ref8)); reref3=reshape(ref3,64,64); reref4=reshape(ref4,64,64); reref5=reshape(ref5,64,64); reref6=reshape(ref6,64,64); reref7=reshape(ref7,64,64); reref8=reshape(ref8,64,64); for i =1:64 for j=1:64 pick(i,j,3)=xor(std(i,j,3),(lowarray(i,j)>(alaph3*reref3(i,j)))); pick(i,j,4)=xor(std(i,j,4),(lowarray(i,j)>(alaph4*reref4(i,j)))); pick(i,j,5)=xor(std(i,j,5),(lowarray(i,j)>(alaph5*reref5(i,j)))); pick(i,j,6)=xor(std(i,j,6),(lowarray(i,j)>(alaph6*reref6(i,j)))); pick(i,j,7)=xor(std(i,j,7),(lowarray(i,j)>(alaph7*reref7(i,j)))); pick(i,j,8)=xor(std(i,j,8),(lowarray(i,j)>(alaph8*reref8(i,j)))); end end for i=1:64 for j=1:64 武汉理工大学《信息处理课群综合训练与设计》 od=double(reshape(pick(i,j,:),1,8)); pickedMark(i,j)=bin2dec(char(od+48)); end end 6、DCT水印程序 Main.m imageSize=256; blockSize=8; numOfBlock=32; image=imread('lena256.jpg'); image=double(image)/255; fun=@dct2; dctImage=blkproc(image,[8 8],fun);%分块DCT markSize=64;%64*64 waterMark=imread('water.bmp');%64*64 figure subplot(1,2,1); imshow(image); title('Original Image'); subplot(1,2,2); imshow(waterMark); title('Original watermark'); %水印置乱 Ln=10; changedMark=Arnold(waterMark,Ln); figure imshow(changedMark) title('anold water'); changedMark=double(changedMark); %put the waterMark into the image deta=0.5 for i=1:numOfBlock for j=1:numOfBlock if (changedMark((i-1)*2+1,(j-1)*2+1)==0) dctImage((i-1)*8+2,(j-1)*8+6)=(dctImage((i-1)*8+1,(j-1)*8+6)+dctImage((i-1)*8+2,(j-1)*8+5)+dctImage((i-1)*8+2,(j-1)*8+7)+dctImage((i-1)*8+3,(j-1)*8+6))/4-deta; else dctImage((i-1)*8+2,(j-1)*8+6)=(dctImage((i-1)*8+1,(j-1)*8+6)+dctImage((i-1)*8+2,(j-1)*8+5)+dctImage((i-1)*8+2,(j-1)*8+7)+dctImage((i-1)*8+3,(j-1)*8+6))/4+deta; end if (changedMark((i-1)*2+1,(j-1)*2+2)==0) 武汉理工大学《信息处理课群综合训练与设计》 dctImage((i-1)*8+4,(j-1)*8+5)=(dctImage((i-1)*8+3,(j-1)*8+5)+dctImage((i-1)*8+5,(j-1)*8+5)+dctImage((i-1)*8+4,(j-1)*8+4)+dctImage((i-1)*8+4,(j-1)*8+6))/4-deta; else dctImage((i-1)*8+4,(j-1)*8+5)=(dctImage((i-1)*8+3,(j-1)*8+5)+dctImage((i-1)*8+5,(j-1)*8+5)+dctImage((i-1)*8+4,(j-1)*8+4)+dctImage((i-1)*8+4,(j-1)*8+6))/4+deta; end if (changedMark((i-1)*2+2,(j-1)*2+1)==0) dctImage((i-1)*8+6,(j-1)*8+4)=(dctImage((i-1)*8+5,(j-1)*8+4)+dctImage((i-1)*8+7,(j-1)*8+4)+dctImage((i-1)*8+6,(j-1)*8+3)+dctImage((i-1)*8+6,(j-1)*8+5))/4-deta; else dctImage((i-1)*8+6,(j-1)*8+4)=(dctImage((i-1)*8+5,(j-1)*8+4)+dctImage((i-1)*8+7,(j-1)*8+4)+dctImage((i-1)*8+6,(j-1)*8+3)+dctImage((i-1)*8+6,(j-1)*8+5))/4+deta; end if(changedMark((i-1)*2+2,(j-1)*2+2)==0) dctImage((i-1)*8+7,(j-1)*8+2)=(dctImage((i-1)*8+6,(j-1)*8+2)+dctImage((i-1)*8+8,(j-1)*8+2)+dctImage((i-1)*8+7,(j-1)*8+1)+dctImage((i-1)*8+7,(j-1)*8+3))/4-deta; else dctImage((i-1)*8+7,(j-1)*8+2)=(dctImage((i-1)*8+6,(j-1)*8+2)+dctImage((i-1)*8+8,(j-1)*8+2)+dctImage((i-1)*8+7,(j-1)*8+1)+dctImage((i-1)*8+7,(j-1)*8+3))/4+deta; end end end %idct2 fun=@idct2; newImage=blkproc(dctImage,[8 8],fun); %newImage=round(newImage); imwrite(newImage,'newlena.jpg','jpg'); imwrite(newImage,'lena_70.jpg','jpeg','Quality',70); jpg70Image=imread('lena_70.jpg'); imwrite(newImage,'lena_50.jpg','jpeg','Quality',50); jpg50Image=imread('lena_50.jpg'); rotateImage = imrotate(newImage,2,'crop');%旋转 角度可以控制 imwrite(rotateImage,'lena_rot.jpg','jpg'); rotateImage1 = imrotate(newImage,10,'crop');%旋转 角度可以控制 noiseImage=imnoise(newImage,'gaussian');%加噪声 noiseImage1=imnoise(newImage,'salt & pepper');%加噪声 选择参数 help imnoise %resizeImage=uint8(newImage); resizeImage=imresize(newImage,2); 武汉理工大学《信息处理课群综合训练与设计》 %resizeImage2=resizeImage(128:384,128:384); %resizeImage05=uint8(newImage); resizeImage05=imresize(newImage,0.5); %resizeImage05=zeros(256,256); %resizeImage05(1:64,193:256)=255; %resizeImage05(65:192,65:192)=resizeImage_1(1:128,1:128); thirdFourImage=newImage; thirdFourImage(64:128,64:128)=255;%剪切 区间和嵌入值可以控制 cutImage=newImage; cutImage(64:192,64:192)=255;%剪切 区间和嵌入值可以控制 figure subplot(1,2,1); imshow(newImage); title('with waterMark'); pickedMark=getTheWaterMark(newImage,numOfBlock,markSize); pickedMark=iArnold(pickedMark,Ln); subplot(1,2,2); imshow(pickedMark); title('the waterMark picked out'); figure subplot(1,2,1); imshow(jpg70Image); title('compress for jpeg 70%'); pickedMark=getTheWaterMark(jpg70Image,numOfBlock,markSize); pickedMark=iArnold(pickedMark,Ln); subplot(1,2,2); imshow(pickedMark); title('watermark from 70% jpeg'); figure subplot(1,2,1); imshow(jpg50Image); title('compress for jpeg 50%'); pickedMark=getTheWaterMark(jpg50Image,numOfBlock,markSize); PSNR_jpeg=psnr(changedMark,pickedMark,64,64) NC_jpeg=matrix_nc(changedMark,pickedMark) pickedMark=iArnold(pickedMark,Ln); subplot(1,2,2); imshow(pickedMark); title('watermark from 50% jpeg'); 武汉理工大学《信息处理课群综合训练与设计》 figure subplot(1,2,1); imshow(rotateImage); title('rotate 2'); pickedMark=getTheWaterMark(rotateImage,numOfBlock,markSize); PSNR_rot=psnr(changedMark,pickedMark,64,64) NC_rot=matrix_nc(changedMark,pickedMark) pickedMark=iArnold(pickedMark,Ln); subplot(1,2,2); imshow(pickedMark); title('watermark from rotated 2'); figure subplot(1,2,1); imshow(rotateImage1); title('rotate 10'); pickedMark=getTheWaterMark(rotateImage1,numOfBlock,markSize); pickedMark=iArnold(pickedMark,Ln); subplot(1,2,2); imshow(pickedMark); title('watermark from rotated 10'); figure subplot(1,2,1); imshow(noiseImage); title('add gauss noise'); pickedMark=getTheWaterMark(noiseImage,numOfBlock,markSize); PSNR_noi=psnr(changedMark,pickedMark,64,64) NC_noi=matrix_nc(changedMark,pickedMark) pickedMark=iArnold(pickedMark,Ln); subplot(1,2,2); imshow(pickedMark); title('watermark from gauss noise'); figure subplot(1,2,1); imshow(noiseImage1); title('add salt noise'); pickedMark=getTheWaterMark(noiseImage1,numOfBlock,markSize); pickedMark=iArnold(pickedMark,Ln); subplot(1,2,2); imshow(pickedMark); title('watermark from salt noise'); 武汉理工大学《信息处理课群综合训练与设计》 figure subplot(1,2,1); imshow(resizeImage); title('2 times larger'); resizeImage=imresize(resizeImage,[256,256],'bicubic'); pickedMark=getTheWaterMark(resizeImage,numOfBlock,markSize); PSNR_res_u=psnr(changedMark,pickedMark,64,64) NC_res_u=matrix_nc(changedMark,pickedMark) pickedMark=iArnold(pickedMark,Ln); subplot(1,2,2); imshow(pickedMark); title('watermark from resize'); figure subplot(1,2,1); imshow(resizeImage05); title('2 times smaller'); resizeImage05=imresize(resizeImage05,[256,256],'bicubic'); pickedMark=getTheWaterMark(resizeImage05,numOfBlock,markSize); PSNR_res_d=psnr(changedMark,pickedMark,64,64) NC_res_d=matrix_nc(changedMark,pickedMark) pickedMark=iArnold(pickedMark,Ln); subplot(1,2,2); imshow(pickedMark); title('watermark from resize'); figure subplot(1,2,1); imshow(thirdFourImage); title('cut to 3/4'); pickedMark=getTheWaterMark(thirdFourImage,numOfBlock,markSize); PSNR_cut=psnr(changedMark,pickedMark,64,64) NC_cut=matrix_nc(changedMark,pickedMark) pickedMark=iArnold(pickedMark,Ln); subplot(1,2,2); imshow(pickedMark); title('watermark from 3/4 cut'); figure subplot(1,2,1); imshow(cutImage); title('cut to 1/2'); pickedMark=getTheWaterMark(cutImage,numOfBlock,markSize); 武汉理工大学《信息处理课群综合训练与设计》 pickedMark=iArnold(pickedMark,Ln); subplot(1,2,2); imshow(pickedMark); title('watermark from 1/2 cut'); getTheWaterMark.m function [pickedMark]=getTheWaterMark(newImage,numOfBlock,markSize) fun=@dct2; metrix=[1 1;1 2]; dctImage=blkproc(newImage,[8 8],fun); for i=1:numOfBlock for j=1:numOfBlock if(dctImage((i-1)*8+2,(j-1)*8+6)>(dctImage((i-1)*8+1,(j-1)*8+6)+dctImage((i-1)*8+2,(j-1)*8+5)+dctImage((i-1)*8+2,(j-1)*8+7)+dctImage((i-1)*8+3,(j-1)*8+6))/4) waterMark((i-1)*2+1,(j-1)*2+1)=1; else waterMark((i-1)*2+1,(j-1)*2+1)=0; end if(dctImage((i-1)*8+4,(j-1)*8+5)>(dctImage((i-1)*8+3,(j-1)*8+5)+dctImage((i-1)*8+5,(j-1)*8+5)+dctImage((i-1)*8+4,(j-1)*8+4)+dctImage((i-1)*8+4,(j-1)*8+6))/4) waterMark((i-1)*2+1,(j-1)*2+2)=1; else waterMark((i-1)*2+1,(j-1)*2+2)=0; end if(dctImage((i-1)*8+6,(j-1)*8+4)>(dctImage((i-1)*8+5,(j-1)*8+4)+dctImage((i-1)*8+7,(j-1)*8+4)+dctImage((i-1)*8+6,(j-1)*8+3)+dctImage((i-1)*8+6,(j-1)*8+5))/4) waterMark((i-1)*2+2,(j-1)*2+1)=1; else waterMark((i-1)*2+2,(j-1)*2+1)=0; end if(dctImage((i-1)*8+7,(j-1)*8+2)>(dctImage((i-1)*8+6,(j-1)*8+2)+dctImage((i-1)*8+8,(j-1)*8+2)+dctImage((i-1)*8+7,(j-1)*8+1)+dctImage((i-1)*8+7,(j-1)*8+3))/4) waterMark((i-1)*2+2,(j-1)*2+2)=1; else waterMark((i-1)*2+2,(j-1)*2+2)=0; end end end pickedMark=waterMark;

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 10 金币 [ 分享文档获得金币 ] 5 人已下载

下载文档