首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

数字图像水印的FPGA软硬件实现

数字图像水印的FPGA软硬件实现

1. 系统设计
1.1背景介绍
当今世界,随着信息技术的不断更新和发展,各种传统的出版物,不论是文本、音乐、视频还是图片都使用了网络这一媒介,通过数字化和网络化,来扩展这类产品的传播范围,加快传播的速度。在网络和多媒体日新月异的同时,盗版问题日渐突出,极大的伤害了版权所有者的利益。现有的一些先进技术已用于防止非法盗版,例如密码技术,但仅靠密码技术并不能完全解决这一问题,因为加密仅能在数据的传输过程中对数据进行保护,一旦数据被接收并进行解密后,产品将不再受到保护。为了解决这一难题,近几年国际上提出了一种新的有效的数字信息产品版权保护和数据安全维护的技术-------数字水印技术。

1.2 方案提出
按照水印载体类型的不同,数字水印可分为:图像水印、视频水印和音频水印。图像水印是水印研究领域中成果最丰富、最成熟,应用最广泛,也是最直观的分支。因此,研究数字图像水印的算法是有意义的,再结合FPGA的硬件资源,充分发挥数字处理能力,实现水印过程,这应该是水印的一种新的尝试。

具体到方案:基本的算法上,我们采用基于DCT(离散余弦变换)域的水印算法。它是一种基于频域的图像水印,它的嵌入效果好,人眼几乎无法直觉与原始图像间的差别。它嵌入的内容可以有效抵抗JPEG等有损压缩编码的破坏,鲁棒性较好。而且该算法还可以嵌入灰度图像,及在一幅载体图像中嵌入多幅秘密图像。实验中我们选取的载体是一幅Bmp格式的灰度图片,水印是一幅Bmp格式的灰度图片。算法思想是首先将载体图像划分成8*8矩阵形式的小块,对每块做二维的DCT变换,然后对中频系数进行修改,嵌入水印图像的像素值,再做二维的DCT逆变换,得到嵌入水印后的图像,并与原始图像进行比对,判断图像的改变情况。选择将信息嵌在中频系数上,是因为图像的大部分能量位于直流分量和低频系数上,若对他们进行修改会影响图像的视觉效果;高频系数值很小,去掉它们基本不引起察觉。水印的提取则是这个的逆过程,对含有水印的图像划分成块,进行DCT变换,在中频系数上提取出嵌入的信息,最后组合成一幅灰度图像,检测嵌入的效果。

结合到硬件上,因为算法的关键是DCT变换和IDCT变换,并且计算量较大,因此我们的重点放在了DCT和IDCT模块上。用VHDL语言描述了两个功能模块,用于实现8*8矩阵的DCT变换和IDCT变换。将它们作为Co-Processor,并挂在FSL上,和MicroBlaze间进行通信。整个流程为:将载体图像信息和水印图像信息读入板子的内存中,调用两个功能模块实现水印嵌入过程,得到含有水印的图像,将其显示到PC机上。随后,将含有水印的图像读入板子,调用模块提取出水印,并将其显示到PC机上,并与原始水印图像进行对比,判断整个过程的最终实现效果。

2. 实现方案
2.1水印算法(引用)
算法基本思想是基于图像的离散余弦变换域算法[1][4][5][6],设原始水印图像为mark,载体水印图片为Ca,嵌入水印后的图片为Ca_emb,提取出的水印为mark_dec则算法流程为:

嵌入过程
(1)先用两个密钥key1,key2对水印图像像素矩阵的行、列进行随机置换,以得到没有任何视觉效果的图像mark_c。因为密钥是嵌入者所私有的,这样即使水印被非法提取,也能保证不能得到任何有效的信息。即:

mark_c[i,j]=mark[k1(i),k2(j)]



(2)对载体水印图片做基于8×8块的DCT变换

Ca_dct=dct(Ca)



(3)在每个块的中频系数上嵌入一个像素值的信息,其中h应根据水印情况适当的选择

Ca_dct_block[4,4]=h*mark_c[i,j]



(4)进行IDCT变换,得到嵌入水印的图片

Ca_emb=idct(Ca_dct)





提取水印过程
(1)将含有水印的图片进行DCT变换

Ca_d=dct(Ca_emb)



(2)在每块的中频系数上提取出水印信息,组合得到初步水印图mark_c_dec

mark_c_dec[i,j]=Ca_d_block[4,4]/h



(3)用私有密钥对key1,key2对初步水印图进行调整,以恢复原始水印图

mark_dct[i,j]=mark_c_dec[k1’(i),k2’(j)]



创新性思路: 现在水印产品中存在着一个混淆攻击的问题,即同时存在伪水印、伪源数据、伪水印化数据和真实水印、真实源数据、真实水印化数据。要解决作品正确的所有权,必须在一个数据载体的几个水印中判断出具有真正主权的水印。一种可行的对策是采用时间戳技术,时间戮由可信的第三方提供,可以正确判断谁第一个为载体数据加入了水印。由于时间的限制,我们在硬件中没有实现这个思路,以后有时间我们可以加入这一部分,使水印更加完善。

2.2离散余弦变换/反变换
2.2.1 快速算法
离散余弦变换/反变换(Discrete/Inverse Discrete Cosine Transform)是与傅里叶变换相关的一种变换,它类似于离散傅立叶变换(Discrete Fourier Transform),但是只使用实数。离散余弦变换相当于一个长度大概是它两倍的离散傅里叶变换,这个离散傅里叶变换是对一个实偶函数进行的, 由于基于DCT/IDCT的水印技术中要使用到这两种变换[1][2][3],但是这两种变换的计算复杂度较高,使用硬件来处理DCT/IDCT可以大大的减少处理时间。

二维 NxN的DCT/IDCT变化定义如图1所示:


图1



由于二维DCT/IDCT的正交可分解性,可以把一个二维变换分解成两个一维变换来处理,对于DCT变换,即将NxN的数据按行或列方向进行N个一维DCTT计算中间矩阵,然后再对中间结果按列或行的方向进行第二轮DCT计算,最后得到二维DCT矩阵。IDCT的算法结构与DCT相同,只是用相反的顺序计算,输出变成输入。普遍采用的一种DCT变换是把图像分成8x8的小型矩阵结构,再对这个小矩阵作DCT变换。对于8x8的DCT变换的每个一维变换,按照行的顺序,每次读入一列数据,即8个点的值,然后与对应的8个系数向量做内积运算,可以得到8个值,这样8行数据做完之后便完成了一轮的DCT变换。

对于一个8x8的矩阵,按照行的顺序处理数据,若某一行的数据为向量:

f=[f(i,0),f(i,1), f(i,2), f(i,3) ,f(i,4), f(i,5), f(i,6), f(i,7)]

经过变换之后的向量为:

D=[D(i,0), D(i,1), D(i,2), D(i,3) ,D(i,4), D(i,5), D(i,6), D(i,7)]

那么对应的数学变换形式如图2:

D=f


                           图2

仔细分析右边的矩阵,可以发现右边矩阵中总共用到了16个系数,



矩阵经过化简之后得到表2:

  x
y

0

1

2

3

4

5

6

7
0
C0
C1
C2
C3
C4
C5
C6
C7
1
C0
C3
C6
-C7
-C4
-C1
-C2
-C5
2
C0
C5
-C6
-C1
-C4
C7
C2
C3
3
C0
C7
-C2
-C5
C4
C3
-C6
-C1
4
C0
-C7
-C2
C5
C4
-C3
-C6
C1
5
C0
-C5
-C6
C1
-C4
-C7
C2
-C3
6
C0
-C3
C6
C7
-C4
C1
-C2
C5
7
C0
-C1
C2
-C3
C4
-C5
C6
-C7

                            表2

上面表格中呈现的计算系数有一个特点:对于0,2,4,6四列的8个系数,其中0个系数和第7个系数相同,第1个系数和第6个系数相同,其中2个系数和第5个系数相同,第3个系数和第4个系数相同;而第1,3,5,7这四列系数对应位置上的数字则互为相反数。因此利用这个特点可以进行提公因式的操作。即:
返回列表