新闻中心

EEPW首页>嵌入式系统>设计应用> 用于图像认证的半脆弱水印算法研究

用于图像认证的半脆弱水印算法研究

作者: 时间:2012-02-11 来源:网络 收藏


在Matlab进入市场前,国际上的许多软件包都是直接以FORTRANC语言等编程语言开发的。这种软件的缺点是使用面窄,接口简陋,程序结构不开放以及没有标准的基库,很难适应各学科的最新发展,因而很难推广。Matlab的出现,为各国科学家开发学科软件提供了新的基础。在Matlab问世不久的80年代中期,原先控制领域里的一些软件包纷纷被淘汰或在Matlab上重建。


MathWorks公司1993年推出了Matlab 4.0版,1995年推出4.2C版(for win3.X)1997年推出5.0版。1999年推出5.3版。Matlab5.X较Matlab 4.X无论是界面还是内容都有长足的进展,其帮助信息采用超文本格式和PDF格式,在Netscape 3.0或IE 4.0及以上版本,Acrobat Reader中可以方便地浏览。


时至今日,经过MathWorks公司的不断完善,Matlab已经发展成为适合多学科,多种工作平台的功能强大大大型软件。在国外,Matlab已经经受了多年考验。在欧美等高校,Matlab已经成为线性代数,自动控制理论,数理统计,数字信号处理,时间序列分析,动态系统仿真等高级课程的基本教学工具;成为攻读学位的大学生,硕士生,博士生必须掌握的基本技能。在设计研究单位和工业部门,Matlab被广泛用于科学研究和解决各种具体问题。在国内,特别是工程界,Matlab一定会盛行起来。可以说,无论你从事工程方面的哪个学科,都能在Matlab里找到合适的功能〔7〕。


第三章算法原理与总体设计


技术既可以在一定程度上容忍施加于含水印数字媒体上的常见信号处理操作(如叠加噪声、平滑滤波、有损压缩等),又能够对恶意篡改做出报警反应且具有定位篡改区域的能力,故在网络时代具有更重要的应用价值。近几年,半脆弱图像数字水印技术研究取得了很大进展,陆续提出了诸如与JPEG编解码器相结合、基于视觉掩蔽特性、基于量化系数等多种水印嵌入算法。这些半脆弱型水印算法普遍具有篡改检测较出色、虚警率较低的优点,但也不同程度存在透明性较差、对某些常规信号处理不够鲁棒、篡改区域定位不够准确等不足。


3.1 用于算法的特殊要求分析
的目的是确认作品没有受到任何改变,可用脆弱水印来实现图像认证。为了便于检测,脆弱水印对某些变换(如压缩),具有较低的健壮性,面对其他变换的健壮性更低。脆弱水印对图像的改变极其敏感,适于图像的精确认证,但对数字图像来说,少量比特的改变不会造成原作品实质上的不同,事实上有的失真(如有损压缩等)会修改作品中很多的比特,但在视觉上不会造成改变。在许多应用中,两幅图像在视觉上相似就意昧着其压缩版本是可接受的。此时,基于脆弱水印的精确认证无法实现图像认证,这促使研究人员提出能够进行选择认证的。目前大多数图像数字水印研究都集中在版权保护水印上,而对图像认证水印的研究相较少,针对这种情况,论文中提出了一种能经受JPEG压缩的半脆弱水印算法。该方法将两个水印位嵌入到图像每个8*8块的高频DCT(Discrete Cosine Transform,离散余弦变换)系数中,水印信号和嵌入的位置由DCT系数样本和密钥决定。这种水印可以从严重的JPEG压缩中保存下来,但对低通滤波和噪声等极为敏感,可用于图像的选择认证〔8〕。


3.2 实现认证功能的总体设计
所谓认证水印就是在保证数字媒体信息一定视(或听)觉质量的前提下,将与媒体内容相关或不相关的标志信息作为水印直接嵌入媒体内容中,当媒体内容需要认证时,可将水印提出鉴定其是否真实完整。认证水印除了具有数字水印的一般特征,如不可见、稳健性、安全性外,水印本身对篡改必须具有一定的敏感性和脆弱性。因此,同样在数字媒体中嵌入信息,认证水印与鲁棒水印的不同之处在于当信息内容发生改变时,认证水印信息会发生一定程度的改变。要实现对于图像的认证功能,在水印嵌入和检测上就有一些要求了。本身嵌入的水印就不能对要保护的图像在感官上有太大的改变,这就要求嵌入的水印要在较低的有效位上,嵌入的水印不能是显式的。提取出水印后,我们要把水印和嵌入的水印进行比较,以确定水印是否被篡改,最终才能认证图像。


3.2.1模块划分
本算法共分为四个部分,水印预处理,水印嵌入,水印检测,攻击检测。

图3.1 算法模块划分图
3.2.2算法框架图
认证水印系统的一般框架如图3.2,系统主体包括三部分,水印的产生,嵌入和检测认证。


认证水印系统首先将提取的宿主图像信息(特征或图像内容)或自定义信息(图像标志或序列号)转变为水印信号,通过嵌入算法将其嵌入原始图像中,得到的含水印的图像经过信道在信宿端被接收.通过检测认证算法进行认证,得到检测结果。检测认证时,要求仅仅借助待测图像,或者再加上水印信息,即可得认证结果。在实际应用中,在嵌入和检测的过程中,还需加入密钥。


图3.2 认证水印系统的一般框架图
图3.3给出一典型认证水印实现的例子。可以看出,图3.3(a)(b)无明显视觉差异。图3.3(d)能较好的定位篡改部位。

(a)原始图像 (b)嵌入水印后的图像 (c)篡改图像 (d)检测结果
图 3.3 认证水印的实现例子
而本论文的设计思想就是要实现对于图像的认证。由于其特有的性质,我的算法也有一定的特性。首先产生的水印信息是高斯伪随机码,这是因为我考虑到,在具体的一副图像中,不同的主体植入的水印信息是不同的,而我现在植入随机序列作为信息,就具有一定的普遍性了。还有,我做的是不可见水印,也就无所谓植入的信息是否有直观意义了。之后是对水印信息进行海明编码,其作用是为了防止在传输过程中的客观出错。对信息进行置乱则是加密的需要了。做完了这些准备工作后即可以植入水印信息了。我的算法采用分块DCT植入的方法,即把图像分成8*8的小块,每个都植入水印信息。最后就是对图像进行攻击测试了。我一共选用了10种常见的攻击,一一做实验,验证我算法的性能。
下面就给出这个算法的框架图。

图3.4 本程序的框图
第四章 图像认证半脆弱水印算法的详细设计与实现
在实际应用中,一个实用的数字媒体认证系统应大致满足一些基本要求。如对篡改操作与否应具备极强的判断能力;应对数字媒体内容被篡改的程度进行有效描述;在无法得知原始数字媒体内容或其它与真实信号内容相关的信息条件下,判断可能发生的篡改操作的具体类别,例如信号处理中的滤波、压缩、还是替换操作等。


4.1 算法思路
由于本算法是要实现对图像的认证功能,故在算法上有一定的特点。由于具体水印信息的不确定性,本论文加入的水印信息是个随机的噪声码,这样在水印信息上就具有一定的普遍性了。算法首先是在扩频域对水印信息进行预处理,采用的方法有海明编码,直序扩展,以达到一定的加密和抗传输错误要求。嵌入算法是在DCT域分块植入水印信息。检测算法和嵌入算法是个相逆的过程。最后把提取的水印和原水印进行相关系数比较,从而判断是否受到篡改攻击。


4.2 各步骤详细设计
模块化程序设计就是把一个复杂的程序分成若干小部分,分部来进行设计,以达到简化设计的目的。水印算法现在大都采用这种方法。论文的算法把程序分成如下三个部分:水印预处理、水印嵌入和水印检测。


4.2.1水印预处理的实现
要想得到安全的水印,在嵌入目标水印前必须要对其进行一个预处理的过程。也就是加密的过程。本算法是用海明编码和伪随机码进行置乱以隐藏加入的水印信息。如果传输的数据位是m位,加了r位冗余位,那么总共传输的数据单元是m+r位。 为了能够发现这m+r位数据单元在传输到目的端后是否出错,并能够指明是在哪一位出错,那么r至少应该能够代表m+r+1种状态。r比特能够代表2r不同状态。 因此,2r>=m+r+1 。若m=7,则满足上式的最小r值为:4。下面以一个例子来说明海明码的纠错原理。
海明码的接收端的公式:
S3= P3⊕ D4⊕D3 ⊕D2
S2= P2⊕D4 ⊕D3 ⊕D1 (4.1)
S1= P1⊕D4 ⊕D2 ⊕D1
假定海明码1010101在传送中由于偶然错误变成了1000101 ,
S3= P3⊕ D4⊕D3 ⊕D2=0⊕1⊕0 ⊕0 =1
S2= P2⊕D4 ⊕D3 ⊕D1=0⊕1⊕ 0 ⊕1=0
S1= P1⊕D4 ⊕D2 ⊕D1=1⊕1⊕ 0 ⊕1=1
因此,由S3S2S1= 101,指出第5位错,应由0变1。这样就可以纠错了。
本文的算法要求先实现海明编码,根据本论文加入的水印信息是34*4的伪随机码,所以实现海明编码后得到的是36*7的编码。
for i=1:36
s=8*x0(i,1)+4*x0(i,2)+2*x0(i,3)+x0(i,4);
switch s
case 0
x0(i,5)=0;x0(i,6)=0;x0(i,7)=0;
case 1
x0(i,5)=0;x0(i,6)=1;x0(i,7)=1;
case 2
x0(i,5)=1;x0(i,6)=1;x0(i,7)=0;
case 3
x0(i,5)=1;x0(i,6)=0;x0(i,7)=1;
case 4
x0(i,5)=1;x0(i,6)=1;x0(i,7)=1;
case 5
x0(i,5)=1;x0(i,6)=0;x0(i,7)=0;
case 6
x0(i,5)=0;x0(i,6)=0;x0(i,7)=1;
case 7
x0(i,5)=0;x0(i,6)=1;x0(i,7)=0;
case 8
x0(i,5)=1;x0(i,6)=0;x0(i,7)=1;
case 9
x0(i,5)=1;x0(i,6)=1;x0(i,7)=0;
case 10
x0(i,5)=0;x0(i,6)=1;x0(i,7)=1;
case 11
x0(i,5)=0;x0(i,6)=0;x0(i,7)=0;
case 12
x0(i,5)=0;x0(i,6)=1;x0(i,7)=0;
case 13
x0(i,5)=0;x0(i,6)=0;x0(i,7)=1;
case 14
x0(i,5)=1;x0(i,6)=0;x0(i,7)=0;
case 15
x0(i,5)=1;x0(i,6)=1;x0(i,7)=1;
end;
end;
由于本身我们嵌入的水印信息是高斯正态分布序列,本身就具有一定的无序性,再加上之后用伪码进行了置乱,很好的达到了加密的目的。为了抵抗在传输过程中的偶然错误,伪码用了海明码纠错。所以检测的时候我用相关的纠错解码技术就可再现水印信息。



评论


技术专区

关闭