我们热爱生命科学!-生物行

[推荐] 基于MATLAB的数字水印技术研究(2)

时间:2006-01-11 15:51来源:Internet 作者:bioguider 点击: 2088次

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=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);

(责任编辑:泉水)
顶一下
(7)
100%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片