大连理工大学实验预习报告学院(系):电信学部专业:电子信息工程(英语强化)班级:电英0901姓名:许羽晗学号:200981520组:实验时间:2013-09-25实验室:C-221实验台:指导教师签字:成绩:实验一BMP图像信息隐藏一、实验目的和要求了解BMP图像文件格式,了解利用BMP图像文件隐藏信息的原理,设计并实现一种基于24位彩色BMP图像的文件隐藏方法。二、实验原理和内容针对文件结构的信息隐藏方法需详细掌握文件的格式,利用文件结构块之间的关系或根据块数据和块大小之间的关系来隐藏信息。BMP(Bitmap-File)图形文件是Windows采用的常见图形文件格式,要利用BMP位图行信息隐藏首先需要详细了解BMP文件的格式,BMP图像文件格式比较单一而且固定,BMP图像由文件头、信息头、调色板区和数据区四个部分组成,而24位真彩色图像中没有调色板信息。24位真彩色BMP位图文件包括三部分。第一部分是BMP文件头。前2个字节是“BM”,是用于识别BMP文件的标志;第3、4、5、6字节存放的是位图文件的大小,以字节为单位;第7、8、9、10字节是保留的,必须为0;第11、12、13、14字节给出位图阵列相对于文件头的偏移,在24位真彩色图像中,这个值固定为54;第19、20、21、22字节表示的是图像文件的宽度,以像素为单位;第23、24、25、26字节表示的是图像文件的高度,以像素为单位。第二部分是位图信息头。从第29个字节开始,第29、30字节描述的是像素的位数,24位真彩色位图,该位的值为0x18。第三部分是数据区。从第55个字节开始,每3个字节表示一个像素,这3个字节依次表示该像素的红、绿、蓝亮度分量值。在不影响图像正常显示的情况下,可使用以下四种方法在24位真彩色BMP图像中隐藏信息。(1)在图像文件尾部添加任意长度的数据,秘密信息存放在文件尾部可以减少修改文件头的数据量,仅需修改文件头中文件长度的值即可。(2)在调色板或者位图信息头和实际的图像数据之间隐藏数据,如果将秘密数据放在文件头与图像数据之间,则至少需要修改文件头中文件长度、数据起始偏移地址这两个域的值。(3)修改文件头和信息头中的保留字段隐藏信息。(4)在图像像素区利用图像宽度字节必须是4的倍数的特点,在补足位处隐藏数据。三、实验步骤1、在实际的图像数据后隐藏信息2、文件头与图像数据之间隐藏信息在数据区开始之前隐藏信息,就是在54个和55个字节之间隐藏信息,隐藏的秘密信息从hidden.txt文件中读取,此种方法修改图像数据的偏移量和图像数据的文件长度。3、在图像文件头和信息头的保留字段中隐藏信息BMP图像文件中有很多从不使用的保留字节,如7、8、9、10字节是保留的,必须为0,可在第7、8、9、10字节隐藏秘密信息。大连理工大学实验报告学院(系):电信学部专业:电子信息工程(英语强化)班级:电英0901姓名:许羽晗学号:200981520组:实验时间:2013-09-25实验室:C-221实验台:指导教师签字:成绩:实验一BMP图像信息隐藏一、实验程序和结果以下代码有老师提供,特此说明。1.在实际的图像数据后隐藏信息待隐藏的秘密信息文件名称为hidden.txt,m1.bmp为载体图像,将载体与秘密信息放置在同一个目录下。源代码bmphide.m如下:clc;clear;fid=fopen(‘m1.bmp’,‘r’);[a,length]=fread(fid,inf,‘uint8’);fclose(fid);msgfid=fopen(‘hidden.txt’,‘r’);[msg,count]=fread(msgfid);fclose(msgfid);wa=a;wa(3)=wa(3)+count;wa(length+1:length+count)=uint8(msg);figurewa=uint8(wa);fid=fopen(‘watermarked.bmp’,‘wb’);fwrite(fid,wa)fclose(fid);imshow(‘watermarked.bmp’);2、文件头与图像数据之间隐藏信息在数据区开始之前隐藏信息,就是在54个和55个字节之间隐藏信息,隐藏的秘密信息从hidden.txt文件中读取,此种方法修改图像数据的偏移量和图像数据的文件长度。源代码bmphheadhiding.m如下:clc;clear;fid=fopen('m1.bmp','r');[a,length]=fread(fid,inf,'uint8');fclose(fid);msgfid=fopen('hidden.txt','r');[msg,count]=fread(msgfid);fclose(msgfid);wa=a;j=1;wa(11)=54+count;wa(3)=wa(3)+count;wa(55:55+count-1)=uint8(msg);wa(55+count:length+count)=a(55:length);figurewa=uint8(wa);fid=fopen('watermarked.bmp','wb');fwrite(fid,wa);fclose(fid);imshow('watermarked.bmp');3、在图像文件头和信息头的保留字段中隐藏信息BMP图像文件中有很多从不使用的保留字节,如7、8、9、10字节是保留的,必须为0,可在第7、8、9、10字节隐藏秘密信息。源代码bmpreservedhiding.m如下:clc;clear;fid=fopen('baboon.bmp','r');%读入载体图像文件[a,length]=fread(fid,inf,'uint8');fclose(fid);wa=a;%在BMP的7、8、9、10保留字中隐藏秘密信息DLUT,ASCII值为0x44,0x4B,0x55,0x54wa(7)=68;wa(8)=75;wa(9)=85;wa(10)=84;figure;wa=uint8(wa);fid=fopen('watermarked.bmp','wb');fwrite(fid,wa);fclose(fid);imshow('watermarked.bmp');实验结果:完成了BMP图像信息隐藏。大连理工大学实验预习报告学院(系):电信学部专业:电子信息工程(英语强化)班级:电英0901姓名:许羽晗学号:200981520组:实验时间:2013-09-27实验室:C-221实验台:指导教师签字:成绩:实验二LSB图像信息隐藏一、实验目的和要求(1)了解信息隐藏中最常用的LSB算法特点(2)掌握LSB算法原理,设计并实现一种基于图像的LSB隐藏算法三、实验原理和内容任何多媒体信息在数字化时都会产生物理随机噪声,而人的感观系统对随机噪声不敏感。替换技术就是利用这个原理,通过使用秘密信息比特替换随机噪声,从而实现信息隐藏目的。BMP灰度图像的每个像素值为8比特二进制值,表示该点亮度。不同位平面对视觉影响不同,可用下图所示系列图像表示。图像高位平面对图像感官质量起主要作用,去除图像最低几个位平面并不会造成画面质量的明显下降。利用这个原理可用秘密信息(或称水印信息)替换载体图像低位平面以实现信息嵌入。本算法选用最低位平面来嵌入秘密信息。最低位平面对图像的视觉效果影响最轻微,但很容易受容易受噪声影响和攻击,可采用冗余嵌入的方式来增强稳健性加以解决,即在一个区域(多个像素)中嵌入相同的信息,提取时根据该区域中的所有像素判断。三、实验步骤隐藏提取及测试算法分为三个部分实现:(1)隐藏算法;(2)提取算法;(3)测试脚本。大连理工大学实验报告学院(系):电信学部专业:电子信息工程(英语强化)班级:电英0901姓名:许羽晗学号:200981520组:实验时间:2013-09-27实验室:C-221实验台:指导教师签字:成绩:实验二LSB图像信息隐藏一、实验程序和结果以下代码由老师提供:1)隐藏算法源代码hide_lsb.m如下:functionO=hide_lsb(block,data,I)%FunctionO=hide_lsb(block.data.I)%block:隐藏的最小分块大小%data:秘密信息%I:原始载体si=size(I);lend=length(data);%将图像划分为N*N个小块N=floor(si(2)/block(2));N=min(floor(si(1)/block(1)).ceil(lend/N);O=I;fori=0:M-1%计算每小块垂直方向起止位置rst=i*block(1)+1;red=(i+1)*block(1);forj=0:N-1%计算每一块隐藏的秘密信息的序号idx=i*N+j+1;ifidxlendbreak;end%取每小块隐藏的秘密信息bit=data(idx);%计算每一块水平方向起止位置cst=j*block(2)+1;ced=(j+1)*block(2);%将每小块最低位平面替换为秘密信息O(rst:red,cst:ced)=bitset(O(rst:red,cst:ced),1,bit);end;end;2)提取算法源代码dh_lsb.m如下:functionout=dh_lsb(block,data,I)%Functionout=dh_lsb(block.data.I)%block:隐藏的最小分块大小%I:携密载体si=size(I);%将图像划分为M*N个小块N=floor(si(2)/block(2));M=floor(si(1)/block(1));out=[];%计算比特1判决阙值:即每小块半数以上元素隐藏的是比特1时,判决该小块嵌入的信息为1thr=ceil((block(1)*block(2)+1)/2);idx=0;fori=0:M-1%计算每小块垂直方向起止位置rst=I*block(1)+1;red=(I+1)*block(1);forj=0:N-1%计算每一块隐藏的秘密信息的序号idx=i*N+j+1;%计算每小块水平方向起止位置cst=j*block(2)+1;ced=(j+1)*block(2);%提取小块最低位平面,统计1比特个数,判决输出秘密信息tmp=sum(sum(bitget(I(rst:red,cst:ced),1)));if(tmp=thr)out(idx)=1;elseout(idx)=0;end;end;end;3)测试脚本源代码test.m如下:fid=1;len=10;%随机生成要隐藏的秘密信息d=randsrc(1,len,[01]);block=[3,3];[fn,pn]=uigetfile({'*.bmp','bmpfile(*.bmp)';},'选择载体');s=imread(stract(pn,fn));ss=size(s);if(length(ss)=3)I=rgb2gray(s);elseI=s;endsi=size(I);sN=floor(si(1)/block(1))*floor(si(2)/block(2));tN=length(d);%如果载体图像尺寸不足以隐藏秘密信息,则在垂直方向上复制填充图像ifsNtNmultiple=ceil(tN/sN);tmp=[];fori=1:multipletmp=[tmp;I];end;I=tmp;end;%调用隐藏算法,把携密载体写至硬盘stegoed=hide_lsb(block,d,I);imwrite(stegoed,'hide.bmp','bmp');[fn,pn]=uigetfile({'*.bmp’,'bmpfile(*.bmp)';},'选择隐蔽载体');y=imread(stract(pn,fn));sy=size(y);if(length(sy)=3)I=rgb2gray(y);elseI=y;end;%调用提取算法,获得秘密信息out=dh_lsb(block,I);%计算误码率len=mi