信息隐藏 实验七 DCT域图像水印

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

实验七DCT域图像水印

(一)实验目的

了解频域水印的特点,掌握基于DCT系数关系的图像水印算法原理,设计并实现一种基于DCT域的图像水印算法。

(二)实验环境

1、Windows xp操作系统

2、Matlab 7.1版本软件

3、BMP图像

(三)实验原理

1、嵌入信息

利用载体中两个特定DCT系数的相对大小来表示隐藏的信息。载体图像分为8*8分块,进行二维DCT变换,分别选择其中的两个位置,比如用(u1,v1)和(u2,v2)代表所选定的两个系数的坐标。如果Bi(u1,v1)Bi(u2,v2),代表隐藏0;如果相反,则交换两系数

2、提取信息

提取的时候接收者对包含水印信息的图像文件进行二维DCT变换,比较每一块中约定位置的DCT系数值,根据其相对大小,得到隐藏信息的比特串,从而恢复出秘密信息。

3、特殊处理

引入一个Alpha变量对系数的差值进行控制,将两个系数的差值放大,可以保证提取秘密信息的正确性。

(四)实验步骤

1、嵌入秘密信息。

2、提取秘密信息。

(五)实验截图

1、图像显示截图

原始图像嵌入水印图像

图1-1 原始图像和携密图像的对比图

结果:在显示上两者基本无差别。

2、所含秘密信息截图

图1-2 提取秘密信息

结果:所隐藏的信息为‘0123456789’。

(六)代码附录

1、嵌入秘密信息

clc;

clear;

msgfid=fopen('hidden.txt','r');%打开秘密文件,读入秘密信息

[msg,count]=fread(msgfid);

count=count*8;

alpha=0.02;

fclose(msgfid);

msg=str2bit(msg)';

[len,col]=size(msg);

io=imread('lena.bmp');%读取载体图像

io=double(io)/255;

output=io;

i1=io(:,:,1)%取图像的一层来隐藏

T=dctmtx(8);%对图像进行分块

DCTrgb=blkproc(i1,[8,8],'P1*x*P2',T,T');%对图像分块进行DCT变换

[row,col]=size(DCTrgb);

row=floor(row/8);

col=floor(col/8);

%顺序信息嵌入

temp=0;

for i=1:count

if msg(i,1)==0

if DCTrgb(i+4,i+1)

DCTrgb(i+4,i+1)=DCTrgb(i+3,i+2);

DCTrgb(i+3,i+2)=temp;

end

else

if DCTrgb(i+4,i+1)>DCTrgb(i+3,i+2)

temp=DCTrgb(i+4,i+1);

DCTrgb(i+4,i+1)=DCTrgb(i+3,i+2);

DCTrgb(i+3,i+2)=temp;

end

end

if DCTrgb(i+4,i+1)

DCTrgb(i+4,i+1)=DCTrgb(i+3,i+2)-alpha;%将原本小的系数调整更小,使得系数差别变大

else

DCTrgb(i+3,i+2)=DCTrgb(i+3,i+2)-alpha;

end

end

%将信息写回并保存

wi=blkproc(DCTrgb,[8,8],'P1*x*P2',T',T);%对DCTrgb进行逆变换

output=io;

output(:,:,1)=wi;

imwrite(output,'lena1.bmp');

figure;

subplot(1,2,1);imshow('lena.bmp');title('原始图像');

subplot(1,2,2);imshow('lena1.bmp');title('嵌入水印图像');

2、提取秘密信息

clc;

clear;

wi=imread('lena1.bmp');

wi=double(wi)/255;

wi=wi(:,:,1)%取图像的一层来提取

T=dctmtx(8);%对图像进行分块

DCTcheck=blkproc(wi,[8,8],'P1*x*P2',T,T');%对图像分块进行DCT变换

for i=1:80%80为隐藏的秘密信息的比特数

if DCTcheck(i+4,i+1)<=DCTcheck(i+3,i+2)

message(i,1)=1;

else

message(i,1)=0;

end

end

out=bit2str(message);

fid=fopen('message.txt','wt');

fwrite(fid,out);

fclose(fid);

(七)实验心得

通过此次的实验,了解了频域水印的特点。并利用这个来隐藏信息。考虑到人眼对蓝色的辨识度不高,对其蓝色分量做些稍微的修改,人肉眼可能看不出来。所以就对图像的第三层进行DCT变换,再挑选特定的值进行比较和处理,嵌入信息,再进行DCT逆变换,得到嵌入水印的图像。

相关文档
最新文档