信息隐藏 实验七 DCT域图像水印
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)
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逆变换,得到嵌入水印的图像。