3.2用Matlab研究数字水印的优点 l 集成了DCT、DWT等函数有丰富的小波函数和处理函数,这不仅方便了研究人员,而且使源程序简洁明了、易实现。 l 强大的数学运算功能。能够方便、高效地实现音频、视频中的大量矩阵运算。 l 提供了图像处理工具箱、小波分析工具箱、数字信号处理工具箱。用来编制跨数字图像处理技术、数字信号处理等多学科的数字水印技术是非常好的选择。 l MATLAB与目前最强大的编程工具——Visual C++具有良好的接口。 3.3Matlab函数介绍(以MATLAB5.3为例) 在介绍函数之前,我们必须明确一点:作水印程序时,处理的图像数据是二维信号,而声音信号是一维信号。这里,我们仅仅简单介绍与水印有关的函数,具体函数的用法请读者参考文献[2]。 l 数据输入输出函数 imread()和imwrite():可以读写bmp,jpg/jpeg, tif/tiff, png, hdf, pcx, wxd格式文件。读索引文件时,还可以得到相应的调色板数据。 auread()、auwrite()、wavread()和wavwrite():可以方便地读写au和wav文件,并可控制其中的位及频率。 l 图像显示与声音播放 imshow():显示一幅图像; imfinfo():可以得到读入图像的信息。如文件的大小、格式、格式版本号、图像的高度、宽度、颜色类型(真彩色,灰度图还是索引图)等 wavplay():播放wav声音文件。当然,也可以把处理后的wav文件保存后再用其它工具播放。 wavrecord():可以对处理后的wav文件进行录音。 l 变换频函数 对信号采用不同的变换,是实现频域法水印的至关重要的一步,MATLAB中对一维信号和二维信号分别提供了各种变换和逆变换函数。 l 离散余弦变换(DCT) dct(),dct2():分别实现一维信号和二维信号的DCT(离散余弦变换); idct(),idct2():分别实现一维信号和二维信号的IDCT(逆向离散余弦变换); l 离散傅里叶变换(DFT) fft(),fft2():分别实现一维信号和二维信号的DFT(离散傅里叶变换); ifft(),ifft2():分别实现一维信号和二维信号的IDFT(逆向离散傅里叶变换); l 离散小波变换(DWT) dwt(),dwt2():分别实现一维信号和二维信号的DWT(离散小波变换); idwt(),idwt2():分别实现一维信号和二维信号的IDWT(离散小波变换); Wavedec2():多级二维小波分解函数; Waveinfo():提供小波包中所有的小波信息; 另外,MATLAB中还有丰富的小波包处理函数,有兴趣的读者可参考文献[2]。 l 攻击函数 对算法进行攻击测试是对水印鲁棒性检测的一种重要手段,一个好的水印算法必须经过各种攻击测试才能对之做出客观的评价。MATLAB中的许多函数可以直接用来做的攻击测试。 旋转:rotate()可以对图像进行任意角度的旋转; 剪裁:imcrop()可以按精确定位的各点坐标进行剪裁; 滤波:filter()和filter2()可实现对一维信号和二维信号的滤波; 抖动:dither()对图像进行抖动;抖动攻击考验水印鲁棒性的一个很好的攻击; jpeg压缩:imwrite()中jpg和quality参数能对图像进行可控jpg压缩; 加各种噪声:imnoise()可以对图像加入各种噪声,如白噪声、椒盐噪声等,加入噪声是对水印鲁棒性考验的一种常见的攻击; 放大/缩小:imresize()可以以指定的插值方法来对图像进行放大和缩小。 3.4一个用MATLAB编写的数字水印算法实例 为证明MATLAB的高效性与实现简便性,我们以文献[1]的算法为例,给出在Windows98环境下MATLAB5.3中调试通过的完整源程序。 l 嵌入水印 %定义常量 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; 图3 数字水印算法处理示意图 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); (责任编辑:泉水) |