基于VC++的图像处理软件模块设计(2)

2019-04-15 15:40

识。

.h和.cpp文件

在应用程序中大量应用的是以h和cpp为扩展名的文件,以h为扩展名的文件称为头文件;以cpp为扩展名的文件称为实现文件,一般说来h为扩展名的文件与以cpp为扩展名的文件是一一对应配合使用的,在h为扩展名的文件中包含的主要是类的定义,而在cpp为扩展名的文件中包含的主要是类成员函数的实现代码。 .rc文件

VC中以rc为扩展名的文件称为资源文件,其中包含了应用程序中用到的所有的windows资源,需要注意的是rc文件可以直接在VC集成环境中以可视化的方法进行编辑和修改[6]。 2.3 MFC类库

MFC,微软基础类(Microsoft Foundation Classes),实际上是微软提供的,用于在C++环境下编写应用程序的一个框架和引擎,VC++是Windows下开发人员使用的专业C++ SDK(SDK,Standard SoftWare Develop Kit,专业软件开发平台),MFC就是挂在它之上的一个辅助软件开发包,MFC作为与VC++血肉相连的部分。

微软基础类库由两部分组成:一是通常所说的C++类库,是MFC类库的主体部分,这些类构成了MFC应用程序框架。二是MFC预定义宏、全局变量和全局函数,是MFC类库的辅助部分,它们都是MFC进行Windows应用程序开发不可缺少的组成部分。MFC使得开发windows应用程序比以往任何时候都要容易,虽然我们要编写的应用程序在功能上千差万别,但是从本质上来讲,都可以划归为用户界面的设计,对文件的操作,多媒体的使用,数据库的访问等一些最主要的方面。这一点正是微软提供MFC类库最重要的原因,在这个类库中的某个对象能完成所需要的功能,这时我们只要简单地调用已有对象派生出我们自己的对象,这时派生出来的对象除了具有类库中的对象的特性和功能之外,还可以由我们自己根据需要加上所需的特性和方法,并根据需要来不断完善对象的功能。

正是由于MFC编程方法充分利用了面向对象技术的优点,它使得我们编程时极少需要关心对象方法的实现细节,同时类库中的各种对象的强大的功能足以完成我们程序中的绝大部分所需的功能,这使得应用程序中程序员所需要编写的代码大为减少,有力地保证了程序的良好的可调试性。需要指出的是MFC类库在提供的对象的各种属性和方法都是经过谨慎的编写和严格的测试,可靠性很高,这就保证了使用MFC类库不会影响程序的可靠性和正确性。

3.图像设计基础

3.1图像基础

3.1.1数字图像的基本概念

人眼看到的任何自然界的图像都是连续的模拟图像,其形状和形态表现由图像各位置的颜色所决定。色度学理论认为,任何颜色都可由红(Red)、绿(Green)、蓝(Blue)3种基本颜色按不同的比例混合得到。红、绿、蓝被称为三原色,简称RGB三原色。因此,自然界的图像可用基于位置坐标的三维函数来表示,即

f(x,y,z)=(fred(x,y,z),fgreen(x,y,z),fblue(x,y,z))) (3-1)

其中f表示空间坐标为(x,y,z)位置点的颜色,fred、fgreen、fblue分别表示该位置点的红、绿、蓝3种原色的颜色分量值。它们都是空间的连续函数,即连续空间的每—点都由一个精确的值与之相对应。

4

为了研究的方便,主要考虑平面图像。平面上每一点仅包括两个坐标值。因此,平面图像函数是连续的二维的数,即

f(x,y)=(fred(x,y),fgreen(x,y),fblue(x,y))) (3-2)

图像可以分为黑白图像和彩色图像。所谓黑白图像,就是图像中每一点都不是彩色的,即每—点的红、绿、蓝颜色分量值都相等,即

fred=fgreen=fblue (3-3)

对于黑白图像,其f(x,y)表示(x,y)位置处的灰度值。

由于计算机仅能处理离散的数据,所以如要用计算机来处理图像,连续的图像函数

[7]

必须转化为离散的数据集,这一过程叫做图像采集。图像采集由图像采集系统完成,如图3-1所示。图像采集系统包括3个基本单元,即成像系统、采样系统和量化器。

f(x,y) 成像系统 g(x,y) 景物 图像 采样图像 采样系统 gs(x,y) 量化器 ga(x,y) 数字图像

图3-1 图像采集系统

3.1.2调色板

现实世界的颜色种类是无限的,但计算机显示系统所能表现的颜色数量是有限的。因此,为了使计算机能最好地重现实际图景,就必须采用一定的技术来管理和取舍颜色。 按表现能力的不同,现代计算机的显示系统可以分为以下3种。 (1) VGA:能用640×480的分辨率同时显示16种颜色。 (2) SuperVGA:能用640×480的分辨率同时显示256种颜色 (3) 真彩色:能同时显示16777216种颜色。

所谓真彩色(True Color),是指显示出来的图像的颜色与真实世界中的颜色非常自然逼真、人眼难以区分它们的差别。通常使用RGB表示法来表现真彩色图像,即用3字节(24位)来表示—个真彩色像素的颜色值,红、绿、蓝三原色的浓度分别用一字节(8位)来表示。Windows采用该方法来表现颜色,其SDK提供一个名为RGB的宏来将不同的R、G、B颜色值转化为24位的颜色值,其原型如下所示。

COLORREF RGB(BYTE bRed, BYTE bGReen, BYTE bBlue) (3-4)

COLORREF是表示颜色值的数据类型,是一个32位的无符号长整数;bRed、bGreen和bBlue分别表示红、绿、蓝三原色的浓度,它们的类型是BYTE,长度是8位。其十六进制数据表示形式如下所示。

0x00bbggrr (3-5) 字节rr、gg、bb比分别表示红、绿、蓝三原色的浓度,最高位字节为0,用于保留与将来的系统兼容[8]。 3.1.3调色板的概念

在真彩色系统中,每一个像素的值都用24位来表示。像素值与真彩色颜色值可以一一对应,所以像素值就是所表现的颜色位。但对于仅能同时显示16色或256色的系

5

统,每一个像素仅能分别采用4位或8位来表示,像素值与真彩色颜色值不能一一对应,用像素值代表颜色值的方法将不能得到最佳的效果,而必须采用调色板技术。所谓调色板就是在16色或256色显示系统中,由图像中出现最频繁的16种或256种颜色所组成的颜色表。对这些颜色按4位或8位,即0至15或255进行编号,每一编号代表其中的一种颜色。这种颜色编号叫做颜色的索引号,4位或8位的索引号与24位的颜色值的对应表叫做颜色查找表。使用调色板的图像叫做调色板图像。它们的像素值并不是颜色值,而是颜色在调色板查找表中的索引号[9]。

为了保证Windows的基本显示界面的一致性,Windows保留了一个有20种颜色的内部系统调色板,用来绘制窗口的图标、边界和按钮等通用界面。该调色板在所有的显示设置中都保持不变。在16色的显示系统中,系统调色板通过16种颜色的抖动来产生其余4种颜色。在256色的显示系统中,Windows也保持该20种颜色的次序,其余的236种颜色由当前的调色板分配[10]。 3.2 与设备无关位图(DIB)

Windows3.1以上版本提供了对设备无关位图DIB的支持。DIB位图可以在不同的机器或系统中显示位图所固有的图像。与DDB相比而言,DIB是一种外部的位图格式,经常存储为以.BMP为后缀的位图文件(有时也以DIB为后缀)。DIB位图还支持图像数据的压缩[11]。大多数图像处理都是基于与设备无关位图(DIB)来进行讨论的,而MFC中没有处理DIB位图的类,这就给编程带来了很大困难。所以需要建立一个处理DIB位图的专用类,CDIB类,在其中封装必要而有效的处理函数。 3.2.1 DIB位图的结构

DIB位图文件的结构如图3-2所示,包括位图文件头结构BITMAPEHEADER、位图信息头结构BITMAPINFOHEADER、位图颜色表RGBQUAD和位图像素数据4部分。

位图文件头结构BITMAPEHEADER 位图信息头结构BITMAPINFOHEADER 位图颜色表RGBQUAD 位图像素数据 图3-2 DIB位图的结构

上面结构中各数据域的意义如表3-1所示。

表3-1 Windows位图结构数据域的含义 结 构 数 据 域 含 义 BITMAPFILEHEADER

BITMAPINFOHEADER

Bftype bfSize bfResrved1 bfResrved2 bfOffBits biSize biWidth biHeight

字节“BM” 文件总字节数 0 0

位图数据距文件头的偏移量 本结构大小的字节数 位图的宽度,单位为像素点 位图的高度,单位为像素点

6

RGBQUAD

biPlanes bitBitCount biCompression biSizeImage biXpelsPerMeter biYpelsPerMeter biClrUsed biClrImportant rgbBlue rgbGreen rgbRed rgbReserved

1

像素的位数(1,4,8,24) 压缩方式(0表示不压缩) 位图数据的字节数 水平分辨(像素点每米) 垂直分辨(像素点每米) 图像中使用的颜色数 图像中重要的颜色数 蓝色的比例 绿色的比例 红色的比例 0

DIB位图像素的位数可为1、4、8和24,其图像的颜色数分别为2、16、256和真彩色其中前3种具有对应的颜色表,而24位位图的颜色表为空,其像素值就是颜色值[12]。 3.2.2 定义DIB处理函数集

由于DIB位图能独立地保存固有的图像处理信息,能在不同的系统中重显其图像,因此成为Windows环境中的基本图像格式。由于MFC中没有涉及处理DIB位图的类,因此,利用Visual C++进行DIB位图编程时只能使用“非面向对象”,即直接调用Win32 SDK的有关API函数。因此,我们要定义一个处理DIB位图的专用类,比如一个名为CDib的类,在其中封装必需而且有效的DIB数据成员和处理函数。

但是,在构思这样一个类时,会遇到许多困难。因为,即使是Win32 SDK也没有为我们提供多少可以直接处理DIB位图的API函数。因此,为了实现这样的类,就必须先设计好一套处理DIB位图的完整函数集,这将是实现CDib类函数时,调用该函数集,也将使类的代码更简练。MFC的类实现也是以Win32 SDK API函数为基础的,因此在设计CDib类时,首先要设计一套对应的函数集。

定义的DIB处理函数如表3-2所示。

表3-2 DIB处理函数集

函数类型 函 数 名 功 能 CreateDIB 创建一个空的DIB CreateDefaultDIB 用当前的系统调色板创建一个空的DIB 初始化函数 DestroryDIB 释放DIB内存块

LoadDIB 从DIB文件中装载DIB数据 SaveDIB 读DIB存到文件中 ReadDIBFile 读DIB存到内存中

BytesPerLine 获取DIB每行所占的字节数 DIBlockSize 获取DIB数据块的大小

7

属性函数

DIBHeight 获取DIB高度 DIBWidth 获取DIB宽度

DIBNumColors 获取DIB的颜色数

DIBBitCout 获取DIB的图像颜色位数

FindDIB Bits 获取DIB数据块的地址(指针) PletteSize 获取DIB的调色板中的颜色表项数 PaintBitmap 显示DDB PaintDIB 显示DIB PaintDIB 显示DIB

DIBToDIBSetion 将DIB数据块转换为DIBSECTION DIBSectionToDIB 将DIBSECTION转换为DIB数据块 ConvertDIBFormat 修改的格式

显示函数 BitmapToDIB 将DDB转换为DIB

ChangeBitmapFormat 修改DDB的格式

DIBToBitmap 将DDB转换为DIB

操作函数

ChangeDIBFormat 基于当前的系统调色板修改DIB

CreateDIBPalette 创建DIB调色板

调色板函数

DisplayPalette 显示调色板

CopyPalette 拷贝调色板

GetSystemPalette 获取当前的系统调色板

PalEntriesOnDevice 获取设备的调色板表项数

CreateIdentifyPalette创建等同调色板

捕获函数

MapDIBColorsToPalette按指定的调色板映射DIB的颜色 CopyScreenToBitmap 将屏幕显示转换为一个DDB

CopyWindowToBitmap 将指定窗口的显示转换为一个DDB

CopyClientRectToBitmap将指定窗口用户区的指定区域显示转换 CopyScreenToDIB 为一个DDB

CopyWindowToDIB 将指定窗口的显示转换为一个DIB

为了使用方便,将上述函数的声明及相关的常量、宏及数据类型定义放在文件DIBAPI.H中,而将所有函数的代码放在文件DIBAPI.CPP中。 3.2.3 CDib类的设计目标 3.2.3.1功能

实现图像处理的基础是设计一个解释位图的DIB类(名CDib),基本功能如下所述。 (1) 多种形式的构造函数,包括创建空DIB、从DDB创建、从DIB句柄创建、从DIB数据块指针创建及从屏幕或窗口显示创建等; (2) 支持拷贝构造函数和赋值运算; (3) DIB文件的读、写操作; (4) 从资源中装载DIB位图; (5) DIB的显示;

(6) 提供DIB的空间、颜色和格式特征等信息; (7) DDB与DIB的相互转换; (8) DIB格式转换; (9)IB调色板操作;

(10) 能获取DIB位图数据的句柄; (11) 能生成DIB数据的拷贝。

8


基于VC++的图像处理软件模块设计(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:绍兴市水务集团有限公司2016年度第一期超短期融资券募集说明书

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: