版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 北京电子科技学院(BESTI)实验报告课 程:多媒体技术及加密班 级:0943学 号:20094324姓 名:郑思巧实验日期:2011-12-1指导老师:刘瑾老师编程实现数字图像处理实验序号:实验一实验题目: 实验成绩:实验评语:一、 实验目的通过本次实验,清楚地了解BMP图像的文件格式,实现在BMP格式中的文件信息隐藏,通过信息隐藏的各种方法进一步理解BMP文件的基本结构。二、 实验内容 通过编程的方式实现对bmp文件的简单处理功能。涉及到bmp文件的基本结构、信息隐藏方法和技巧的运用、数学公式在数字图像处理当中的应用等知识点。 题目1:编写程序实现对bmp文件的信息隐藏。 题目2:编写程
2、序实现为一幅bmp文件格式的图像加入油画效果。(选做,实验步骤中会对给出的程序进行分析)三、 实验要求 1.编程工具任选。 2.所编程序可以处理任意24位bmp位图文件。 3.要求学生熟练掌握24位bmp文件的基本结构及通过程序访问位图数据的方法。 4.对信息隐藏技术和实现方法有基本的了解,能够比较不同方法的优劣。 5.体会数学运算在图像处理当中的作用,会用基本的编程方法实现数学公式。 6.思索常见的数字图像处理功能的实现原理,对学有余力的学生可开展扩展性编程,实现诸如色彩变换、几何变换等基本处理功能。四、 工具介绍C+,面向对象程序设计语言VC6.0运行环境五、 实验步骤(一)、整体构思:首
3、先本次实验是基于C+编写的,将BMP文件中的基本结构用一个类进行表示,如:指向BMP图像文件头、信息头、数据区等指针以及隐藏文件长度均为该类的私有成员,而完成实验操作的各个函数作为公有成员,通过构造函数对每个私有成员进行初始化,然后再将BMP图像读取到内存中,并将隐藏文件保存在缓冲区,通过LSB算法进行信息插入后(这种算法是将待隐藏的信息逐比特放在BMP图像中每个字节的末位),保存含有隐藏信息的图像,并从该图像中提取隐藏的信息以验证信息是否已经隐藏在图像中。因此本次实验要完成的功能及各部分关系如下图所示: (二)、信息隐藏和信息提取分析:LSBhide函数和DeLSBhide函数本实验中是运用
4、LSB算法实现信息隐藏的。所谓LSB算法也叫最低有效位算法,它是将秘密信息嵌入到原始图像像素值的最低有效位(通常为最末位),原始图像数据一般采用字节表示,每个字节是8个比特,最后一个比特就是所谓的LSB(Least significant bit)-就是最不重要位的意思,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(31-i) & 0x01)+(m_datai& 0xfe); 这其中,m_datai表
6、示原始数据的第i个字节,0x01是十六进制,转换成二进制实际上为00000001,因此(hidelength(31-i) & 0x01相当于取出当前hidelengh值的最末一个比特a的二进制值;而0xfe也是表示十六进制,但是其对应的二进制为11111110,因此m_datai& 0xfe表示将原始数据的最后一个置0,同(hidelength(31-i) & 0x01异或后即可将该比特a成功记录在BMP的图像数据区的第i个字节的最末一位。而基于LSB算法的信息隐藏是如下实现的: for(i=0;ihidelength;i+) for(j=0;j(7-j)&0x01)+(m_datai*8+j
7、+32&0xfe); 同上述记录隐藏文件长度值类似,m_data表示原始数据,strByteBuffer表示将要隐藏的信息,不过这里还是字节的形式,(strByteBufferi(7-j) & 0x01表示就是将strByteBuffer的第i个字节的第j个比特取出来,注意,取出来的值不是0就是1(因为最后与0x01进行与操作,0x01表示是十六进制,二进制实际上为00000001,就相当于取出最末一个比特),(m_datai*8+j+32 & 0xfe)表示将原始数据里面的最末一比特置0后的值取出来,然后加上刚才得到的待隐藏的信息,就相当于用隐藏的信息替换了原始数据的最后一比特的信息。注意0
8、xfe是表示16进制,二进制为11111110。 具体如下图表示: 在全部嵌入完成后,即可输入隐藏信息的BMP图像名createbmp ,通过语句createBMP(createbmp生成隐藏了信息的BMP图像 信息提取相当于信息隐藏的逆过程,首先要从BMP图像数据区的前32个字节读取待提取的文件长度,也是通过for循环语句实现: for(i=0;i32;i+) HideLength+=(m_datai&0x01)(31-i); m_datai&0x01表示每次提取的就是数据区的第i个字节的最末位,提取一次,即向左移位,以保证将前32个字节中每个字节的末位都提取出来。 而具体的信息提取过程也是
9、由一个嵌套的for循环语句构成: for(i=0;iHideLength;i+) DestrByteBufferi=0; for(j=0;j8;j+) DestrByteBufferi+=(m_datai*8+j+32&0x01)(7-j); m_data表示图像现有数据,DestrByteBuffer表示提取的信息,依然是字节的形式,(m_datai*8+j+32&0x01)(7-j)表示表示将图像现有数据里面的最末一比特值取出来右移7-j个比特,再同DestrByteBufferi(初值为0)异或,以此循环即可将全部隐藏信息提取到DestrByteBuffer数组中。 具体如下图表示: (
10、三)、文件流操作:readBMP、readHide、createBMP和createFile函数在本次实验中,文件流的应用非常广泛,几乎每个函数中都有涉及。首先我们要了解,从磁盘读文件是通过语句ifsteam 识别字(文件名“)实现的,而输出到磁盘是通过语句 ofsteam 识别字(“文件名”)实现的。 如:在读取BMP图像到内存的函数readBMP中,从磁盘读取bmp图像文件是通过ifstream file(bmpname, ios:out | ios:in | ios:binary);实现的,这其中,ios:binary表示以文件二进制方式打开,ios:in表示文件以输入方式打开,ios:
11、out表示文件以输出方式打开;而在读取隐藏文件readHide函数中是类似的,ifstream hidefile(hidename, ios:binary | ios:in);但是由于在读取隐藏信息后并不会对隐藏信息做任何的修改,所以不必加ios:out,而在readBMP函数中我们是要将隐藏信息隐藏到bmp图像中的,是要对图像信息进行修改的,所以必须有ios:out实现修改后图像信息的输出。而在创建已经隐藏了信息的bmp图像createBMP函数中,ofstream dibFile(createbmp, ios:out | ios:binary);表示以二进制方式输出文件内容到磁盘。 在完成
12、文件的打开或输出后,读写二进制数据块,则使用成员函数read()和write()成员函数。它们原型如下: read(unsigned char *buf,int num); write(const unsigned char *buf,int num); read()从文件中读取 num 个字符到 buf 指向的缓存中,如果在还未读入 num 个字符时就到了文件尾,可以用成员函数 int gcount();来取得实际读取的字符数;而 write() 从buf 指向的缓存写 num 个字符到文件中,值得注意的是缓存的类型是 unsigned char *,有时可能需要类型转换。 如:在读取BMP
13、图像到内存的函数readBMP中,通过file.read(char *)m_bitmapfileheader,sizeof(BITMAPFILEHEADER);语句来读取文件头,以sizeof可自动计算该值的大小,类似地,其他数据的读取也是这样实现的;而在创建已经隐藏了信息的bmp图像createBMP函数中,是以dibFile.write(char*)m_bitmapfileheader,sizeof(BITMAPFILEHEADER);来写入数据块的,当然其他数据的写入也是这样完成的。打开的文件使用完成后一定要关闭,fstream提供了成员函数close()来完成此操作,如:file1.c
14、lose();就把file1相连的文件关闭。(四)、主函数分析: 主函数部分主要完成将上述各函数连接共同完成某项功能。首先,这个程序是基于类和对象编写的,因此我们必须要生成一个具体的对象,才能调用之前编写的类中的成员函数。其次,这次实验主要就要实现信息的隐藏以及提取验证信息已经正确隐藏,因此在主函数部分通过if条件语句实现这两种功能,当进行信息隐藏时,输入待打开的BMP图像的名字和待隐藏的文件名再调用LSBhide函数进行实现;当进行信息提取时,请输入有隐藏信息的图像名字再调用DeLSBhide函数实现。最后,为使得程序不断运行直到用户要求退出,主函数中使用了dowhile(a),这表示先执行
15、一次do语句后的程序,然后判断条件,若a为真则继续执行,为假则结束,因此我将a赋值为1,表示条件永远为真。六、实验中遇到的问题 这次实验是在网上找到的,在那个基础上进行了修改,在修改过程中遇到了如下几个问题: 首先,我想当然的以为,只需要读取BMP图像的数据区的内容即可,于是将这部分程序删除了,运行之后发现,生成的BMP图像没有任何显示,之后自己分析发现,这显然是不被允许的,文件头和信息头中包含了很多图像的信息,如:文件大小、位图高度宽度等,若没有对文件头和信息头内容进行读取,这些信息也就无法知道,自然不能构成一个完整的BMP图像。 其次,在计算隐藏文件信息量时,没有采用原程序中文件流操作的方
16、法,而是直接用for语句将待隐藏文件进行遍历算出其大小,不过这样在信息提取时出现了问题,提取信息后生成的txt全是乱码。询问老师后发现,应该是指针问题,信息隐藏时是从前向后逐比特插入的,在读取的时候是依靠指针进行信息读取的,若指针的位置出现问题,那读取的肯定也是有问题的,因此将隐藏文件信息读入缓冲区后一定要记得将指针置于文件尾hidefile.seekg(0,hidefile.beg);七、 实验结果及分析由于源代码较长,请见cpp文件;实验运行结果如下:运行后正确生成了2.BMP和2.TXT未隐藏信息的图像,1.bmp两张BMP图像如下:肉眼并不能看出其差别含有隐藏信息的图像,2.bmp提取
17、信息如下:同待隐藏信息完全一致八、对油画效果程序的理解行值这个程序也是针对24位位图图像编写的,在文件流操作方面同上述分析是一致的,它主要是通过如下程序段完成油画效果:for( i=0;irow;i+)产生两个随机数值列值for(int j=0;j=0 & i+deltaX=0 & j+deltaYcolumn)将第i行j列的R、G、B值设置为周围的R、G、B,使得这些地方的像素值相同,从而达到油画效果colorNewRij=colorRi+deltaXj+deltaY;colorNewGij=colorGi+deltaXj+deltaY;colorNewBij=colorBi+deltaXj
18、+deltaY;elsecolorNewRij=colorRij;colorNewGij=colorGij;colorNewBij=colorBij;九、实验体会本次实验并不是自己一手完成的,是在已有程序的基础上进行修改的,由于这次实验主要考虑的时24位位图图像,因此只保留了源代码中对24位位图图像的处理代码,并且将调色板等信息也一并删除了,并将所有程序代码都放在了一个cpp中,便于运行(之前的代码是将主函数和各个成员函数放在两个cpp文件中的,并单独使用了一个头文件定义类LSB)。此外,将文件的打开方式用自己惯常使用的方式进行了修改,个人觉得这样更简单,最后将主函数部分也进行了修改,用if条件语句替换了之前的switch语句。这次实验虽然不是自己完成的,但是经过这么多天的摸索,已经能够基本上了解程序的全部意思,其关键在于结构体的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 3836.20-2026爆炸性环境第20部分:具有隔离部件或组合保护等级的设备
- T/ZGZS 0311-2023无废校园创建指标体系评价规范
- T/HNNMIA 56-2023银铜带
- T/CIQA 90-2024跨境电子商务运营职业能力培养与评价规范
- T/CAQI 436-2025白酒企业零碳工厂评价规范
- T/CSCB 0018-2024细胞中ATP含量的测定
- 党员干部理想信念教育培训
- 2025~2026学年广东省惠州市惠阳区北师大版六年级上册期中数学试卷【附答案】
- 2025-2026学年江西省广丰县初中政治九年级期末上册模考历年考试题(附答案)
- PHP函数面试题及详细答案(企业真实面试专用)
- 2026年山西航空产业集团有限公司人员招聘笔试参考试题及详细答案解析
- 2026中国辅助生殖技术服务渗透率提升路径与区域市场差异调查报告
- 2026中国工业互联网安全威胁态势与防护体系建设研究报告
- 《人形机器人数据训练场建设规范》
- 2026年中级注册安全工程师《安全生产管理》模拟考试题(含答案解析)
- 2026新闻记者职业资格真题及答案
- 2026发展对象考试测试题库(附参考答案)
- 2026年广州市中考语文试卷(含答案及解析)
- 2026低压电工证考试题库及模拟考试答案(2026修订版)完整版
- 2026年智能矿山无人工作面技术知识考察试题及答案
- 冶金行业班组安全管理制度培训
评论
0/150
提交评论