量化水印(有源代码,绝对可以实现)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

量化水印

背景知识

在数字水印中,我们知道,设计的水印算法有时要对保真度、鲁棒性等主要性能进行折中,而从保真度和鲁棒性这两个基本的特征出发,要求水印嵌入后满足以下两个条件:○1从保真度出发,要求水印嵌入后,有水印的载体数据与原始载体数据近似相等。

○2从鲁棒性出发,要求嵌入水印后的载体数据具有非连续性,以确保可以对抗干扰。

最初将量化运用于水印,就是为解决这方面的问题而出发的。从数学的角度来看,量化可以表示如下:

Y=f step(x)=step*[x/step]=step*round(x/step)

式中,x是待量化的数据,step是量化步长,Y是量化结果;[]和round均表示进行四舍五入取整;fstep( )是量化函数。

显然,量化函数fstep( )是一个多对一函数,是不可逆的,因此量化一般运用于不可逆水印,而且,由于量化结果均为整数,因此输出为离散值,并且误差满足|Y-x|<=step/2,即在量化步长step不是特别大的情况下,Y与x是近似相等的,所以量化满足上述两个条件,可以运用于数字水印中。

量化水印的算法

设计量化水印系统的关键在于选择实时可行的量化器集合,将不同的待嵌入的水印信息与不同的量化器相对应起来,然后用相应的量化器将载体数据进行量化,就可以得到含有水印的载体数据。由于大多数情况下,水印信息都是二进制的,因此下面以研究如何嵌入二进制水印信息为例来进行说明。

二进制信息中,有0和1两种不同的数据,因此,需要两个不同的量化器,分别用A 和B来表示。假设当发送水印信息为0时,用量化器A来对载体数据进行量化;当发送水印信息为1时,用量化器B来对载体数据进行量化,这样就可以得到两组不同的量化数据。在量化器中,量化器选择与原始载体数据最接近的数据来代替原始载体数据,从而保证不可感知性,即保真度;而且,A、B两个量化器之间的数据没有重叠,从而保证不同水印数据的不连续性,即使得水印系统具有一定的鲁棒性。提取水印时,根据待检数据与不同量化数据

之间的距离,就可以恢复出嵌入的信息。

一种常用的二进制量化水印算法可以用公式表示如下:

Q(x,s)+s*3/4 , w=1

Y=

Q(x,s)+s*1/4 , w=0

式中,s代表量化步长,w表示水印信息,x表示原始载体数据,Q(x,s)是量化函数,Y是量化后的数据。Q(x,s)可如下表示

Q(x,s)=floor(x/s)*s

floor()表示向下取整函数。

水印提取过程,可以用如下公式来表示:

1 , 如果 Y - Q(x,s) > s/2

W=

1 , 如果 Y - Q(x,s) < s/2

可见,只要干扰对Y的攻击在(-s/4,s/4)的范围内,嵌入的水印信息就可以正确的提取。上式中,s越大,水印系统鲁棒性越好,但是保真度会越差,这也从一个方面说明,鲁棒性和保真度这两个特性是互相矛盾的;当s=2时,如果是在时域进行量化,相当于LSB 算法。

量化水印算法根据水印嵌入位置不同,有时域量化和频域量化两种。时域量化直接通过修改载体数据时空域值来嵌入水印,这种算法容易且直观,但是鲁棒性和保真度都很差;频域量化通过修改载体数据频域系数值来嵌入水印,这种算法是把水印信号能量分散到所有或部分载体频带上,因此鲁棒性和保真度都较时域量化好。

当然,量化水印算法有很多种,上述算法只是最基本的一种,其他量化水印算法还有比如抖动调制算法(DM)、扩展变换抖动调制算法(STDM)、带失真补偿的抖动调制算法(DC-DM)等。

量化水印具有如下优点:

○1水印检测时多为盲检测,不需要原始载体数据。

○2载体不影响水印的检测性能,在无干扰的情况下,可以完全恢复出嵌入的信息。

Matlab仿真

下面以最基本的量化水印算法来进行仿真设计,算法是基于时空域的,其M代码如下:clear;

clc;

%=====================读入并显示载体图形=====================

p_lena=rgb2gray(imread('lena.jpg'));

figure;

subplot(2,2,1);

imshow(p_lena);

[m1,n1]=size(p_lena);

%=====================读入并显示二值水印图片=====================

w_pict=imread('jnu.bmp');

subplot(2,2,2);

imshow(w_pict);

[m2,n2]=size(w_pict);

%===================对载体空域值嵌入水印======================

step=10;

code_lena=p_lena;

for i=1:m2

for j=1:n2

q=(floor(code_lena(2*i,2*j)/step))*step;

if w_pict(i,j)==0

code_lena(2*i,2*j)=q+step/4;

elseif w_pict(i,j)==1

code_lena(2*i,2*j)=q+3*step/4;

end

end

end

%===================显示嵌入水印后的载体图像===================

subplot(2,2,3)

imshow(code_lena);

%=========================提取水印============================

de_lena=code_lena;

for i=1:m2

for j=1:n2

q=(floor(p_lena(2*i,2*j)/step))*step;

gap=de_lena(2*i,2*j)-q;

if gap>step/2

de_w_pict(i,j)=1;

elseif gap

de_w_pict(i,j)=0;

end

end

end

%========================显示提取的水印图片========================

subplot(2,2,4);

imshow(de_w_pict);

所读入原始载体图片、原始二值水印图片及嵌入水印后的载体图片、提取出来的水印图片如下:

相关文档
最新文档