Patchwork图像信息隐藏

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

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;

相关文档
最新文档