文档视界 最新最全的文档下载
当前位置:文档视界 › 数字图像处理毕业论文

数字图像处理毕业论文

数字图像处理毕业论文
数字图像处理毕业论文

毕业论文声明

本人郑重声明:

1.此毕业论文是本人在指导教师指导下独立进行研究取得的成果。除了特别加以标注地方外,本文不包含他人或其它机构已经发表或撰写过的研究成果。对本文研究做出重要贡献的个人与集体均已在文中作了明确标明。本人完全意识到本声明的法律结果由本人承担。

2.本人完全了解学校、学院有关保留、使用学位论文的规定,同意学校与学院保留并向国家有关部门或机构送交此论文的复印件和电子版,允许此文被查阅和借阅。本人授权大学学院可以将此文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存和汇编本文。

3.若在大学学院毕业论文审查小组复审中,发现本文有抄袭,一切后果均由本人承担,与毕业论文指导老师无关。

4.本人所呈交的毕业论文,是在指导老师的指导下独立进行研究所取得的成果。论文中凡引用他人已经发布或未发表的成果、数据、观点等,均已明确注明出处。论文中已经注明引用的内容外,不包含任何其他个人或集体已经发表或撰写过的研究成果。对本文的研究成果做出重要贡献的个人和集体,均已在论文中已明确的方式标明。

学位论文作者(签名):

年月

关于毕业论文使用授权的声明

本人在指导老师的指导下所完成的论文及相关的资料(包括图纸、实验记录、原始数据、实物照片、图片、录音带、设计手稿等),知识产权归属华北电力大学。本人完全了解大学有关保存,使用毕业论文的规定。同意学校保存或向国家有关部门或机构送交论文的纸质版或电子版,允许论文被查阅或借阅。本人授权大学可以将本毕业论文的全部或部分内容编入有关数据库进行检索,可以采用任何复制手段保存或编汇本毕业论文。如果发表相关成果,一定征得指导教师同意,且第一署名单位为大学。本人毕业后使用毕业论文或与该论文直接相关的学术论文或成果时,第一署名单位仍然为大学。本人完全了解大学关于收集、保存、使用学位论文的规定,同意如下各项内容:按照学校要求提交学位论文的印刷本和电子版本;学校有权保存学位论文的印刷本和电子版,并采用影印、缩印、扫描、数字化或其它手段保存或汇编本学位论文;学校有权提供目录检索以及提供本学位论文全文或者部分的阅览服务;学校有权按有关规定向国家有关部门或者机构送交论文的复印件和电子版,允许论文被查阅和借阅。本人授权大学可以将本学位论文的全部或部分内容编入学校有关数据库和收录到《中国学位论文全文数据库》进行信息服务。在不以赢利为目的的前提下,学校可以适当复制论文的部分或全部内容用于学术活动。

论文作者签名:日期:

指导教师签名:日期:

摘要

边缘检测的概念,是使用数学方法提取图像像元中具有亮度值(灰度)空间方向梯度大的边、线特征的过程。许多工作属于在一个图像中发现有意义的强度变化的能力的算法的设计已完成。这项工作的许多动机来自需要产生保持图像重要的结构信息的相对紧密的描述。这些信息对创造分割和使边缘检测对应用的一种大的品种关键的对象识别算法是很有用处的。这项目是描述边缘检测的过程和试图实时并且总结其至关重要的角色的图像处理。

边缘检测是一种基本的和重要的话题在计算机视觉和图像处理。在这篇文章中我们讨论了几种数字图像处理技术应用于边缘特征提取。首先,利用小波变换用于图像来去除噪声的采集。第二,一些边缘检测算子微分边缘检测等,原木边缘检测,精明的边缘检测和二进制形态进行了分析。然后根据仿真结果,分析了各类高速船优缺点。这些边缘检测算子进行了比较。结果表明,二元形态学算子能取得更好的边缘特征。最后,为了获得清晰的、完整的图像轮廓的方法,并给出了边境关闭。实验过程中,边缘检测后,用本文方法是可行的

关键词:Terms-Edge检测、数字图像处理、小波分析操作员

Abstract

The concept of edge detection is of great consequence to a variety of topics considered in image processing. Much work has been done pertaining to the design of algorithms capable of detecting significant intensity changes present in an image. The motivation for much of this work comes from the need to generate compact descriptions which retain the image’s important structural information. This information is imperative to the creation of segmentation and object recognition algorithms making edge detection key to a large variety of applications. This project is an attempt to describe the process of edge detection and to summarize its crucial role in image processing.

Edge detection is a basic and important subject in computer vision and image processing. In this paper we discuss several digital image processing techniques applied in edge feature extraction. Firstly, wavelet transform is used to remove noises from the image collected. Secondly, some edge detection operators such as Differential edge detection, Log edge detection, Canny edge detection and Binary morphology are analyzed. And then according to the simulation results, the advantages and disadvantages of these edge detection operators are compared. It is shown that the Binary morphology operator can obtain better edge feature. Finally, in order to gain clear and integral image profile, the method of bordering closed is given. After experimentation, edge detection method proposed in this paper is feasible.

Index:Terms-Edge detection, digital image processing, operator, wavelet analvsis

毕业设计(论文)原创性声明和使用授权说明

原创性声明

本人郑重承诺:所呈交的毕业设计(论文),是我个人在指导教师的指导下进行的研究工作及取得的成果。尽我所知,除文中特别加以标注和致谢的地方外,不包含其他人或组织已经发表或公布过的研究成果,也不包含我为获得及其它教育机构的学位或学历而使用过的材料。对本研究提供过帮助和做出过贡献的个人或集体,均已在文中作了明确的说明并表示了谢意。

作者签名:日期:

指导教师签名:日期:

使用授权说明

本人完全了解大学关于收集、保存、使用毕业设计(论文)的规定,即:按照学校要求提交毕业设计(论文)的印刷本和电子版本;学校有权保存毕业设计(论文)的印刷本和电子版,并提供目录检索与阅览服务;学校可以采用影印、缩印、数字化或其它复制手段保存论文;在不以赢利为目的前提下,学校可以公布论文的部分或全部内容。

作者签名:日期:

前言

边缘是一套那些有灰色像素的阶跃变化和顶层变化,二者之间的对象和背景、对象和对象、区域、地区之间和克莱门特和宽厚。indwells边总是在两个相邻地区都有不同的灰色的水平。这是由于灰色的水平是不连续的。边缘检测是一种基于范围不连续性的图像分割新方法,。图像的边缘检测是一种基本的内容,包括图象处理与分析,也是一种问题,即完全无法解决为止。当图像是后天获得的,这个因素产生了如投影、混合、变异和噪声。这些因素带来图像特征的模糊和变形,因而很难提取图像特征。另外,由于这样的因素同样也很难去检测边缘。该方法是已被研究的图像边缘和轮廓特征的检测与提取的热点领域出现的图像处理和分析技术。

边缘特征提取已应用于许多领域,有着广泛的应用前景。本文主要讨论了关于优势和劣势的几个边缘检测算子,并据此在Visual C++中编程实现。

目录

目录 ............................................................. VI 第1章数字图像处理概述.. (1)

1.1数字图像处理系统概述 (1)

1.2数字图像处理系统 (2)

第2章开发工具Visual C++6.0简介 (4)

2.1V ISUAL C++开发工具的概述 (4)

2.2VC作为面向对象设计的原因及其优点 (4)

2.3框架和文档—视结构 (5)

第3章 CDIB类的构造 (9)

3.1CDIB类构造的概述 (9)

3.2几种重要的操作函数 (12)

第4章图像边缘检测比较 (15)

4.1图像边缘检测的基本步骤 (15)

4.2图像边缘检测基本算子与实现 (15)

4.3边缘检测算法应用与性能比较 (24)

第5章系统测试 (27)

5.1系统测试的概述 (27)

5.2测试的实施 (27)

结论 (29)

参考文献 (30)

致谢 (31)

第1章绪论

1.1 数字图像处理系统概述

“图”是物体透射光或反射光的分布,“像”是人的视觉系统对图的接收在大脑中形成的印象或认识。图像是两者的结合。图像处理就是对图像信息进行加工处理,以满足人的视觉心理和实际应用的需要。简单的说,依靠计算机对图像进行各种目的的处理我们就称之为数字图像处理,其英文名称是“Digital Image Processing”。早期的数字图像处理的目的是以人为对象,为了满足人的视觉效果而改善图像的质量,处理过程中输入的是质量差的图像,输出的是质量好的图像,常用的图像处理方法有图像增强、复原等[1]。随着计算机技术的发展,有一类图像处理是以机器为对象,处理的目的是使机器能够自动识别目标,这称之为图像的识别,因为这其中要牵涉到一些复杂的模式识别的理论。总的来说,数字图像处理包括以下几项内容。

1.点运算

点运算主要是针对图像的像素进行加,减,乘,除等运算。图像的点运算可以有效的改变图像的直方图分布,这针对提高图像的分辨率以及图像均衡都是非常有益的。

2.几何处理

几何处理主要包括图像的坐标转换,图像的移动,缩小,放大,旋转,多个图像的配准以及图像扭曲校正等。几何处理是最常见的图像处理手段,几乎是任何图像处理软件都提供了最基本的图像缩放功能。

3.图像增强和复原

图像增强和复原的目的是为了提高图像的质量,去除噪声、提高图像的清晰度等。图像增强主要是突出图像中感兴趣的目标部分,如强化图像高频分量,课使图像中的物体轮廓清晰,细节明显;而强化图像低频分量,可减少图像中噪声的影响等。图像复原则要求对图像降质的成因有一定的了解,根据降质过程建立降质模型,然后采用某种滤波方法,恢复或重建原来的图像。

4.图像时域—频域变换

图像变换就是通过时域和频域的变换找到其中的特征,再加以变换的过程。傅立叶变换是最基础的图像变换。在傅立叶变换基础上又有离散余弦变换、沃尔什—哈达玛变换和小波变换等。

5.图像形态学处理

图像形态学是数学形态学的延伸,是一门独立的研究科学。利用图像学处理技术,可以实现图像的腐蚀,细化,和分割等效果。一般图像分割有两种情况,一是图像边缘检测,二是区域分割。边缘检测是最常用的方法,主要是通过边缘检测算子、模板和曲面拟合来达到图像分割的目的。

6.图像的编码

图像编码研究是属于信息论中信源编码的范畴,其主要的宗旨是利用图像信号的统计特性及人类视觉特性对图像进行高效编码,从而达到压缩的目的,图像编码是数字图像处理中一个经典的研究范畴,有60多年的历史,目前,已经制定了多种编码标准,如H.261,JEPG,MEPG等。

7.图像分析和理解

图像分析和理解是图像处理技术的发展和深入,也是人工智能和模式识别的一个分支。在图像分析和理解中主要有图像的描述和图像的分类识别。图像分类识别属于模式识别(当今的模式识别方法有3种:统计识别法,句法结构,模式识别法,和模糊识别法)的范畴,其主要内容是图像经过某些预处理(增强、复原、压缩)后,进行图像分割和特征提取,从而进行分类判别[2]。

1.2 数字图像处理系统

1.2.1数字图像处理系统硬件

早期的数字图像处理系统为了提高处理速度、增加容量都采用大型机。随着计算机性价比(性能价格比)日新月异的提高,以小型机为主的微型图像处理系统得到发展。主机为PC机,配置以图像采集卡及显示设备就构成了最基本的微型图像处理系统。目前,国产的CA540、VP32、FGCT11010N8、CA-CPE-3000等图像板研制成功并已商品化。微型图像处理系统成本低、应用灵活。便于推广。特别是微型计算机的性能逐年提高,使得微型图像处理系统的性能也不断升级,加之软件配置丰富,使其更具实用意义[3]。

1.显示卡显示卡是记忆和保存图像的地方,通常,存储的凸现要随时显示在显示器上。PC机多采用800×600或1024×768个像素点。通常在图像处理装置中,灰度值红(R)、绿(G)、蓝(B)各占8位(bit),共计24位,可以表示1670万种颜色,这种显示卡称为真彩色显示卡。

2.计算机图像处理的主要特点是数据量大、运算时间长,因而对系统硬件配置要求较高。目前,在PC机上配置奔腾P4 2.4G以上CPU、512MB内存。80G 以上硬盘的计算机已属常见,计算速度大幅度提高,可与几年前的大型机媲美。为了加快图像的显示和处理速度,用于图像处理的PC机配置应尽可能高一些。

3.图像存贮装置图像数据量庞大,早期其存储成为问题。到目前为止,除

了大容量磁盘可供存储图像数据之外,MO、CD、DVD等光学存储装置以及SAN、NAS等网络存储系统,为存储海量图像数据提供了极好的支持。

1.2.2 数字图像处理软件系统

微型图像处理系统既包含硬件设备,也需要一定的软件环境支持。目前,图像处理系统平台多为Microsoft Windows或X-Windows,开发的主流工具Microsoft公司的VC++。这是因为VC++是一种具有高度综合性能的软件开发工具,用它开发出来的程序有着运行速度快、可移植能力强等优点。本文中的复原方法就是在Windows平台下,用VC++ 6.0实现的。

第2章开发工具简介

2.1 Visual C++开发工具的概述

VC++是Microsoft公司推出的开发Win32应用程序(Windows

95/98/2000/XP/NT)的面向对象的可视化集成工具。随着VC++所提供的Microsoft 基础类库(Microsoft Foundation Class Library,简写为MFC),对Windows95/NT所用的Win 32应用程序接口(Win 32 Application Programming Interface-API)进行了彻底的封装,从而可以使用完全的面向对象的方法来进行Win 32应用程序的开发,这样大大缩短了应用程序开发周期,降低了开发成本,也将程序员从大量的复杂劳动中解放出来[4]。

VC++ Developer Studio 包含有编写程序代码的文本编辑器、设计用户界面(菜单、对话框、图标等)的资源编辑器,建立项目配置的项目管理器、检查程序错误的集成调试器等工具,同时它还提供了功能强大的应用程序向导工具AppWizard和类向导工具ClassWizard。AppWizard用于生成各种不同类型的具有Windows界面风格的应用程序的基本框架,在生成应用程序框架后,使用ClassWizard 便可轻松完成创建新类、定义消息处理函数、重载虚拟函数等操作。

VC++的资源编辑器能以所见所得的形式直接编辑应用程序用户界面,为所有资源分配ID标识号。ClassWizard能把对话框模板与自动生成的类定义或与已有的类代码连接起来,为菜单项、控件等资源生成空的处理函数模板,创建自消息映射的编程工作便简化为用资源编辑器直观的设计界面,完善对话框类代码。在空的处理模板出填写响应用户操作的代码,是一种完善的可视化编程方法。

2.2 VC++优点

1.VC提供面向对象的完整语法与语义

面向对象程序具有抽象性、封装性、继承性与多态性等特点,这些特点都体现在类的定义中。

2.VC还是一种结构化的程序设计语言

面向对象是从面向过程发展而来的,它没有抛弃面向过程,而是对其扬长避短。因此,利用VC开发应用程序,既可以采用面向过程的方法,也可以采用面向对象的方法。

3.VC中的MFC是理解面向对象语法与语义的最好平台

MFC是Microsoft的基本类库,里面包含大量的与计算机系统有关的类。通过这些类的使用,可以帮助用户理解面向对象程序设计的特点。

Visual C++ 不仅仅是一个编译器。它是一个全面的应用程序开发环境,使用它你充分利用具有面向对象特性的C++来开发出专业级的Windows 应用程序。Visual C++作为一种程序设计语言,它同时也是一个集成开发工具,提供了软件代码自动生成和可视化的资源编辑功能。在使用Visual C++开发应用程序的过程中,系统为我们生成了大量的各种类型的文件[5]。

Visual C++采用的框架是MFC。MFC不仅仅是人们通常理解的一个类库。你如果选择了MFC,也就选择了一种程序结构,一种编程风格。MFC是一个很大的、扩展了的C++类层次结构,它能使开发Windows应用程序变得更加容易。MFC是在整个Windows家族中都是兼容的,也就是说,无论Windows3.x、Windows95还是Windows NT,所使用的MFC是兼容的。每当新的Windows版本出现时,MFC 也会得到修改以便使旧的编译器和代码能在新的系统中工作。MFC也回得到扩展,添加新的特性、变得更加容易建立应用程序。使用MFC的最大优点是它为你做了所有最难做的事。MFC中包含了上成千上万行正确、优化和功能强大的Windows代码。你所调用的很多成员函数完成了你自己可能很难完成的工作。从这点上讲MFC极大地加快了你的程序开发速度。

由于MFC编程方法充分利用了面向对象技术的优点,它使得我们编程时极少需要关心对象方法的实现细节,同时类库中的各种对象的强大功能足以完成我们程序中的绝大部分所需功能,这使得应用程序中程序员所需要编写的代码大为减少,有力地保证了程序的良好的可调试性。

最后要指出的是MFC类库在提供的对象的各种属性和方法都是经过谨慎的编写和严格的测试,可靠性很高,这就保证了使用MFC类库不会影响程序的可靠性和正确性。

2.3 框架和文档—视结构

基于MFC的应用程序框架(Application Framework)是定义可程序结构的MFC类库中类的集合,它是VC++ 编辑的骨架。运用MFC应用程序框架具有以下优点:

1.标准化的程序结构和用户接口:这对具有标准用户界面的Win 32程序来说。可以极大的减轻程序员的负担,使程序员不必过多的考虑界面,而把主要精力放在程序设计上,以提高程序设计的效率。

2.框架产生的程序代码短,运行速度快,具有很大的灵活性。

3.MFC封装了Win 32 SDK中的几乎所有的函数,能够实现Win 32系统的

任务功能。

MFC框架的核心是文档-视结构(Document-View Architecture)。简单的说,文档-视结构就是将数据和对数据的观察相分离,文档仅处理数据的读、写等操作,视则是显示和处理数据的窗口,视可以操作文档中的数据。

MFC框架的基本结构包括应用程序对象、主框架窗口、文档、视等,框架通过命令消息将它们结合在一起,共同对用户的操作做出响应。

应用程序的对象类由CWinApp派生,一个应用程序有且仅有一个应用程序对象,它负责应用程序实例的初始化和进程结束时的资源清除,以及创建和管理应用程序所支持的所有文档模板的工作。

主框架窗口是应用程序的主窗口。MFC框架定义了两种基本的主框架窗口类,即单文档接口SDI(Single Document Interface)主框架窗口类和多文档接口MDI(Multiple Document Interface)主框架窗口类。对于SDI,视是主窗口的子窗口;对于MDI必须从CMDIChildWnd派生出主框架窗口的子窗口,视是该子窗口的子窗口。

文档类由Document类派生,文档是一个应用程序数据元素的集合,它构成应用程序所使用的数据单元,另外,它还提供了管理和维护数据的手段。文档是一种数据源,数据源由很多种,最常见的是磁盘文件,但它不一定是一个磁盘文件,文档的数据源也可以来自串行口,网络或摄像机输入信号等,视类从CView 或其子类(CEditView、CFormView、CRecordView、CScrollView等)派生,是数据的用户窗口,为用户提供了文档可视的数据显示,它将文档的部分或者全部内容显示在窗口中。视还给用户提供了一个与文档中的数据进行交互的界面,它把用户的输入转化为对文档中数据的操作。每个文档都会由一个或多个视显示,一个视既可以输出到屏幕窗口中,也可以输出到打印机上。图2.1表示了MFC框架结构中各对象之间的关系。应用程序管理一个(SDI)或多个(MDI)文档模板,每个文档模板管理一个或者多个文档。用户通过主框架窗口中的视观察和处理拉数据。

文档-视结构大大简化了多数应用程序的设计开发过程。它带来的好处主要有:

1.将数据操作和数据显示、用户界面分离。这是一种“分而治之”的思想,这种思想使得模块划分更加合理、模块独立性更强,同时也简化了数据操作和数据显示、用户界面设计工作。文档只负责数据管理,不涉及用户界面;视只负责数据输出与用户界面的交互,可以不靠率应用程序的数据是如何组织的。甚至当文档中的数据结构发生变化时也不必改动视的代码。

(a) SDI 框架结构

(b)MDI 框架结构

图2.1 MFC 应用程序框架结构

2.MFC 在文档-视结构中提供了许多标准操作界面,包括新建文件、打开文件、保存文件、打印等,减轻了用户的工作量。用户不必再编写这些重复的代码,从而可以把更多的精力放到编写应用程序特定功能的代码上

(主要是从数据主框架窗口

源中读取数据和显示)。

3.支持打印的打印预览,用户无需编写代码或只需要编写很少的代码,就可以为应用程序提供打印和打印预览功能。

由于文档-视结构功能强大,因此一般用VC++进行程序设计时都首先使用AppWizard生成基于文档-视结构的单文档或多文档应用程序框架,然后在其中添加自己需要的代码,完成应用程序的特定功能。

第3章 CDIB类的构造

3.1 CDIB类构造的概述

3.1.1 BMP图像格式的基本内容

在本次毕业设计中,采用的是一种标准的图像格式BMP。BMP格式是Windows窗口系统交换图形、图像数据的一种标准。

图像文件由文件头和图像数据两部分组成。文件头的内容由制作该图像文件的公司决定。一般包括文件类型、文件制作者、文件制作时间、版本号、文件大小等内容。各个文件的制作还牵涉到图像文件的压缩方式,涉及到压缩效率。

BMP格式的图像文件又可以分为许多种类,如真彩色位图、256色位图,采用RLE(游程编码)压缩格式的BMP位图等等。在实际的工程应用和图像算法效果验证中经常要处理的是256级并且是没有压缩的BMP灰度图像,例如通过黑白采集卡采集得到的图像就是这种格式。

这种文件格式就是每一个像素用8bit表示,显示出来的图像是黑白效果,最黑的像素的灰度(也叫作亮度)值为“0”,最白的像素的灰度值为“255”,整个图像各个像素的灰度值随机的分布在“0”到“255”的区间中,越黑的像素,其灰度值越接近于“0”,越白(即越亮)的像素,其灰度值越接近于“255”;与此对应的是在该文件类型中的颜色表项的各个RGB分量值是相等的,并且颜色表项的数目是256个。真彩色图像要复杂一些,表示图像时,常用的图像彩色模式有RGB模式、CMYK模式和HIS模式,一般情况下我们只使用RGB模式,R 对应红色,G对应绿色,B对应蓝色,它们统称为三基色,这三中色彩的不同搭配,就可以搭配成各种现实中的色彩,此时彩色图像的每一个像素都需要3个样本组成的一组数据表示,其中每个样本用于表示该像素的一个基本颜色。

BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。如表3-1所示:

表3-1 BMP文件的组成

位图文件头BITMAPFILEHEADER

位图信息头BITMAPINFOHEADER

调色板Palette

实际位图数据ImageData

文件头主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信息;位图信息头包含图象的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩、图像所用的颜色数等信息。颜色信息包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为真彩色,即图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操作调色板。文件中的数据块表示图像的相应的像素值,需要注意的是:图像的像素值在文件中的存放顺序为从左到右,从下到上,也就是说,在BMP文件中首先存放的是图像的最后一行像素,最后才存储图像的第一行像素,但对与同一行的像素,则是按照先左边后右边的的顺序存储的;另外一个需要关注的细节是:文件存储图像的每一行像素值时,如果存储该行像素值所占的字节数为4的倍数,则正常存储,否则,需要在后端补0,凑足4的倍数。一般256色位图BMP文件头(除数据外)总共有1078个字节。

下面详细说明上述三个结构在Windows.h中都有定义[6]。

1.位图文件头(BITMAPFILEHEADER):

VC++对位图文件头的定义:

Typedef struct tagBITMAPFILEHEADER

{

WORD bfType;// 指定文件类型,必须是0X424D,即字符串“BM”

WORD bfSize;// 指定文件大小

WORD bfReserved1;// 保留字,不予考虑

WORD bfREserved2;// 保留字,不予考虑

DWORD bfOffBits;// 从文件头到实际的位图数据的偏移字节数

}BITMAPFILEHEADER, FAR*LP BITMAPFILEHEADER,

*PBITMAPFILEHEADER;

2.位图信息头(BITMAPFILEHEADER):

VC++对位图文件头的定义:

Typedef struct tagBITMAPINFOHEADER

{

DWORD biSize;// 指定结构长度

LONG biWidth;// 图像宽度

LONG biHeight;// 图像高度

WORD biplanes;// 必须是1

WORD bitCount; //指定表示颜色时要用到的位数。常用值有1(黑白//二色图)、

4(16色图)、8(256色图)、24(真彩色图)。

DWORD biCompression;// 指出位图是否压缩

DWORD biSizeImage;// 实际位图数据所占用的字节数

LONG biXPelsPerMeter;// 水平分辨率

LONG biYPelsPerMeter;// 垂直分辨率

DWORD biClrUsed;// 指定本图像实际用到的颜色数,若该值为0则为2的

bitCount次方

DWORD biClrImportant;// 指定本图像最重要的颜色数,若该值为0,则认为

所有颜色都是重要的。

}BITMAPINFOHEADER;

3.调色板(Palette)

VC++对调色板的定义:

Typdef struct tagRGBQUAD

{

BYTE rgbBlue;

BYTE rgbGreen;

BYTE rgbRed;

BYTE rgbReserved;

}RGBQUAD;

其中rgbReServed为保留值。

3.1.2 CDIB类

前面只是为图像文件提供基本的知识和工具,还没具体涉及到图像操作的具体内容,这里先构造一个图像操作的类,即CDIB类,它是进行图像处理的“工具箱”。

根据图像处理的需要,表3-2列出了CDIB类的一些主要成员函数。

表3-2 CDIB类的部分成员函数

3.2 几种重要的操作函数

1.返回DIB对象像素的起始位置(FindDIBBits())

该函数原型声明如下:

LPBYTE FindDIBBits(LPBYTE lpbi);

该函数只有一个入口参数lpbi,为一个指向DIB对象的指针,通过计算而返回一个指向DIB图像像素起始位置的指针。计算过程也非常简单,只涉及到指针的移动:

……

Return (lpbi+*(LPDWORD) lpbi+PaletteSize(lpbi))

2.负责获取DIB位图的宽度(DIBWidth())

该函数的原型为:

DWORD DIBWidth(LPYTE lpDIB)

入口参数lpbi给出了一个指向DIB对象的指针,在计算完成后返回双字长度的DIB位图宽度。对于不同格式的DIB,其图像宽度的计算方式也有所不同,具体为针对Windows 3.0格式DIB和针对其他格式DIB的两种不同的计算方式。具体计算过程如下:

//返回DIB图像的宽度

if(IS_WIN 30_DIB(lpDIB))

{

//对于Windows 3.0 DIB,返回lpbmi->biWidth

return lpbmi->biWidth;

}

else

{

//对于其他格式的DIB,返回lpbmc->bcWidth

return (DWORD) lpbmc->bcWidth;

}

3.获取DIB位图的高度(DIBHeight())

函数原型为:

DWORD DIBHeight(LPBYTE lpDIB);

函数入口参数lpDIB为一指向DIB对象的指针,计算完成后返回双字型的DIB位图高度,具体实现思路和DIBWidth()基本类似,也是需要根据不同的DIB 格式做不同的计算。具体实现过程如下:

//返回DIB图像的高度

if(IS_WIN 30_DIB(lpDIB))

{

//对于Windows 3.0 DIB,返回lpbmi->biHeight

return lpbmi->biHeight;

}

else

{

//对于其他格式的DIB,返回lpbmc->bcHeight

return (DWORD) lpbmc->bcHeight;

}

4.获取DIB位图的位深度(DIBBitCount())

函数原型为:

WORD DIBBitCount(LPBYTER lpbi);

入口参数lpbi为指向DIB对象的指针,函数最终返回DIB位图的位深度。函数实现时根据是否是Windows 3.0格式的DIB,而决定是从BITMAPINFOHEADER结构的数据成员biBitCount中获取,还是从BITMAPCOREHEADER结构的数据成员bcBitCount中获取。具体过程如下://读取像素的位数

if(IS_WIN 30_DIB(lpbi))

{

//读取biBitCount值

nBitCount=((LPBITMAPINFOHEADER) lpbi) ->biBitCount;

}

else

{

//读取biBitCount值

nBitCount=((LPBITMAPCOREHEADER) lpbi) ->bcBitCount;

}

5.负责DIB对象文件的保存(SaveDIB())

BOOL SaveDIB(HDIB hDib,Cfile&file);

入口参数hDib和file分别为保存的DIB和保存的文件对象。函数执行成功将返回True,否则返回False或者抛出CfileException异常DIB文件的保存主要分为对文件头的保存和对像素点阵的保存,前者可通过结构BITMAPFILEHEADER和BITMAPINFOHEADER加以描述,将其数据成员填充

相关文档