量化水印(有源代码,绝对可以实现)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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); 所读入原始载体图片、原始二值水印图片及嵌入水印后的载体图片、提取出来的水印图片如下: