一、本课题的研究意义,国内外研究现状、水平和发展趋势 本系统的图像处理就是利用一系列的操作来改变图像的像素,以达到一定的目标。在图像处理系统的图像处理、图像分析、图像理解三个阶段中图像处理最为基本,而也尤为重要,因为这个阶段的工作关系到后面其他的操作。在计算机水平大大提高的基础上,图像处理在实际应用中也得到的很大的发展和利用,本系统是建立在图像处理之上,在实际中的应用得到更好的开发,也让图像分析,图像理解阶段得到更好的处理条件,从而让图像处理在实际中得到更多更广的利用。 我国科学计算可视化技术的研究开始于90年代初。由于数据可视化所处理的数据量十分庞大,生成图像的算法又比较复杂,过去常常需要使用巨型计算机和高档图形工作站等。因此,数据可视化开始都在国家级研究中心、高水平的大学、大公司的研究开发中心进行研究和应用。近年来,随着PC功能的提高、各种图形显卡以及可视化软件的发展, 可视化技术已扩展到科学研究、工程、军事、医学、经济等各个领域。随着Internetr 兴起,信息可视化技术方兴未艾。我国在80年代就开始进行科学计算可视化技术的研究和应用。至今,我国不论在算法方面,还是在油气勘探、气象、计算力学、医学等领域的应用方面,都已取得了一大批可喜的成果。但从总体上来说,与国外先进水平还有相当的差距,特别是在商业软件方面,还是空白。因此,组织力量开发可视化商业软件,并通过市场竞争,促使其逐步成熟,已成为当务之急。 二、本课题的基本内容,预计可能遇到的困难,提出解决问题的方法和措施 (一):系统设计采用了C++这门目前非常成熟的基于面向对象的计算机程序设计语言,开发工具选用Visual C++6.0。操作系统选用Windows XP等。所阐述的可视化图像处理系统演示程序的主要功能是对BMP图像的处理,主要有图像的基本操作:打开,关闭,保存;图像的基本处理:放大、缩小、位移、2值化处理、旋转、灰度拉伸、中值滤波、边缘提取、直方图 ,小波交换,傅立叶交换。 课题难点在于: (1) 要利用计算机对数字化图像进行处理,首先要对图像的文件格式要有清楚的认识,因为自然界的图像以模拟信号的形式存在,在用计算机进行处理以前,首先要数字化;如果用户想要生成目标图像文件,必须根据文件的格式做相应的处理。 (2) 如何表示有关的知识并以恰当的方式引入图像处理。由于图像处理任务的复杂性,目前要找出一个通用的方法适应各种情况是几乎不可能的。另一方面,在建立普适的图像处理方法时,往往会忽略某类图像具有的特定属性。我们利用研究者提出基于对象图像处理的概念:限定图像处理的对象为一类物体(BMP灰度图像),考察对象的共有属性(称为先验),并将其结合到图像处理的任务中以提供更多的信息,从而提升图像处理的性能、提高处理效果。从而解决这个难题并更能体现图像处理的可操作性及正确性。 (二):课题具体分工 廖文帅:关联分析(推荐系统) 需求分析, 系统构架 代码编写 打开、关闭、保存 直方图 傅立叶变换 小波交换 李炳进:需求分析 系统构架 代码编写 放大、缩小、位移、旋转 2值化处理 灰度拉伸 中值滤波 边缘提取 (三):工作进度和日程安排 2005-3-26 ------------ 2005-4-10 需求分析 2005-4-11 ------------ 2005-4-20 代码设计 2005-4-14 ------------ 2005-4-27 编码阶段 2005-4-28 ------------ 2005-5-1 测试阶段 2005-5-2 ------------ 2005-5-14 写论文 三.本课题拟采用的研究手段(途径)和可行性分析 C++是Windows编程的一个重要工具,与Windows的紧密结合使它在软件底层开发上占有非常大的优势。Visual C++具有与Windows的紧密结合、强大的类库支持和类改造能力、高效率的运行速度等优点。 Windows操作系统界面友好,操作简便,应用最为广泛。作为面向用户的图像处理系统,为了方便程序的开发和程序的使用,选择Windows环境。 由于个人计算机技术的快速发展,图像处理越来越贴近实际的生活。以前只有在高级计算机才能处理的图像,现在用个人计算机便能处理。图像处理技术发展至今,已经非常成熟,而许多成型的图像处理软件在软件市场推出以来也完全能让用户满意。 本图像处理系统设计是可行的。 1—4 周: 从网上及书本了解关于图像处理的知识,学习图像处理技术,写开题报告。 5—6 周: 构造系统的总体框架,偿试编写一些代码及设计小程序。 7—8 周: 开始编写代码并着手构建程序。 9—11 周: 总体系统程序设计。 12—13周: 对系统进行测试,并改正其中的一些错误。 14—15周: 写毕业论文,进行答辩。 四、参考文献 [1] 吕凤军.数字图像处理编程入门.北京:清华大学出版社.2000年 [2] 周长发.精通Visual C++图像编程.北京:电子工业出版社.2000年 [3] 周长发.多媒体计算机技术开发与应用.北京:电子工业出版社.1995年 [4] 伍俊良 编著.VC++课程设计与系统开发.北京:清华大学出版社. 2002年11月1日 [5] 杨淑莹 编著. 边奠英主审.VC++图象处理程序设计.北京:清华大学出版社、 北方交通大学出版社. [6] teve Rimmer 著.木杉等译.Windows图象处理实用技术和范例. 北京:学苑出版社. 1994年 [7] 崔屹.数字图象处理技术与应用.北京:电子工业出版社. 1997年 [8] Scott Stanfield 等著.华译工作室译.Visual C++ 开发人员指南.北京:机械工业出版社.西蒙与舒斯特国际出版公司. 1997年 [9] 陈兵旗、孙明 编著.Visual C++ 实用图像处理. 北京:清华大学出版社. 2004年3月 [10] 林锐 著.高质量C++/C编程指南.北京:电子工业出版社,2002年 第四章 系统设计 第一节 总体设计 一、流程分析 图像处理系统将流程分为三个阶段,首先是图像处理阶段,第二是图像分析阶段,第三是图像理解阶段。图像处理阶段主要是在像素级上进行处理,进行图像的几何校正,图像的灰度变换处理,图像噪声滤除的平滑处理,目标物体边界的锐化处理等。这些处理很重要,如果这阶段处理不好,后面的工作根本无法展开。图像分析阶段主要对图像里感兴趣的目标进行检测、分割、特征和测量,分析的结果能为用户提供描述图像目标特点和性质的数据,把原来以像素描述的图像转变成比较简洁的非图像方式的描述。图像理解阶段主要通过对图像里各目标的性质和它们之间相互关系的研究,对描述抽象出来的符号进行运算,了解把握图像内容并解释原来的客观场景,提供客观世界的信息,指导和规化行为,其处理过程和方法与人类的思维推理可以有许多类似之处。 由于时间及能力的原因,本次的程序设计只达到了图像处理阶段,完成了图像处理中的打开、关闭、保存、直方图、傅立叶变换、小波交换等处理;数字图像处理是现代图像处理的主要方法,具有再现性好、精度高、适用面广和灵活性大等优点。 本文所作图像处理系统设计总体框架流程如图4-1所示: 图4-1 二、功能框架结构 系统设计总体框架: (1) 打开图像 (2) 决定处理方式 (3) 调用图像处理程处理图像 (4) 显示处理后图像 (5) 结束 位图读取及显示方法框架如下: (1) 开始 (2) 得到文件完整路径名 (3) 打开位图文件 (4) 读取BITMAPELEHEADER结构 (5) 文件是BMP格式吗?(否则转到(9)) (6) 得到位图大小并分配相应内存空间 (7) 读取BITMAPELEHEADER结构 (8) 计算像素起始位置,保存像素数据起始位置指针 (9) 结束 图像显示框架如下: (1) 开始 (2) 从DOC对象中得到位图数据起始位置指针,并得到图像的宽高等信息 (3) 是否带有颜色索引表?(否则转到(9)) (4) 使用文件中颜色表数据创建调色板 (5) 把新创的调色板作为设备环境的调色板并保留原调色板 (6) 设定显示参数,显示位图 (7) 恢复原调色板 (8) 结束 (9) 设定显示参数,显示位图 (10) 结束 第二节 详细设计 一、图像的打开、关闭、保存 对于大多数人来说,在设计图像处理系统时,最大的难点就是对图像的打开、关闭和保存。由于时间及能力原因,对于现存的所有的图像文件格式,本文主要介绍BMP图像文件格式,BMP文件里的图像数据是未压缩的,因为图像的数字化处理主要是对图像中的各个像素进行相应的处理,而未压缩的BMP图像中的像素数值正好与实际要处理的数字图像相对应,这种格式的文件最合适对之进行数字化处理。请读者记住,压缩过的图像是无法直接进行数字化处理的,如JPEG、GIF等格式的文件,此时首先要对图像文件解压缩,这就要涉及到一些比较复杂的压缩算法。在第二章 第二节的位图文件格式中已给出了位图的文件格式:位图文件头BITMAPFILEHEADER、位图信息头BITMAPFILEHEADER、调色板RGBQUAD等位图基本信息。因为,对于图像的打开、关闭、保存等操作如下所操作。 (一) 图像的打开、显示如下: (1) 开始 (2) 得到文件完整路径名 (3) 打开位图文件 (4) 读取BITMAPELEHEADER结构 (5) 文件是BMP格式吗?(否则转到(14)) (6) 是否带有颜色索引?(否则转到(15)) (7) 使用文件中颜色表数据创建调色板 (8) 把新创的调色板作为设备环境的调色板并保留原调色板 (9) 设定显示参数,显示位图 (10) 恢复原调色板 (11) 得到位图大小并分配相应内存空间 (12) 读取BITMAPELEHEADER结构 (13) 计算像素起始位置,保存像素数据起始位置指针 (14) 结束 (15) 设定显示参数,显示位图 并转到(11) BMP位图包括位图文件头结构BITMAPFILEHEADER、位图信息头结构BITMAPINFOHEADER、位图颜色表RGBQUAD和位图像素数据四部分。处理位图时要根据文件的这些结构得到位图文件大小、位图的宽、高、实现调色板、得到位图像素值等等。这里要注意的一点是在BMP位图中,位图的每行像素值要填充到一个四字节边界,即位图每行所占的存储长度为四字节的倍数,不足时将多余位用0填充。 启动Visual C++,生成一个名为Imgcx的单文档程序。在处理图像应用程序的文档类(Global.h)中声明如下宏及公有变量: 建立图像表示用Dib: EXIMPORT int CreateDispDib(CDC* pDC, int xsize, int ysize); 消除Dib: EXIMPORT void DeleteDispDib(void); 建立参考窗口读入图像: EXIMPORT int Load_imagefile_bmp(); 直接输入文件名读入图像: EXIMPORT int Load_original_image(CString filename); 读灰度图像数据到设定内存: EXIMPORT int ReadImageData(BYTE *image); 读彩色图像数据到设定内存: EXIMPORT int ReadImageDataRGB(BYTE *imageR, BYTE *imageG, BYTE *imageB); 图像保存: EXIMPORT BOOL Save_imagefile_bmp(); 图像另存为: EXIMPORT BOOL SaveAs_imagefile_bmp(); 获得图像横向大小: EXIMPORT int GetXSize(); 获得图像纵向大小: EXIMPORT int GetYSize(); 获得图像数据指针: EXIMPORT LPBYTE GetImage(); 获得图像类型(8 = 灰度、24 = 彩色): EXIMPORT int GetImageType(); 表示内存内的灰度图像: EXIMPORT void Disp_image(BYTE *image); 表示内存内的彩色图像: EXIMPORT void Disp_imageRGB( BYTE *imageR, BYTE *imageG, BYTE *imageB); 获得表示图像的名称: EXIMPORT void GetImageFileName(char *cFileName); 设定表示图像的名称: EXIMPORT void PutImageFileName(CString fn); 获得表示的Dib: EXIMPORT CDib* GetDib(void); 设定表示的Dib: EXIMPORT void PutDib(CDib *pDib); 彩色图像变灰度图像 EXIMPORT int Color_to_mono(); 图像打开实现步骤: 1、读入位图文件 2、设定图像窗口大小 3、更新画面 4、判断图像格式 5为新图像分配内存 6、更新画面 (二) 图像的保存及另存为 图像保存及另存为流程图: N
Y
图4-2 实现步骤: 1、 判断是否读入图像(N则转到3) 2、 调用保存语句保存 3、 结束 二、直方图设计 图像增强处理技术一直是图像处理领域一类非常重要的基本处理技术。通过采取适当的增强处理可以将原本模糊不清甚至根本无法分辨的原始图片处理成清楚、明晰的富含大量有用信息的可使用图像,因此此类图像处理技术在医学、遥感、微生物、刑侦以及军事等诸多领域得到广泛应用。 (一)图像的灰度直方图处理技术 在空间域对图像进行增强处理的方式有许多种,如增强对比度和动态范围压缩等等,但这些处理方式都是针对原始图像的每一个像素直接对其灰度进行处理的,其处理过程主要是通过增强函数对像素的灰度级进行运算并将运算结果作为该像素的新灰度值来实现的。通过改变选用的增强函数的解析表达式就可以得到不同的处理效果,这类处理方法比较灵活方便,处理效果也不错,但对于某些灰度分布很密集或对比度很弱的图像,虽然也能起到一定的增强效果但并不明显。对于这种情况就可以采用本文提出的灰度直方图变换方法将原始图像密集的灰度分布变得比较疏散,从而拉大图像的对比度并在视觉上达到明显增强的效果,使一些原本不易观察到的细节能变得清晰可辨。 图像的灰度变换处理是通过改变原始图像各像素在各灰度级上的概率分布来实现的。通过对图像的灰度值进行统计可以得到一个一维离散的图像灰度统计直方图函数p(sk)=nk/n(这里k=0,1,2……L-1),该式表示在第k个灰度级上的像素个数nk占全部像素总数n的比例,p(sk)则给出了对sk出现概率的一个估计。因此该直方图函数实际是图像的各灰度级的分布情况的反映,换句话说也就是给出了该幅图像所有灰度值的整体描述。通过该函数可以清楚地了解到图像对应的动态范围情况,可以了解到图像灰度的主要集中范围。因此可以通过图像增强程序的干预来改变直方图的灰度分布状况,使灰度均匀地或是按预期目标分布于整个灰度范围空间,从而达到增强图像对比度的效果。这种方法是基于数理统计和概率论的,比直接在空间域对原始图像采取对比度增强效果要好得多。在实际应用中直方图的变换主要有均衡变换和规定变换两种,而后者又可根据灰度级映射规则的不同分单映射规则和组映射规则两种。 (二)直方图均衡化处理 直方图均衡化处理的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。基本思想是对在图像中的像素个数多的灰度级进行展宽,而对像素个数少的灰度级进行缩减,从而达到清淅图像的目的。通过点运算使输入图像转换为在每一灰度级上都有相同的像素点的数目,即输出图像的直方图是平的。这对于在进行图像比较和分割之前将图像转化为一致的格式是十分有益的。 直方图是用来表达一幅图像灰度级分布情况的统计表。直方图的横坐标是灰度,一般用r表示。纵坐标灰度值为 的像素个数或出现这个灰度值的概率 。并知: (4-1) (4-2) 式中K为一幅图像对应的灰度级数。 图像灰度的直方图是反映一幅图像中的灰度级与出现这种灰度的概率之间关系的图形。设变量r 代表图像中像素的灰度级,如果对它做归一化处理,r的值将在下述范围内:0<= r <=1 在灰度级中,r=0代表黑,r=1代白,从r=0到r=1之间数值的变化,反映了像素由黑至白的灰度变化。对于一幅给定的图像,每一像素取得(0,1)区间内的灰度级是随机的,即可以认为它是一个随机变量。假定r是连续的,那么可以用概率密度函数 来表示原始图像的灰度分布。对于数字图来说,灰度级看成是离散的,归一化后的r的取值范围为: 0<= r <=1 k=0,1,2,…,L-1 这里,L为灰度级的数目。 如前所述,一幅给定的图像的灰度级分布在[0,1]区间内的任一个r值,都可产生一个s值,且任一r值可按下式变换: (4-3) T(r)为变换言之函数。在原始图像中,每一个像素灰度值r都对应产生一个s 值。 假定由式4-3给定的变换函数满足下面两个条件: (1) 在0<= r <=1区间内是单值单调增加函数; (2) 在0<= r <=1区间内,有0<= T (r)<=1。 条件(1)保证灰度级从黑到白的次序,条件(2)确保映射后的像素灰度在允许的范围内。反变换关系为: (4-4) 显然,若T满足条件(1)和(2),则 也满足条件(1)和(2)。 由概率论理论可知,如果已知随机变量r的概率密度为 ,而随机变量s是r的函数,对于直方图均衡化后的连续图像,变换函数T(r)与原图像概率密度函数 之间的关系为: (4-5) 假定随机变量s的分布函数用 表示, 是单调增长函数,则s 的概率密度 可以由 求出,变换后的图像灰度级的概率密度函数 可由下式得到: =[ ]r = T (s) (4-6) 因为归一化假定: =1 (4-7) 故有 (4-8) 或 (4-9) 取定积分: (4-10) 对于离散图像,第i个灰度级 出现的频数 用表示,该灰度像素对应的概率值 为: (4-11) n是帧内像素总数, 满足归一化条件。至此,可写出离散图像的变换函数表达式: (4-12) 式中,k为灰度级数。 (三)实现步骤 (1) 开始; (2) 是否读入图像(否则转到(15)); (3) 是否灰度图像(否则转到(15)); (4) 描画移动量; (5) 用数据表示轴; (6) 获得图像尺寸; (7) 分配内存; (8) 读入图像数据; (9) 计算直方图数列; (10) 直方图平坦化处理; (11) 表示变换后图像; (12) 再次计算直方图数列; (13) 全体描画直方图; (14) 解放内存; (15) 结束; 三、傅立叶交换 (一)傅立叶的定义 傅立叶变换在数学中的定义非常严格,它的定义如下。 设f(x)为x的函数,如果f(x)满足下面的狄里赫莱条件: (1) 具有有限个间断点; (2) 具有有限个极值点; (3) 绝对可积。 则定义f(x)的傅立叶变换公式为: (4-13) 它的逆变换为: (4-14) 可以把傅立叶推广到二维情况。如果f(x,y)满足狄里赫莱条件,那么将可以导出下面的二维傅立叶变换: (4-15) 二维傅立叶的逆变换为: (4-16) (二)快速傅立叶变换的实现 现在,离散傅立叶已成为数字信号处理的重要工具,但是它的计算量比较大,运算时间长,在某种程度上限制了它的使用。为了解决这一矛盾,引用了快速傅立叶变换的思想。快速傅立叶变换并不是一种新的变换方式,它是离散傅立叶变换的一种算法,这种方法是建立在分析离散傅立叶里叶变换中的多余运算的基础上,进而消除这些重复工作的思想指导下得到的,从而在运算中节省了大量的计算时间,达到快速运算的目的。 快速傅立叶算法设计思想是: 首先,将原函数分为奇数项和偶数项,通过不断的一个奇数一个偶数的相加(减),最终得到需要的结果。也就是说快速傅立叶算法是将复杂的运算变成两个数相加(减)的简单运算的重复。令: (4-17) 一维离散傅立叶变换公式变为:
(4-18) (分成奇数项和偶数项之和) 其中
(4-19) (4-20) 所以,由式(4-17)(4-18)(4-19)(4-20)可得: (4-21) 例如,设对一个函数进行快速Fourier变换,函数为:
分成偶数、奇数为:
图4-3 从上可见F(0)和F(4)仅仅在运算符上不同,同理可以推出F(2)与F(6),F(2)与F(6),F(3)和F(7)在运算符上不同。为了快速实现傅立叶变换,要对F(x)进行“逆序”重排。 有了“逆序”的概念,就可以着手讨论快速傅立叶变换的实现。计算时, 先将原始数组按宗量值“逆序”顺序,重新排列,然后自左向右,每两个相邻元素为一组,共4组,具体是:F(0),F(4);F(2),F(6);F(2),F(6);F(3),F(7)。在每一组中,第一元素作为偶元素,第二元素作为奇元素(注意对所有组都一样)。在此基础上完成4个“两点变换”。下一步是利用“两点变换”结果形成两个“四点变换”,最后是建立在“四点变换”基础上的一个“八点变换”。具体见图4-7及图4-8。
图4-4
图4-5 以上快速傅立叶变换流程简称为逐次加倍法,因为“两点变换”由两个“一点变换”算出,“四点变换”由两个“两点变换”算出,“八点变换”由两个“四点变换”算出,依此类推。通过这种计算方法快速傅立叶变换比二维离散傅立叶变换的计算量大量减少,效率大大提高,增加了算法的实用性,使傅立叶变换在数字图像处理中得到更为广泛的应用。 (三)二维离散傅立叶变换 二维离散傅立叶变换变换有两个好处: (1)可以得出信号在各个频率点上的强度。 (2)可以将卷积运算化为乘积运算。 二维离散函数f(x,y)的傅立叶变换为:
(4-22) 傅立叶反变换为:
(4-23) 其中:x=0,1,2,…,M-1; y=0,1,2…,N-1;
在数字图像处理中,图像取样一般是方阵,即:M=N,则二维离散傅立叶变换公式为:
(4-24)
(4-25) 实现步骤 为了能在数字图像处理中应用傅立叶变换进行频谱分析处理,必须引入二维傅立叶变换的概念。二维傅立叶变换可以很容易地在一维傅立叶变换的基础上推导得出。可以将一个二维傅立叶变换通过在X方向、Y方向上的两次一维傅立叶变换来进行。将二维傅立叶变换的运算分解为水平和垂直两个方向上的一维离散傅立叶变换运算,由于在分解后的运算是靠一维离散傅立叶变换来完成的,而在前面已给出了对一维离散傅立叶变换的快速算法的实现过程,因此经分解后的二维离散快速傅立叶变换可以借助一维快速傅立叶变换来实现其快速算法。傅立叶变换在程序中的实现步骤: (1) 开始; (2) 是否读入图像(否则转到(13)); (3) 是否灰度图像(否则转到(13)); (4) 获得窗口数据; (5) 定义输出图象数据指针; (6) 分配内存; (7) 进行FFT变换 (8) 滤波处理 (9) 逆傅立叶变换处理; (10)表示滤波后图象; (11)更新画图; (12)释放内存; (13)结束; 四、小波交换 一般的信号分析与合成当中,经常使用傅立叶变换。然而,由于傅立叶变换的基(basis)是采用无限连续且不具有局部性质的三角函数,所以在经过傅立叶变换后的频率域中时间信息完全丢失。与其相对,由于小波变换能够得到局部性的频率信息,从而可以有效地进行时间频率分析。 图像数据作为二维的离散数据给出,用f(m,n)表示。与二维离散傅立叶的情况相同,首先进行水平方向上的离散小波变换,对其系数再进行垂直方向上的小波变换。把图像数据f(m,n)看作0级尺度系数 。 首先,进行水平方向上的离散小波变换。
(4-26) 其中, 及 分别表示水平方向的尺度系数及小波系和。j=0时如图4-9所示。 图4-6 接着,分别对系数进行垂直方向的离散小波变换。
(4-27) 其中, 表示在水平方向上使尺度函数起作用、垂直方向上使小波起作用的系数, 表示在水平上使小波起作用、垂直方向上使尺度函数起作用的系数,另外, 表示在水平和垂直方向上全都使小波起作用的系数。j=0时如图4-10所示。 n n m m
图4-7 综合式(4-26)和式(4-27)得:
(4-28) 上式中仅对 再进一步分解成4个成份,通过不断重复迭代这一过程,可以进行多次分辩率分解。 重构按下式进行:
(4-29) 实现步骤 (1) 开始; (2) 是否读入图像(否则转到(12)); (3) 是否灰度图像(否则转到(12)); (4) 获得图象尺寸; (5) 分配内存; (6) 读入图象数据; (7) 二维小波变换处理; (8) 小波信号图象化处理; (9) 表示处理结果; (10)更新画面; (11)释放内存; (12)结束; 第三节 编码 一、开发语言特征 (一)Visual C++简介 由微软公司开发的Visual C++6.0是Window平台下最强有力的开发工具。Window操作系统本身大部分是利用c/c++语言写成的,而Visual C++正是使用c/c++语言的win32应用程序集成开发环境,因此,使用Visual C++来进行Window应用程序的开发便有着得天独厚的优势。Microsoft的Visual C++还吸取了包括Borland、Phar_lap等著名公司的技术之长,使其成为Windows时代最流行的商用开发语言。 随着编程技术的发展,Windows的开发也走向成熟,早期编程只能用c语言,需要一段一段地重复调用复杂的Windows API ,写冗长消息处理的switch语句。现在大部分人员都使用c++进行Windows编程,工具开发商也将必要的资料封装到一个个的c++类库中,构成所谓的“应用程序框架”(Application Framework),开发人员使用它可以更高效的进行编程。Visual C++提供可视化的编程的同时,也适用于编写直接对系统进行底层操作的程序,其生成的代码也要优于很多其他开发工具。随着Visual C++提供的Microsoft基础类库(Microsoft Foundation ClassLibrary,简写MFC),对Windows/NT所使用的Win32应用程序接口(Win32 Application Programming Interface)进行了非常彻底的封装,使得可以使用完全的面向对象的方法进行Windows95/NT 应用程序的开发,从而大量的节省了应用程序的开发周期,降低了开发成本,也使得Windows程序员从大量的复杂劳动中解救出来。 (二)开发工具特点 Visual C++6.0作为开发Windows应用程序的工具,具有下列明显特点: 1、 有统一的用户操作界面; 2、 操作系统紧密结合,硬件对程序员完全透明; 3、 用向导来简化应用程序的开发; 4、 快的集成数据库访问; 5、 有力的Internet支持。 Visual C++功能强大,可为下列程序提供支持 1、 用MFC的应用程序; 2、 c语言利用SDK编写的应用程序; 3、 ctiveX控制; 4、 LL动态链接库; 5、 据库应用程序; 6、 nternet应用程序; 7、多媒体应用程序。 二、代码风格与代码质量 (一)编码时遵循了以下原则,摘自文献[10]。 1、用 #include “filename.h” 格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。 2、在每个类声明之后、每个函数定义结束之后都要加空行。 3、一行代码只做一件事情,这样的代码容易阅读,并且方便于写注释。 4、尽可能在定义变量的同时初始化该变量(就近原则) 5、程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐。 6、命名规则 标识符应当直观且可以拼读,可望文知意,不必进行“解码”。 标识符最好采用英文单词或其组合,便于记忆和阅读。切忌使用汉语拼音来命名。程序中的英文单词一般不会太复杂,用词应当准确。 标识符的长度应当符合“min-length && max-information”原则。 命名规则尽量与所采用的操作系统或开发工具的风格保持一致。Windows应用程序的标识符通常采用“大小写”混排的方式,如AddChild。 程序中不要出现仅靠大小写区分的相似的标识符。 变量的名字应当使用“名词”或者“形容词+名词”。 全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等。 类名和函数名用大写字母开头的单词组合而成。 变量和参数用小写字母开头的单词组合而成。 常量全用大写的字母,用下划线分割单词。 (二)代码质量优化: 1、常数定义为常量; 2、所有动态内存退出时手动释放; 3、经常性地对代码进行重构,消除重复代码段,整理类的方法。 |