资源描述
基于离散小波变换的图像数字水印技术
摘 要
本文提出一种新的基于人类视觉特性的变换域数字水印方案——基于离散小波变换的图像数字水印。所嵌入的水印是一幅8比特的图像,利用图像的多分辨率分解技术,相同分辨率层次的数字水印嵌入到对应的相同分辨率层次的原始静态图像之中,使水印对原始图像具有自适应性。水印图像经过插值运算分别得到高、中、低频信息,分别对三部分进行置乱处理和位分解操作,将得到的位平面分别嵌入到原始图像三层小波变换后的相对应分辨率层。
实验证明,该算法具有更好的透明性,嵌入的信息量和可感知性也是传统水印无法比拟的。
关键字:数字水印;离散小波变换;置乱处理;位分解
Research on Image Digital Watermarking Technique Based on Discrete Wavelet Transform
Abstract
Based on the characteristics of the human visual system (HVS) and image frequency domain, a new image digital watermarking approach is proposed in this paper. The imbedded watermark is a grey level picture. Utilizing multi-resolution ratio of image decomposed technology, we can imbed digital watermark in the primitive static picture of the same resolution ratio level so that the watermark is adapted to primitive image itself. After the operation of watermark picture inserted value, it will get three kinds of different frequency information(high、hit、 low). Then dealing with three parts separately with Arnold algorithm and decomposing them, we can get eight bit-levels and then imbed them into the primitive picture which switched by discrete wavelet transform (DWT) three times.
The experiments prove that this algorithm is better than the traditional watermarking in transparency, the amount of information imbedded and intangible.
Key Words: Digital Watermarking; Discrete Wavelet Transform; Deal with arbitrarily; Decompose in the location
目 录
1 引言 1
1.1 数字水印技术概述 1
1.1.1 数字水印研究意义 1
1.1.2 国内外研究现状 1
1.1.3 当前研究存在的问题 2
1.2 研究内容 2
2 基于离散小波变换(DWT)的图像数字水印技术 3
2.1 离散小波变换简述 3
2.2 图像数字水印的嵌入算法 4
2.2.1 水印信息的选取 4
2.2.2 水印信息的生成 4
2.2.3 原始图像小波变换 6
2.2.4 水印的嵌入 7
2.3 水印的检测与提取算法 9
3 程序实现 11
3.1 BMP图像格式分析 11
3.2 系统分析 11
3.2.1 嵌入子系统 11
3.2.2 检测及提取子系统 12
3.3 程序流程图 12
3.4 主要函数说明 12
3.4.1 水印嵌入及提取函数 12
3.4.2 小波变换函数 15
3.4.3 水印置乱变换函数 17
3.5 系统界面设计 20
4 基于离散小波变换(DWT)数字水印性能分析 21
4.1 图像水印的稳健性攻击 21
4.2 水印攻击实例 22
4.2.1 添加噪声处理 22
4.2.2 图像切割攻击 22
4.2.3 亮度增强 23
5 结论 23
致谢: 26
参考文献: 27
附录: 28
附录A——外文翻译译文: 28
1 引言
1.1 数字水印技术概述
数字水印(Digital Watermark)技术是指用信号处理的方法在数字化的多媒体数据中嵌入隐蔽的标记,这种标记通常是不可见的,只有通过专用的检测器或阅读器才能提取。数字水印是信息隐藏技术的一个重要研究方向,也是新近提出的一种版权保护手段。它可以标识和验证出数字化图像、视频和音频记录的作者、所有者、发行者或授权消费者的信息,还可追溯数字产品的非法分发,是目前进行数字作品版权保护的一种较为有效的技术手段。
1.1.1 数字水印研究意义
信息媒体的数字化为信息的存储提供了极大的便利,同时也显著提高了信息表达的效率与准确度。特别是随着计算机网络通信技术的发展,人们借助于计算机,数字扫描仪,打印机等设备可以方便,迅捷的将数字信息传达到世界各地。随之而来的副作用却是通过网络传输的数据文件或作品,使有恶意的个人或团体在没有得到作品所有者的许可下拷贝和传播有版权的内容,因此在网络环境中实施有效的版权保护和信息安全手段成为一个迫在眉睫的现实问题。近几年发展的数字水印为版权保护和信息安全等问题提供了一个潜在的解决方案,因而引起了国际学术界,工业界和政府有关部门的广泛关注。
1.1.2 国内外研究现状
从公开发表的文献看,国际上在数字水印方面的研究刚开始不久,但由于有大公司的介入和美国军方及财政部的支持,该技术研究的发展速度非常快。1998年以来,《IEEE图像处理》、《IEEE会报》、《IEEE通信选题》、《IEEE 消费电子学》等许多国际重要期刊都组织了数字水印的技术专刊或专题新闻报道。
在美国,以麻省理工学院媒体实验室为代表的一批研究机构和企业已经申请了数字水印方面的专利。1998年,美国政府报告中出现了第一份有关图像数据隐藏的AD报告。目前,已支持或开展数字水印研究的机构既有政府部门,也有大学和知名企业,它们包括美国财政部、美国版权工作组、美国空军研究院、美国陆军研究实验室、德国国家信息技术研究中心、日本NTT信息与通信系统研究中心、麻省理工学院、伊利诺斯大学、明尼苏达大学、剑桥大学、瑞士洛桑联邦工学院、西班牙Vigo 大学、IBM公司Watson研究中心、微软公司剑桥研究院、朗讯公司贝尔实验室、CA公司、Sony公司、NEC研究所以及荷兰菲利浦公司等。
1996年5月30日~6月1日,在英国剑桥牛顿研究所召开了第一届国际信息隐藏学术研讨会,至今已举办了三届。SPIE和IEEE的一些重要国际会议也开辟了相关的专题。
我国学术界对数字水印技术的反应也非常快,已经有相当一批有实力的科研机构投入到这一领域的研究中来。为了促进数字水印及其他信息隐藏技术的研究和应用,1999年12月,我国信息安全领域的何德全院士、周仲义院士、蔡吉人院士与有关应用研究单位联合发起召开了我国第一届信息隐藏学术研讨会。2000年1 月,由国家“863”智能机专家组和中科院自动化所模式识别国家重点实验室组织召开了数字水印学术研讨会,来自国家自然科学基金委员会、国家信息安全测评认证中心、中国科学院、北京邮电大学、国防科技大学、清华大学、北方工业大学、上海交通大学、天津大学、中国科技大学、北京大学、北京理工大学、中山大学、北京电子技术应用研究所等单位的专家学者和研究人员深入讨论了数字水印的关键技术,报告了各自的研究成果。从这次会议反应的情况上看,我国相关学术领域的研究与世界水平相差不远,而且有自己独特的研究思路。
目前,已支持或开展数字水印研究的机构既有政府部门,也有大学和知名企业,它们包括美国财政部、美国版权工作组、美国空军研究院、美国陆军研究实验室、德国国家信息技术研究中心、日本NTT信息与通信系统研究中心、麻省理工学院、伊利诺斯大学、明尼苏达大学、剑桥大学、瑞士洛桑联邦工学院、西班牙 Vigo大学、IBM公司Watson研究中心、微软公司剑桥研究院、朗讯公司贝尔实验室、 CA公司、Sony公司、NEC研究所以及荷兰菲利浦公司等。
1.1.3 当前研究存在的问题
目前对数字水印技术的热情很高,从1994年开始,国际学术界陆续发表有关数字水印的文章,且文章数量呈快速增长趋势。几个有影响的国际会议(如IEEE ICIP,IEEE ICISSP,ACM Multimedia等)以及一些国际权威杂志(如Proceedings of IEEE Signal Processing,IEEE Journal of Selected Areas on Communication,Communications of ACM等)相继出版了数字水印的专辑。工业界则大幅度提高了对水印技术的研究资助。国际标准组织也对数字水印技术深感兴趣,例如数字视频压缩标准MPEG-4(ISO/IEC 14496),提供了一个框架允许结合简单的加密方法和数字水印嵌入。DVD工业标准将利用水印技术提供复制控制和复制保护机制,如“复制一次”或者“不允许复制”等等。
作为国际学术界兴起的一个新的前沿研究领域,数字水印与信息安全,信息隐藏,数据加密等均有密切的关系。目前水印技术仍是一个需要深入研究的新领域,当前的研究还存在以下问题:
1)将水印技术应用于所有权的证明问题还没有完全得到解决;
2)确定水印系统的算法鲁棒性,嵌入的信息量以及不可觉察性之间的平衡点仍是一个难题;
3)如何将数字水印与现行的国际图像及视频压缩标准相结合以及如何将水印应用于DVD工业标准还有大量工作要做;
4)声频和视频水印的解决方案还不够完善,在对视频应用中大数据量和几乎实时的特性考虑不充分。
1.2 研究内容
本人毕业设计主要内容是自主开发一个解决数字图像产品所有权的数字水印系统,要求在受保护的载体图像中嵌入另外一幅数字图像,该图像不再是传统水印所采用的二值序列或二值图像。另外,要求嵌入的水印具有较好的透明性和稳健性,嵌入的水印信息量较当前的水印算法有很大的改进。
针对当前提出的水印算法在可嵌入的水印信息量和稳健性方面的不足,经过查阅相关资料和对当前出现的水印算法的分析,本文提出一种新的基于人类视觉特性的变换域数字水印方案——基于离散小波变换的图像数字水印。所嵌入的水印是一幅8比特的图像,利用图像的多分辨率分解技术,相同分辨率层次的数字水印嵌入到对应的相同分辨率层次的原始静态图像之中,使水印对原始图像具有自适应性。水印图像经过插值运算分别得到高、中、低频信息,分别对三部分进行置乱处理和位分解操作,将得到的位平面分别嵌入到原始图像三层小波变换后的相对应分辨率层。
实验证明,该算法具有更好的透明性,嵌入的信息量和可感知性等也是传统水印无法比拟的。
2 基于离散小波变换(DWT)的图像数字水印技术
根据数字水印嵌入技术的不同可以将其分为时空域数字水印和变换域数字水印。时空域水印技术就是指将水印信息嵌入数字作品的时间域或空间域中,如对于一幅图像作品,可以将版权信息嵌入图像的空间中,即对像素值进行变换加以隐藏信息。变换域数字水印技术是将水印信息嵌入到数字作品的某一变换域中。比较常见的变换技术有离散傅立叶变换、离散余弦变换(DCT)、哈达马变换、KL变换、小波变换以及分形变换等。目前国际上比较常用的是离散余弦变换(DCT)和离散小波变换(DWT)。本文研究的数字水印技术是基于离散小波变换的。
2.1 离散小波变换简述
离散小波变换是将一幅图像分解为大小、位置和方向都不同的分量。一个图像做小波分解后,可得到一系列不同分辨率的子图像。小波变换能更有效地从图像中提取出信息,并且可通过缩放、平移等对图像进行多尺度细化分析处理,最终达到高频部分的空间细分、低频部分的频率细分,从而实现对图像的自适应的分析。
一幅N×N的图像,其中下标指示尺度并且N是2的幂对于j=0,原图像的尺度为2j=20=1。j的值每一次增大都使尺度加倍,分辨率减半。每一次通过隔行隔列采样,图像被分解为4个大小为原来尺寸四分之一的子频带区域。离散小波变换过程可描述为,在第一层,先用尺度函数和分别于图像的每行做积分并丢弃奇数列。接着,这个阵列的每列再和与相卷积,丢弃奇数行。其结果就是该层变换所要求的四个的数组。同理,当对图像作二层小波变换时,其变换区域为第一层得到的区域,方法与第一层相同,离散小波变换过程图如图2-1所示:
行
列
列
行
h0(-x)
h1(-x)
h0(-x)
h1(-x)
h0(-x)
h1(-x)
图2-1 离散小波变换过程图
2.2 图像数字水印的嵌入算法
2.2.1 水印信息的选取
在最初出现的数字水印研究中,水印大多采用随机序列,称为无意义水印信号,它们在嵌入算法中被直接使用,进而加入到载体数据中。随着研究的进一步深入,当前大多数水印一般采用有意义的信号,即信号是代表一定意义的文本、声音、图像或视频信号,使用有意义水印的一个显著特点是在水印提取后,提取的水印非常直观,不需要在利用原始的水印信号进行相关性计算,可以直接使用它对载体中是否含有水印进行判别。
本文水印采用的是一幅(128×128)8比特BMP格式的华东交通大学校徽图像,对水印的处理过程描述如下,首先运用离散小波变换和插值运算对水印作多分辨率分解,再将得到的不同分辨率层水印信息进行Arnold[1]置乱处理,通过对水印图像数据做一些“扰乱”处理,得到一幅杂乱无章、面目全非的图像,那么即使非法获得水印数据,也无法将它复原。最后对置乱后的水印不同分辨率层进行位分解操所,将得到的位平面信息最为最后要嵌入到原始图像的水印信息。
2.2.2 水印信息的生成
1. 插值运算
本小节用实例简单介绍一下二次线性插值算法。假设我们有一个很简单的图片,图像只有4个像素(2×2),那么对它进行线性插值运算就可描述如下:
A
B
C
D
现在我们要把这个图像插值到9个像素:(3×3)
A
ab
B
ac
abcd
bd
C
cd
D
其中大写的字母代表原来的像素,小写字母代表插值得到的新像素。则ab、ac、cd、bd和abcd 的值可按以下公式(2-1)得到:
(2-1)
先从一个方向把只涉及两个原始像素的新像素算出来。我们这里假定先计算水平方向,而在算垂直方向的插值的时候,因为ab和cd已经在前面算好了,所以abcd的计算也和计算ac和bd没有任何区别了。
在水印图像插值运算中我们是要将N×N图像插值得到2N×2N的图像,那么将上述算法推广,就可得到N×N图像到2N×2N图像的算法描述:
A
ab1
ab2
B
ac1
abcd1
abcd2
bd1
ac2
abcd3
abcd4
bd2
C
cd1
cd2
D
以A和B为例,先求出原始像素的差(A-B)再算出每一步的递增量(A-B)/ 3,再计算出含有原始图像像素值的行和列上的插值,如ab1、ab2、ac1、ac2等,然后再计算abcd1、abcd2、abcd3、abcd4的值。每一个新的点的值就是将前面那个点的值加上递增量就可以了。这里设增量为,则可用公式(2-2)完成插值运算。
(2-2)
2. 水印图像多分辨率分解
在这里,我们将水印图像记为G0。为了使嵌入的水印满足不可见性,水印信息应适应于原始图像。为此,利用分辨率缩减方法,把水印G0分解为多分辨率金字塔式层次结构[ 2, 3 ]。分解方法如图2-2所示,分解后的三层灰度级图像分别记为L0(包含G0的高频信息)、L1(包含G0的中频信息)和G2(包含G0的低频信息)。图中,G0(128×128)为原始水印图像,G1(64×64)为G0(128×128)作一层离散小波变换后得到的低频信息,G2(32×32)为G0(128×128)作两层离散小波变换后得到的低频信息。G1′(128×128)由G1(64×64)作插值运算得到的(含G0的低频信息),G2′(64×64)是由G2(32×32)
图2-2 水印图像多分辨率分解图
作插值运算得到的(含G1的低频信息),L0(128×128)是由G0与G1′ 作差值运算得到的,L1(64×64)是由G1与G2′ 作差值运算得到的。水印G0可以由其分解后的三层灰度级图像L0、L1和G2重建。
3. Arnold置乱算法
数字图像可看成是二维数组,对于正方形的数字图像,其Arnold正变换可用公式(2-3)描述:
(2-3)
其中,是原图像的象素点,是变换后新图像的象素点,N是阶数,即图像的大小。
根据Arnold正变换公式,孔涛、张亶[ 1]提出了一种新的Arnold反变换算法。该算法在推导Arnold反变换过程中假设了两个变量p、q∈Z(Z属于整数),结合图像像素坐标的取值范围,分析变量p、q的可能取值,对不同p、q的值分别导出方程组,再对方程组求解,得到满足像素坐标值范围的解即为Arnold反变换的解。
2.2.3 原始图像小波变换
为了使嵌入的水印对有损压缩(JPEG)具备一定的稳健性,在水印的嵌入过程中,把原始图像通过
LL3
LH3
LH2
LH1
HL3
HH3
HL2
HH2
HL1
HH1
二维离散小波变换(DWT)分解为三层多分辨率金字塔结构,如图2-3所示。其中,多分辨率分解的第三层中,最低频子带LL3包含了原始图像的最低分辨率信息,而HL3、LH3和HH3是LL3的精细图像信息,第三层中HL3、LH3和LL3图像包含了第二层参考图像(HL2、LH2和HH2)的粗糙信息,而第二层中的图像(HL2、LH2和HH2)又包含了第一层参考图像(HL1、LH1和HH1)的粗糙信息。本文采用(512×512)的灰度级BMP格式的Lenna 图像作为载体图像,记为f (x, y)。
1. 小波行变换实现
图2-3 原始图像3层小波变化图
小波行变换[4]的方法是先将图像的偶数列存储在图像缓存的左半部分,将图像的奇数列存储在图像右半部分,其结果是
原图像被平分成左右两部分。然后采用差分的方法对变换后的图像进行运算,即用奇数列依次减去它前面的偶数列。我们都知道,图像的像素值范围为:0≤f (x, y)≤255,为了避免差分结果为负值,本文采
(2-4)
用公式(2-4)对差分结果进行调整,结果存入图像缓存的右半部分。行变换结果如图2-4左所示。
图2-4 原始图像行变换(左)和列变换(右)效果图
2. 小波列变换实现
小波列变换[4]的方法是先将图像的偶数行存在图像缓存的下半部分,将图像的奇数行存在图像缓存的上半部分,将原始图像分成上下两部分。采用差分的方法,用奇数行依次减去它前面的偶数行,再将差分结果用公式(2-4)进行调整,结果存入图像缓存的上半部分。列变换结果如图2-4右所示。
原图像三层离散小波变换如图(2-6)b 所示。
(a)原图像 (b)三层小波变换
图2-5 图像的三层小波变换
3. 小波逆变换
逆小波变换刚好与小波变换过程相反,即先进行列变换,将上半部分行的值加上下半部分行的值,采用公式(2-5)对结果进行调整,结果存储到图像的上半部分。完成后将上半部分作为奇数行,下半部分作为偶数行,按行号进行调整。再进行行变换,将右半部分列的值加上左半部分列的值,结果用公式(2-5)进行调整,并存储到图像的右半部分。右半部分作为奇数列,左半部分作为偶数列,按列号进行调整。这样对图像进行三次逆小波变换,第一次变换区域为原图像的1/16,第二次为1/4,第三次变换完成后就能够得到原始图像。
(2-5)
2.2.4 水印的嵌入
1. 对水印多分辨率层进行置乱处理
为了增强水印的稳健性,采用Arnold变换算法及其逆变换算法,对经多分辨率分解后的水印层进行置乱运算,将图像转换成一幅杂乱无章的图像。置乱次数有用户选定,作为水印嵌入和提取的密钥,这样在非法获得者获得水印数据后,也必须有用户选定的密钥才能恢复水印,否则得到的只是一些无用的数据。
这里我们假设对水印作8次的置乱处理,那么水印多分辨率层G2、L1和L0的置乱结果如图2-6所示:
(a) (a′) (b) (b′) (c) (c′)
图2-6 水印多分辨率层8次置乱
其中(a)为L0层,(a′)为8次Arnold置乱图,(b)为L1层,(c)为G2层。
2. 对置乱后水印分辨率层进行位分解
对一幅大小为M×N、灰度级为2L的图像X,Xp (m,n)是图像的一个像素值。其中0≤m≤M-1,0≤n≤N-1。位分解算法描述如下:
(2-6)
其中表示位分解算子,,对的重构公式为:
(2-7)
对一幅2×2的8bit灰度级图像的分解如图2-7所示,其中b7是最高有效位,b0是最低有效位。
12
10
89
4
原始图像
0
0
0
0
0
0
1
0
0
0
0
0
0
0
1
0
b7
b6
b5
b4
1
1
1
0
1
0
0
1
0
1
0
0
0
0
1
0
b3
b2
b1
b0
图2-7 一个8bit图像位分解图
采用上述位分解算法,对步骤一中水印多分辨率层G2、L1和L0经置乱处理的结果进行位分解操作,将得到的位平面作为水印信息。
3. 水印嵌入
如前所述,为了增强嵌入的水印信息的稳健性和不可见性,可以利用图像的多分辨率分解技术,将相同分辨率层次的数字水印嵌入到对应的相同分辨率层次的原始静态图像之中,使水印对原始图像具有自适应性。为此,G2的8个位平面(包含G0的低频信息)作为水印的掩码信息嵌入到原图像的HL3和LH3层中,而L1的8个位平面(包含G0的中频信息)作为水印的掩码信息嵌入到原图像的HL2和LH2层中,而L0的8个位平面(包含G0的高频信息)作为水印的掩码信息嵌入到原图像的HL1和LH1层中。由于G2(32×32)是HL3(64×64)的四分之一,所以G2的8个位平面可以嵌入到HL3和LH3中,前四个位平面嵌入到HL3中,后四个位平面嵌入到LH3中。同样,L1和L0的8个位平面也以相同的方法嵌入。水印处理过程及嵌入位置如图2-8所示,嵌入过程如图2-9所示。
图2-8 水印嵌入过程
设水印位平面信息存储在缓存W,则利用公式(2-8)改变原始图像像素值,得到嵌有水印信息的图像数据。
(2-8)
其中x, y为图像像素坐标,f (x, y)为载体图像像素值,w (x, y)为水印位平面值。
4. 获取嵌有水印图像
对第三步中得到的嵌有水印位平面信息的图像数据进行逆3层逆离散小波变换,其算法过程如2.2.3小节中所述,就可以得到嵌有水印的图像。
密钥
水印信息
水印嵌入算法
掩体对象
隐藏对象
图2-9水印嵌入框图
2.3 水印的检测与提取算法
本文所提出的数字水印算法仍属于不完全算法,水印的检测和提取过程仍需原始图像的参与。水印提取过程描述如下:
(1) 根据2.2.3小节所介绍的小波变换方法,将嵌有水印的图像进行3层小波变换,得到带水印图像的多分辨率分解图;
(2) 打开原始载体图像,对其进行3层小波变换;
(3) 由图2-3所示的图像多分辨率分解图,将带水印图像3层小波变换后的图像值与原始图像3层小波变换图像值作比较,设带水印图像存储在缓存fw中,则G2、L1和L0位平面信息根据公式(2-9)得到:
(2-9)
G2的8个位平面是由带水印图像与原始图像的HL3和LH3块相比较,L1的8个位平面是由
(a) (b) (a′) (b′)
图2-10 基于离散小波变换的数字水印
HL2和LH2块相比较得到,同理,L0的8个位平面是由HL1和LH1项比较得到;
(4) 得到G2、L1和L0的位平面信息后,采用Arnold逆变换算法,分别对G2、L1和L0进行相同次数的迭代逆变换,根据公式(2-7)分别重构水印图像的低频、中频和高频信息。再根据图2-2所示的水印变换过程,将G2、L1和L0进行逆变换,最后得到嵌入的水印图像,水印提取过程如图2-11所示。
(5) 试验中,原始图像采用(512×512)8比特的BMP格式Lenna 图像,水印图像采用(128×128)8比特的华东交通大学校徽图像。如图2-10所示,(a)图为原始Lenna 图像,(a′)为嵌有水印的Lenna 图像,(b)为水印图像,(b′)为提取出的水印图像。
密 钥
原始掩体对象
隐藏对象昂
水印提取算法
水印信息i
图2-11水印提取框图
本章节提出的水印算法还有不足之处,主要表现在水印提取过程中需原始图像的参与,而这是当今数字水印技术发展所必需要避免的。因此,在水印提取过程中避免原始图像的参与,是算法今后改进的一个重要方向。
3 程序实现
水印系统分为两个子系统,水印嵌入子系统和水印提取子系统(包含水印检测)。水印嵌入子系统完成水印信息的嵌入,该部分要考虑到嵌入水印的信息量和水印的稳健性。水印提取子系统是要将图像中嵌入的水印信息提取出来,该部分含水印检测功能。系统采用VC实现。由于系统仅为本文算法实现设计,原始图像和水印图像都采用BMP格式图像。
3.1 BMP图像格式分析
对一幅BMP格式图像进行处理,要得到一些图像信息,如:图像所占字节数、文件开始到位图数据之间的偏移量、图像的高度和宽度以及像素位数。字节数、偏移量以及图像的高度和宽度都占四个字节,像素位数占两个字节,按公式(3-1)计算,其中“”为移位运算。
(3-1)
在VC实现过程中,可以通过读取BMP图像显示机构来获得这些信息,实现代码如下:
…………
LPBITMAPINFO BitmapInfo; //图像显示所必需的机构信息
BitmapInfo = (LPBITMAPINFO) new BYTE [Offset - 14]; //offset为偏移量
File.Seek(14, CFile::begin); //文件定位
File.ReadHuge(BitmapInfo, Offset - 14); //读取图像数据
…………
BMP图像格式可以在网站中找到,另外我们可以采用Ultra Edit软件打开BMP图像分析图像的头文件信息,图像像素值以16进制显示。
3.2 系统分析
3.2.1 嵌入子系统
嵌入系统含水印图像处理、原始图像变换和水印信息嵌入三个模块。
1.水印图像处理模块首先检测水印图像的格式,如果为BMP格式图像,则计算出原始图像所能嵌入的最大信息量,并判断该信息量是否大于或等于水印图像信息量(字节数),如果小于水印图像的字节数,则输出提示信息,用户重新选择水印图像。以本文采用的(512×512)8比特的Lenna图像为例,最大能嵌入的信息量为2×(64×64+128×128+256×256),即图2-3中HL3+LH3+HL2+LH2+HL1+LH1的大小,相对于离散余弦变换(DCT),能嵌入的水印信息量要大得多。如果水印信息量是满足要求的,则按2.2.2小节中的步骤处理水印图像,得到水印不同分辨率层信息。若水印图像不为BMP格式图像,输出提示信息并返回。
2.原始图像处理模块,判断原始图像是否为BMP格式图像,如果是则2.2.3小节所述的过程对原始图像进行3层离散小波变换,否则输出提示信息并返回。
3.水印嵌入模块,如果步骤a和b都完成,则执行水印嵌入操作,将步骤a得到的水印信息按2.2.4小节的过程嵌入到步骤b中原始图像3层离散小波变换后的系数中,嵌入完成后,对原始图像作3层逆离散小波变换,变换过程如2.2.3小节所述。显示嵌有水印信息的原始图像。
3.2.2 检测及提取子系统
本文提出的算法在水印检测和提取过程中,仍需原始图像的参与。打开嵌有水印信息的图像和原始图像,分别作3层离散小波变换,按公式(2-9)分别提取G2、L1和L2的位平面信息,构造水印图像的多分辨率层,重构水印图像。图像显示需头文件信息,我们通过修改原始图像的头文件信息来显示水印图像,修改方法将在3.3.2小节中介绍。
3.3 程序流程图
水印嵌入流程图,如图3-1(a)为水印处理流程图,图3-1(b)为水印嵌入流程图。
各频率层位平面信息
位分解运算
置乱后的多频率信息
置乱处理
高、中、低频水印信息
插值运算
输出提示信息
BMP图像
打开水印图像
位平面信息
否
打开原始掩体图像
结束
三层离散小波变换
水印嵌入
逆三层离散小波变换
嵌有水印的原始图像
BMP图像
开始
水印处理
否
输出提示信息
是
是
(a) (b)
图3-1 水印嵌入系统流程图
水印提取流程图,如图3-2所示,其中图a为水印提取流程图,图b为原始图像处理流程图。
3.4 主要函数说明
3.4.1 水印嵌入及提取函数
1. 水印位平面信息嵌入函数
开始
嵌有水印的原始图像
输出提示信息
BMP图像
三层离散小波变换
水印位平面信息提取
高、中、低频水印信息
逆置乱处理
插值运算
水印图像
结束
否
是
原始图像处理
打开原始掩体图像
是否为原始图像
输出提示信息
三层离散小波变换
多分辨率层原始掩体图像
否
是
(a) (b)
图3-2 水印提取系统流程图
函数功能:将水印分辨率层位平面嵌入到3层离散小波变换后的原始图像中,水印具有很好的透明性和一定的稳健性。
实现算法描述:由于水印为8bit的图像,所以对于置乱后的水印分辨率层G2、L1和L0,经位分解操作后都有8个位平面,嵌入函数首先计算出HL3(图2-3所示)中能嵌入G2位平面的个数,如果个数大于或等于8,则将位平面全部嵌入到HL3中;否则HL3和LH3中分别嵌入4位平面,在嵌入过程中需对位平面嵌入的位置作准确的计算。L1和L0位平面的嵌入算法与G2相同。
参数说明:wmHeight、wmWidth为水印图像的高和宽,picHeight、picWidth为原始图像的高和宽,PictureData存储原始图像3层小波变换后的小波系数的数据,WaterData存储水印位平面信息,picBits、wmBits分别为原始图像和水印图像的位数。
函数部分代码:
void InsertWaterBits(unsigned char *PictureData,unsigned char *WaterData,unsigned int width,unsigned int height,unsigned int w_width,unsigned int w_height,unsigned int m,unsigned int n,unsigned int time, int picBits, int wmBits)
{
……… //number为原图像能嵌入水印的块数
int number = (int)( (picWidth * picHeight) / (wmWidth * wmHeight) );
unsigned int i = 0, j = 0; //原图像块宽度能嵌入的块数
unsigned int line = (unsigned int)(time / (picWidth / wmWidth));
//time为将要嵌入的位平面序号
unsigned int position = time - line * (picWidth / wmWidth);
if(number >= 8 || time < 4)
{ // number >= 8 或 time < 4时,水印位平面都嵌入到离散小波变换后的HL块
for(i=0; i<wmHeight; i++)
{
for(j=0; j<wmWidth; j++)
{ //picHeight是原图像块的位置
PictureData[ (picHeight + (line * wmHeight) + i) * width
+ (position * wmWidth) + j] += WaterData[i * wmWidth + j];
}//for-1 //(line * wmHeight)是控制每行能嵌入的位平面数
}//for-2
}//if
else if(time >= 4)
{ //number<8时,则位平面要分别嵌入到HL和LH块,time>=4时,位平面嵌入到LH块
line = (unsigned int)((time % 4) / (picWidth / wmWidth));
展开阅读全文