DCT域图像水印技术
1数字水印技术的概念和特点
数字水印(Digital Watermark)技术是将与多媒体内容相关或不相关的一些标示信息直接嵌入多媒体内容当中,但不影响原内容的使用价值,并不容易被人的知觉系统觉察或注意到。通过这些隐藏在多媒体内容中的信息,可以达到确认内容创建者、购买者,或者是否真实完整。数字水印是信息隐藏技术的一个重要研究方向。
作为数字水印技术基本上具有下面几个方面的特点:
安全性:数字水印的信息应是安全的,难以篡改或伪造,同时,应当有较低的误检测率,当原内容发生变化时,数字水印应当发生变化,从而可以检测原始数据的变更;当然数字水印同样对重复添加有有强的抵抗性
隐蔽性:数字水印应是不可知觉的,而且应不影响被保护数据的正常使用;不会降质;
鲁棒性:是指在经历多种无意或有意的信号处理过程后,数字水印仍能保持部分完整性并能被准确鉴别。可能的信号处理过程包括信道噪声、滤波、数/模与模/数转换、重采样、剪切、位移、尺度变化以及有损压缩编码等。主要用于版权保护的数字水印易损水印(Fragile Watermarking),主要用于完整性保护,这种水印同样是在内容数据中嵌入不可见的信息。当内容发生改变时,这些水印信息会发生相应的改变,从而可以鉴定原始数据是否被篡改。
水印容量:嵌入的水印信息必须足以表示多媒体内容的创建者或所有者的标志信息,或购买者的序列号,这样有利于解决版权纠纷,保护数字产权合法拥有者的利益。尤其是隐蔽通信领域的特殊性,对水印的容量需求很大。
2 基于DCT域的图像数字水印技术
离散余弦变换(Discrete Cosine Transform)属于正交变换图像编码方法中的一种。正交变换图像编码始于1968年。当时安德鲁斯(Andrews)等人发现大多数自然图像的高频分量相对幅度较低,可完全舍弃或者只用少数码字编码,提出不对图像本身编码,只对其二维傅立叶(DFT)系数进行编码和传输。但DFT是一种正交变换,运算量很大,常常使实时处理发生困难,第二年他们就用Walsh-Hadamard变换(WHT)取代DFT可以使运算量明显减少,这是因为WHT变换只有加减法而无需乘法。但是更有意义的是离散余弦变换和离散正旋变换的出现,它们具有快速算法,精确度高。其中最重要的是1974年提出的DCT,因为其变换矩阵的基向量很近似于托伯利兹矩阵的特征向量,而托伯利兹矩阵又体现了人类语言及图像信号的相关性。因此,DCT常常被认为是语音与图像信号变换的准最佳变换。
图像是二维的,所以在研究时主要用到二维DCT,以及二维IDCT来对图像进行处理。
2.1 离散余弦变换(DCT)的定义
数字图像X(m,n)是具有M行N列的一个矩阵。为了同时减弱或去除图像数据相关性,可以运用二维DCT,将图像从空间域转换到DCT变换域。
根据定义,二维离散余弦变换(DCT)定义如下:
式中:m,k=0,1,…,M-1; n,
=0,1,…,N-1。
二维逆离散余弦变换(IDCT)的定义如下:
式中:m,k=0,1,…,M-1; n,
2.2 离散余弦变换的特点
在基于DCT的变换编码中,图像是先经分块(8×8或16×16)后再经DCT,这种变换是局部的,只反映了图像某一部分的信息。当然也可以对整幅图像的特点,但是运算速度比分块DCT要慢。图像经DCT后,得到的DCT图像有三个特点:
一是系数值全部集中到0值附近(从直方图统计的意义上),动态范围很小,这说明用较小的量化比特数即可表示DCT系数;
二是DCT变换后图像能量集中在图像的低频部分,即DCT图像中不为零的系数大部分集中在一起(左上角),因此编码效率很高。
三是没有保留原图像块的精细结构,从中反映不了原图像块的边缘、轮廓等信息,这一特点是由DCT缺乏时局域性造成的。
如下左图2—1是原始图像经过DCT变换后的系数图像为图2—2。两条线划分出图像的低频、中频和高频分别所在的矩形区域。可以看出,图像DCT变换后大部分参数接近于零,只有左上角的低频部分有较大的数值,中频部分参数值相对较小,而大部分高频参数值非常小,接近于零。
2.3 离散余弦变换的数字水印算法
根据离散余弦变换后的参数性质,本文采用了以ZigZag方式重排变换域系数的方法,选出中频分量,用数字水印序列对其进行非线性调制。水印检测时,待检测图像仍按比方式选择变换域系数,与待水印进行相关运算,与阈值比较来判断是否所含水印。
离散余弦域的数字水印算法的具体实现分为三步:宿主图像的变换,数字水印的嵌入,数字水印的检测。
2.3.1 宿主图像的DCT变换
对于N×N大小的256灰度级的宿主图像I进行N×N二维离散余弦变换(DCT)。以ZigZag方式对于DCT变换后的图像频率系数重新排列成一维向量Y={y1, y2,…yN×N}.
并取出序列中第L+1到L+M的中频系数部分,得到YL={ YL+1, YL+2,…, YL+M}
2.3.2 数字水印的嵌入
假设数字水印W为一服从标准正态分布的随机实数序列,用数字序列表示为W={W1 ,W2 ,…WM }。用W对Y序列中第L+1到L+M的中频系数部分的值进行修改,按以下公式进行:
经过修改的系数序列Y′ ={ Y1′, Y2′,... Y′N×N} 以ZigZag逆变换形式重组,再进行N×N DCT逆变换,得到嵌有数字水印的图像I′。
2.3.3 数字水印的检测
待检测的可能含有水印的图像I" 。假设I"未损失大量信息,可以近似认为I"= I′。在此假设下可以运用统计的方法来检测水印。
(1)待检水印域待检图像中频系数相关性的测定
同样对I′进行DCT变换,以ZigZag方式将DCT系数排成一维向量Y "= { Y1 ", Y2 ",... YN×N"}。由于假设I"=I′,则Y"= Y ′。
取出Y"(等于Y′)中第L+1到L+M的中频系数部分YL "={ YL+1 ", YL+2"’,... YL+M"}。假设待检测的数字水印X={X1,X2,... XM}为一符合标准正态分布的实数伪随机序列。则可以通过待检水印与图像中频系数作相关运算来判断是否所加入了水印。只有在待检水印为所加入的水印时,才能得到较大的相关值。否则相关值很小,接近于零。
用符号E表示数学期望,得到:
(2)阈值的确定
根据中心极限定理,参照水印匹配与不匹配两种情况得到阈值为
。由于原始图像难以得到,因此从实用性出发,阈值定义为:
综上所述,满足
3.1matlab源程序
%嵌入水印的程序代码
M=256; %原图像长度
N=32; %水印图像长度
K=8;
I=zeros(M,M);J=zeros(N,N);BLOCK = zeros(K,K);
%显示原图像
subplot(3,2,1);I=imread('mona.bmp','bmp');imshow(I);title('原始公开图像');
%显示水印图像
subplot(3,2,2);J=imread('flag.bmp','bmp');imshow(J);title('水印图像');
%嵌入水印
for p=1:N
for q=1:N
x=(p-1)*K+1;
y=(q-1)*K+1;
BLOCK=I(x:x+K-1,y:y+K-1);
BLOCK=dct2(BLOCK);
if J(p,q)==0
a=-1;
else
a=1;
end
BLOCK(1,1)=BLOCK(1,1)*(1+a*0.03);
BLOCK=idct2(BLOCK);
I(x:x+K-1,y:y+K-1)=BLOCK;
end
end
%显示嵌入水印后的图像
subplot(3,2,3);imshow(I);title('嵌入水印后的图像');
imwrite(I,'watermarked.bmp','bmp');
%从嵌入水印的图像中提取水印
I=imread('mona','bmp');
J=imread('watermarked.bmp','bmp');
for p=1:N
for q=1:N
x=(p-1)*K+1;
y=(q-1)*K+1;
BLOCK1=I(x:x+K-1,y:y+K-1);
BLOCK2=J(x:x+K-1,y:y+K-1);
BLOCK1=idct2(BLOCK1);
BLOCK2=idct2(BLOCK2);
a=BLOCK2(1,1)/BLOCK1(1,1)-1;
if a<0
W(p,q)=0;
else
W(p,q)=1;
end
end
end
%显示提取的水印
subplot(3,2,4);
imshow(W);
title('从含水印图像中提取的水印');
%水印攻击测试
M=256;
N=32;
K=8;
I=zeros(M,M);
J=zeros(M,M);
w=zeros(N,N);
BLOCK1=zeros(K,K);
BLOCK2=zeros(K,K);
%对嵌入水印后的图像进行JPEG压缩
L=imread('watermarked.bmp','bmp');
imwrite(L,'attack.jpg','jpeg','Quality',45);
J=imread('attack.jpg','jpeg');
subplot(3,2,5);imshow(J);title('压缩后的图像');
I=imread('mona','bmp');
%从压缩的图像中提取水印
for p=1:N
for q=1:N
x=(p-1)*K+1;
y=(q-1)*K+1;
BLOCK1=I(x:x+K-1,y:y+K-1);
BLOCK2=J(x:x+K-1,y:y+K-1);
BLOCK1=idct2(BLOCK1);
BLOCK2=idct2(BLOCK2);
a=BLOCK2(1,1)/BLOCK1(1,1)-1;
if a<0
W(p,q)=0;
else
W(p,q)=1;
end
end
end
%显示提取的水印
subplot(3,2,6);
imshow(W);
title('从经过压缩的图像中提取的水印');
3.2程序结果图
3.3小结
实验中用的原始图像是大小为256×256的8级灰度图像,水印图像为32×32带有数字水印字样的二值图像。实验结果表明,原始图像嵌入水印后和原始图像看起来没有差别。对信号进行JPEG压缩处理操作,都能很好的抽取出水印。