P a t c h w o r k图像信息
隐藏
3.3 Patchwork图像信息隐藏
【实验目的】
了解Patchwork信息隐藏特点,掌握基于Patchwork的图像信息隐藏原理,设计并实现一种基于Patchwork信息隐藏方法。
【实验环境】
(1) WindowsXP或Vista操作系统
(2) MATLAB7.1科学计算软件
(3) BMP图像
【原理简介】
Patchwork是指从载体数据中选择一些数据组成两个集合,然后通过修改这两个集合之间的某种关系来携带水印信息。
这两个集合可以是两个系数、两组系数或者是两个特征量。
两个集合之间的关系可以是大小关系、能量关系、逻辑关系和奇偶性关系等。
Patchwork方法嵌入水印时,通过修改集合之间的某种关系来嵌入水印;提取水印时,则根据对应的关系来提取嵌入的水印信息。
Patchwork方法最大优点之一就是可以实现盲检测。
Patchwork可以适用于时/空域、变换域和压缩域,本节主要介绍时域下的典型Patchwork方法。
Patchwork方法典型算法只能隐藏1bit的信息,也就是只能说明该图像是否存在水印,隐藏的信息量比较小,但是该算法的鲁棒性较强。
该算法的原理如下:随机选择两个集合A={ai}和B={bi},要求A和B中含有相同图像系数,设为n;将集合A中所有样点的像素值增加d,同时将集合B中所有样点的像素
值减少d,这样两个集合中的样值都经过微小的改动。
选择集合A和B的方法很多,但是PatchWork方法是基于以下假设的,也就是说随机选择的两个样本集合的均值相同。
本节中方法是根据图像的横坐标和纵坐标之和的奇偶性不同将图像分为两组,将横坐标和纵坐标之和为偶数的所有系数上增加常量
d=2.3,将横坐标和纵坐标之和为奇数的所有系数上减少常量d=2.3。
第二种方法是随机选择N对像素点(ai和bi),然后将ai点的值增加d,将bi点的像素值减少d。
【实验步骤】
1.嵌入秘密信息
源代码pathwork.m如下:
clc;
clear all;
oi=imread('lena.bmp');%读入载体图像
[row col]=size(oi);
d=2.3;%定义修改的分量
wi=oi;
for i=1:row
for j=1:col
if mod(i+j,2)==0
wi(i,j)=wi(i,j)+d;
else
wi(i,j)=wi(i,j)-d;
end
end
end
imwrite(oi,'lenawatermarked.bmp');
subplot(1,2,1),imshow('lena.bmp'),title('原始图像');
subplot(1,2,2),imshow('lenawatermarked.bmp'),title('携密图像');
原始图像和携密图像从视觉效果上几乎相同。
提取时,首先将两个图像块集合的样本分别求平均值,计算两个样本均值的差来判断水印信息是否存在。
源代码extract.m如下:
clc;
clear all;
d=2.3;
r=1.6;%确定一个阈值,当两个集合的样本差别大于d*r的时候,表示有水印信息
wi=imread('lenawatermarked.bmp');%读入载体图像
wi=double(wi);%必须将unit8类型转换成为double类型,否则tempa也是unit8类型,最大值只能存储255
[row col]=size(wi);
tempa=0;
tempb=0;
for i=1:row
for j=1:col
if mod(i+j,2)==0
tempa=tempa+wi(i,j);
else
tempb=tempb+wi(i,j);
end
end
end
avea=(tempa*2)/(row*col);
aveb=(tempb*2)/(row*col);
if (avea-aveb)>r*d
watermark=1;
else
watermark=0;
end
在上述方案中把整个图像中的像素全部分成两组,也可以通过随机的方式实现。
源代码randhiding.m如下:
clc;
clear;
oi=imread('lena.bmp');%读入载体灰度图像
wi=oi;
[row col]=size(wi);
wi=double(wi);
wi=wi(:);
oi=double(oi);
oi=oi(:);
n=floor((row*col)/10);
length=row*col;
rand('state', 123);%产生随机数的密钥
a=rand(1,n);%产生n长度的随机数
d=2.3;%定义修改的分量
count=0;
k=1;
while k<=n
if (a(1,k)>=0.5)
wi(k*10,1)=wi(k*10,1)+d;
wi(k*10-1,1)=wi(k*10-1,1)-d;
end
k=k+1;
end
for i=1:row
for j=1:col
wi1(i,j)=wi(row*(j-1)+i,1);
end
end
wi1=uint8(wi1);
figure;
imshow('lena.bmp');title('原始图像');
imwrite(wi1,'watermarked.bmp');
figure;
imshow('watermarked.bmp');title('携秘图像');
2.提取秘密信息
源代码randextract.m如下:
clc;
clear;
oi=imread('watermarked.bmp');%读入嵌入水印后的灰度图像wi=oi;
[row col]=size(wi);
wi=double(wi);
wi=wi(:);
n=floor((row*col)/10);
r=1.6;
rand('state', 123);%产生随机数的密钥
a=rand(1,n);%产生n长度的随机数
d=2.3;%定义修改的分量
count=0;
k=1;
tempa=0;
tempb=0;
while k<=n
if (a(1,k)>=0.5)
tempa=tempa+wi(k*10,1);
tempb=tempb+wi(k*10-1,1);
count=count+1;
end
k=k+1;
end
avea=(tempa)/(count);
aveb=(tempb)/(count);
if ((avea-aveb)>r*d)
watermark=1;
else
watermark=0;
end
【思考题】
1.本节介绍的方案都是假设A和B两个集合在未修改之前样本的均值相同,但实际情况下样本均值之间的差异并不总为零。
读者可自行从图像的像素中挑选A和
B两个集合,使得这两个集合样本的均值尽量接近,越接近,隐藏和提取的效果越好。
设计并实现一种Patchwork算法,使得挑选的两个集合A和B的均值尽可能接近。