欢迎来到天天文库
浏览记录
ID:2401622
大小:495.75 KB
页数:9页
时间:2017-11-15
《bmp信息隐藏实验报告》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、北京电子科技学院(BESTI)实验报告课程:多媒体技术及加密班级:0943学号:20094324姓名:郑思巧实验日期:2011-12-1指导老师:刘瑾老师编程实现数字图像处理实验序号:实验一实验题目:实验成绩:实验评语:一、实验目的通过本次实验,清楚地了解BMP图像的文件格式,实现在BMP格式中的文件信息隐藏,通过信息隐藏的各种方法进一步理解BMP文件的基本结构。二、实验内容通过编程的方式实现对bmp文件的简单处理功能。涉及到bmp文件的基本结构、信息隐藏方法和技巧的运用、数学公式在数字图像处理当中的应用等知识点。题目1:编写程序实现对bmp文件的信息隐藏。题目2:编写程序实现为一幅bmp文
2、件格式的图像加入油画效果。(选做,实验步骤中会对给出的程序进行分析)三、实验要求1.编程工具任选。2.所编程序可以处理任意24位bmp位图文件。3.要求学生熟练掌握24位bmp文件的基本结构及通过程序访问位图数据的方法。4.对信息隐藏技术和实现方法有基本的了解,能够比较不同方法的优劣。5.体会数学运算在图像处理当中的作用,会用基本的编程方法实现数学公式。6.思索常见的数字图像处理功能的实现原理,对学有余力的学生可开展扩展性编程,实现诸如色彩变换、几何变换等基本处理功能。四、工具介绍C++,面向对象程序设计语言VC6.0运行环境五、实验步骤(一)、整体构思:首先本次实验是基于C++编写的,将B
3、MP文件中的基本结构用一个类进行表示,如:指向BMP图像文件头、信息头、数据区等指针以及隐藏文件长度均为该类的私有成员,而完成实验操作的各个函数作为公有成员,通过构造函数对每个私有成员进行初始化,然后再将BMP图像读取到内存中,并将隐藏文件保存在缓冲区,通过LSB算法进行信息插入后(这种算法是将待隐藏的信息逐比特放在BMP图像中每个字节的末位),保存含有隐藏信息的图像,并从该图像中提取隐藏的信息以验证信息是否已经隐藏在图像中。因此本次实验要完成的功能及各部分关系如下图所示:(二)、信息隐藏和信息提取分析:LSBhide函数和DeLSBhide函数本实验中是运用LSB算法实现信息隐藏的。所谓L
4、SB算法也叫最低有效位算法,它是将秘密信息嵌入到原始图像像素值的最低有效位(通常为最末位),原始图像数据一般采用字节表示,每个字节是8个比特,最后一个比特就是所谓的LSB(Leastsignificantbit)-就是最不重要位的意思,LSB隐藏就是将要隐藏的信息(一般已经转换为比特)替换原始图像数据的LSB比特。LSB算法首先将得到的隐藏有秘密信息的十进制像素值转换为二进制数据,再用二进制秘密信息中的每一比特信息替换与之相对应的载体数据的最低有效位(即将两者进行“&”与运算),最后将得到的含秘密信息的二进制数据转换为十进制像素值,从而获得含秘密信息的图像。图像最低位和隐藏信息的与运算可采用
5、for循环语句进行,那么我们就要先求出隐藏文件的信息长度hidelength,这个信息长度可使用文件流操作实现,通过seekg(0,ios::end)将指针移到文件尾,再配合file.tellg()则可以求出文件的大小为多少bytes,即:hidefile.seekg(0,hidefile.end);hidelength=hidefile.tellg();而这个隐藏文件长度值记录在BMP图像数据区的前32个字节,通过for循环语句逐个字节进行记录,如下:for(i=0;i<32;i++)m_data[i]=((hidelength>>(31-i))&0x01)+(m_data[i]&0xfe
6、);这其中,m_data[i]表示原始数据的第i个字节,0x01是十六进制,转换成二进制实际上为00000001,因此(hidelength>>(31-i))&0x01相当于取出当前hidelengh值的最末一个比特a的二进制值;而0xfe也是表示十六进制,但是其对应的二进制为11111110,因此m_data[i]&0xfe表示将原始数据的最后一个置0,同(hidelength>>(31-i))&0x01异或后即可将该比特a成功记录在BMP的图像数据区的第i个字节的最末一位。而基于LSB算法的信息隐藏是如下实现的:for(i=0;i7、++)m_data[i*8+j+32]=((strByteBuffer[i]>>(7-j))&0x01)+(m_data[i*8+j+32]&0xfe);同上述记录隐藏文件长度值类似,m_data表示原始数据,strByteBuffer表示将要隐藏的信息,不过这里还是字节的形式,(strByteBuffer[i]>>(7-j))&0x01表示就是将strByteBuffer的第i个字节的第j个比特取出来,注意
7、++)m_data[i*8+j+32]=((strByteBuffer[i]>>(7-j))&0x01)+(m_data[i*8+j+32]&0xfe);同上述记录隐藏文件长度值类似,m_data表示原始数据,strByteBuffer表示将要隐藏的信息,不过这里还是字节的形式,(strByteBuffer[i]>>(7-j))&0x01表示就是将strByteBuffer的第i个字节的第j个比特取出来,注意
此文档下载收益归作者所有