作为传统加密系统的有效补充办法,从1993年Caronni正式提出数字水印到现在短短几年里,无论是在国内还是在国外对数字水印的研究都引起了人们极大的关注。但数字水印技术的发展还很不成熟,应用也处于初级阶段。在我国,知识产权问题是一个敏感的话题,只有深入开展数字水印技术的研究,尽快制定我国的版权保护水印标准,才能使我们在未来可能的国际知识产权纠纷中取得主动权。那么掌握高效的工具,便成为一个必须解决的问题。本文就针对数字水印本身的特点,介绍了一种高效的实用工具——MATLAB。
数字水印技术涉及到通信理论、编码理论、噪声理论、视听觉感知理论、扩频技术(Spread Spectrum)、信号处理(Signal Processing ) 技术、数字图像处理(Digital Image Processing)技术、多媒体(Multimedia)技术、模式识别(Pattern Reorganization)技术、算法设计(Algorithm Design)等理论,用到经典的DFT(Discrete Fourier Transform)、DCT(Discrete Cosine Transform)变换和近代最先进的数学工具----小波(Wavelet)。
数字水印又是一个横跨计算机科学、生理学、密码学、数字、数字通信等多门学科,并与Internet的发展密切相关的交叉科学。数字水印的多学科性导致数字水印技术研究的难度和复杂性。所以,针对数字水印技术本身的跨学科特点,找出一种合适的编程工具,往往可以起到事半功倍的效果。下面我们从数字水印的一般模型出发,来逐步介绍MATLAB。
数字水印的一般模型如图1所示:
嵌入过程
含水印的信号
原始信号
水印信息
图1 数字水印嵌入过程
频域法加入数字水印的原理是首先将原始信号(语音一维信号、图像二维信号)变换到频域,常用的变换一般有DWT、DCT、DFT、WP和分形。然后,对加入了水印信息的信号进行频域反变换(IDWT、IDCT、DFT、WP),得到含有水印信息的信号。
原始的信号
抽取/检测过程
待检测的信号
水印信息
抽取的水印
有/无水印
结束
图2 数字水印检测/抽取过程
频域法检测水印的原理是将原始信号与待检测信号同时进行变换域变换,比较两者的区别,进行嵌入水印的逆运算,得出水印信息。如果是可读的水印,那么就此结束,如果是不可读水印,如高斯噪声,就将得出的水印与已知水印作比较,由相关性判断,待检测信号含不含水印,故水印的检测有两个结束点。
数字水印算法一般可分为两种空域法和频域法,频域法有以下优点:1)嵌入的水印信号能量可以分布到空域的所有像素上,有利于保证水印的不可见性;2)视觉系统(HVS)的某些特性(如频率的掩蔽特性)可以更方便地结合到水印编码过程中;3)频域法可与国际数据压缩标准兼容,从而实现在压缩域(compressed domain)内的水印编码。所以我们也以频域法为主介绍MATLAB在数字水印技术中的使用。
DCT法(Discrete Cosine Transformation)
对原始信号做DCT的算法:Cox 和Piva 等人提出的DCT技术的经典之作。Cox利用随机数发生器产生标准正态序列作为水印信息对图像进行整体DCT变换后,选取除去DC系数之外部分较低频率系数叠加水印信息;Piva则修改整幅图像的中频部分。
对原始信号分块后,再作DCT的算法:Hsu和Wu 把图像进行8*8分块,将一个二进制序列作为水印放入DCT的中频区;有些学者则计算整个图像的DCT,把一个实数序列嵌入DCT的中频系数上。选择中频区的好处是一方面尽量减少嵌入信息对图像主观视觉的影响;同时,尽量避免有损压缩对水印信息可能带来的损失。
还有一种DCT方法就是把水印信息嵌入到高频系数上,但是采用这种方法,抗压缩性非常差。
DFT法(Discrete Fourier Transformation)
Swanson 等利用时域小波变换和频率掩蔽特性结合,实现多分辨率视频水印;Kundur和Hatzinakos 把水印植入灰度图像的小波变换域。
其它变换域还有Fourier-mellin 域 、Fourier 变换域、分形 或WP(Wavelet Package)等。以上的变换域算法计算量都非常大,编程实现这些变换和逆变换也需要好好下一番功夫,由此造成研究人员把大量的时间和精力浪费在与水印算法研究无关的问题上。
Matlab是当前在国内外十分流行的工程设计和系统仿真软件包。它是MathWorks公司于1982年推出的一套高性能的数值计算和可视化软件,它集数值分析、矩阵运算、信号处理和图形显示于一体,构成了一人方便的、界面友好的用户环境。
Matlab的推出得到了各个领域专家、学者的广泛关注,其强大的扩展功能为各个领域的应用提供了基础。由各个专家学者相继推出了MATLAB工具箱,其中的信号处理(signal processing)、控制系统(control system)、神经网络(neural network)、图像处理(image processing)、鲁棒控制(robust control)、非线性系统控制设计(nonlinear system control design)、系统辨识(system identification)、最优化(optimization)、模糊逻辑(fuzzy logic)、小波(wavelet)、通信(communication)、统计(statistics)等工具箱,这些工具箱给各个领域的研究和工程应用提供了有力的工具,借助于这些“巨人肩上的工具”,各个层次的研究人员可直观、方便地进行分析、计算及设计工作,从而大大地节省了时间。
用Matlab研究数字水印的优点:
集成了DCT、DWT等函数有丰富的小波函数和处理函数,这不仅方便了研究人员,而且使源程序简洁明了、易实现。
强大的数学运算功能。能够方便、高效地实现音频、视频中的大量矩阵运算。
提供了图像处理工具箱、小波分析工具箱、数字信号处理工具箱。用来编制跨数字图像处理技术、数字信号处理等多学科的数字水印技术是非常好的选择。
MATLAB与目前最强大的编程工具——Visual C++具有良好的接口。
Matlab函数介绍(以MATLAB5.3为例):
数据输入输出函数:imread()和imwrite():可以读写bmp,jpg/jpeg, tif/tiff, png, hdf, pcx, wxd格式文件。读索引文件时,还可以得到相应的调色板数据。auread()、auwrite()、wavread()和wavwrite():可以方便地读写au和wav文件,并可控制其中的位及频率。
图像显示与声音播放:imshow():显示一幅图像;imfinfo():可以得到读入图像的信息。如文件的大小、格式、格式版本号、图像的高度、宽度、颜色类型(真彩色,灰度图还是索引图)等。wavplay():播放wav声音文件。wavrecord():可以对处理后的wav文件进行录音。
变换频函数:对信号采用不同的变换,是实现频域法水印的至关重要的一步,MATLAB中对一维信号和二维信号分别提供了各种变换和逆变换函数。
离散余弦变换(DCT):dct(),dct2():分别实现一维信号和二维信号的DCT;idct(),idct2():分别实现一维信号和二维信号的IDCT。
离散傅里叶变换(DFT):fft(),fft2():分别实现一维信号和二维信号的DFT;ifft(),ifft2():分别实现一维信号和二维信号的IDFT。
离散小波变换(DWT):dwt(),dwt2():分别实现一维信号和二维信号的DWT;idwt(),idwt2():分别实现一维信号和二维信号的IDWT;Wavedec2():多级二维小波分解函数;Waveinfo():提供小波包中所有的小波信息。
攻击函数:旋转:rotate()可以对图像进行任意角度的旋转;剪裁:imcrop()可以按精确定位的各点坐标进行剪裁;滤波:filter()和filter2()可实现对一维信号和二维信号的滤波;抖动:dither()对图像进行抖动;jpeg压缩:imwrite()中jpg和quality参数能对图像进行可控jpg压缩;加各种噪声:imnoise()可以对图像加入各种噪声,如白噪声、椒盐噪声等;放大/缩小:imresize()可以以指定的插值方法来对图像进行放大和缩小。
一个用MATLAB编写的数字水印算法实例:
%定义常量
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);mark=randn(1,LENGTH);
subplot(2,2,1);plot(mark);title('watermarc:Gaussian noise');
%显示原图
subplot(2,2,2);I=imread('lena264_264','bmp'); imshow(I);title('origine image:I');
%显示prewitt为算子的边缘图
BW=edge(I,'prewitt');subplot(2,2,3);imshow(BW);
title('edge of origine image');
%嵌入水印
k=1;
for m=1:blockno
for n=1:blockno
x=(m-1)*block+1; y=(n-1)*block+1;
block_dct1=I(x:x+block-1,y:y+block-1);
block_dct1=dct2(block_dct1);
BW_8_8=BW(x:x+block-1,y:y+block-1);
if m<=1|n<=1
T=0;
else
T=sum(BW_8_8); T=sum(T);
end
if T>T1
Alpha=Alpha2;
else
Alpha=Alpha1;
end
block_dct1(1,1)=block_dct1(1,1)*(1+Alpha*mark(k)); block_dct1=idct2(block_dct1);
D(x:x+block-1,y:y+block-1)=block_dct1;
k=k+1;
end
end
%显示嵌入水印后的图像
subplot(2,2,4);imshow(D,[]);title('embeded image:D');
运行结果如图3所示,由些可以看到用MATLAB的编写一个完整的水印嵌入算法只需几十条语句便可以完成,而这些程序如果用C语言或其它高级语言编写程序至少在100行以上。这个例子充分证明了MATLAB在数字水印技术处理中的方便性和高效性。
MATLAB与VC++6.0的接口:用MATLAB编写数字水印程序的主要优点是语言本身适合水印技术所需的大量的函数库。并且MATLAB本身具有可扩展性、易学易用性和高效性的优点。除此之外,MATLAB还与VC++6.0有着良好的编程接口,必要时,可以采用MATLAB与VC6.0++的混合编程。
结束语:数字水印软件作为数据安全领域中的新生事物,具有很高的技术含量和很强的生命力,同时也孕育着巨大的商机。我们有理由相信,有了一个高效实用的研究工具能起到事半功倍的效果,会有越来越多的有识之士投入到数字水印技术的研究和产业化进程中来。