《基于图像分割的图像抠取算法的研究与实现本科毕业论文.doc》由会员分享,可在线阅读,更多相关《基于图像分割的图像抠取算法的研究与实现本科毕业论文.doc(65页珍藏版)》请在三一办公上搜索。
1、四川大学本科毕业论文 基于图像分割的简单图像抠取算法的研究与实现本科毕业论文(设计)题 目 基于图像分割的图像抠取算法的研究与实现学 院 计算机学院 专 业 计算机科学与技术 学生姓名 杨明川 学 号 0643041308 年级 06 指导教师 吕泽均 教务处制表二一 年 月 日基于图像分割的图像抠取算法的研究与实现计算机科学与技术专业学生 杨明川 指导老师 吕泽均摘要 随着数码设备在日常生活中的大量使用,以及各种图片在各个领域越来越广泛的应用,围绕着图片处理而出现的问题也变得越来越复杂。对于大多数没有学过专业图像处理软件的用户来说,想要从图片中抠出自己感兴趣的目标,或者是进而对其更换背景都是
2、一件很困难的事。因此一个简单的,智能的进行目标抠取的软件是极为必要的。而完成这类软件的核心就是一个处理效果良好的图像抠取算法的实现。GrabCut算法是目前在图像分割领域取得良好效果的数字图像抠取算法。综述了GrabCut算法的实现过程,并且介绍了根据算法抠取出来的感兴趣目标与背景所实现目标/背景保存,目标图像简单变换,目标背景替换等一系列辅助功能的完成方法。最后在总结章节中,阐述了实现过程的一些特色与存在的问题,并且提出对未来的研究方向的展望和个人自己的理解。主题词 图像分割;Grabcut算法;背景替换; Studying and implementing image cutouting
3、algorithmbased on image segmentationComputer ScienceStudent: Yang Ming-chuan Adviser: Lv Ze-junAbstract With the digital equipment widely used in daily life, and a variety of pictures in the more extensive application in various fields, centered on the problems of image processing become more and mo
4、re complex. For the most users who did not learn the professional image processing software and want to cutout the interest target from the picture, or then replace the background are a very difficult thing. Therefore, a simple, intelligent software of cutoutting the target from the image is very ne
5、cessary. The core of thecompletion of such software is a nice implementing of a good image-matting algorithm.GrabCut digital matting algorithm had achieved good results in the current field of image segmentation. In this paper ,it reviews the implementing if GrabCut algorithm ,and introduces some of
6、 the functions implementing like goals/background saving,simply change on the target image, target background replacement,etc. After the introduction of function implementing, there are a demonstrating of the results in the corresponding function.In the last chapter, experimental results and problem
7、s are concluded, and propose directions for future research prospects and personal understanding. Key Words Image segmentation ; GrabCut ; Background replace目 录1 绪论11.1课题研究的背景和意义11.2 图像抠取软件及成果的现状11.2.1 综合化的图像处理软件21.2.2 单一化的图像处理软件31.3 本文所做的主要工作32 图像分割简述42.1图像分割概述42.1图像分割的基本方法43.1.1 经典的图像分割方法43.1.2 新颖
8、的图像分割方法73 算法实现的工具及技术简介93.1 MFC概述493.1.1 MFC编程框架93.1.2 MDI应用程序构成113.2 GDI+介绍133.2.1 GDI简介5133.2.2 GDI+介绍133.3 OPENGL简介153.3.1 OpenGL工作流程153.3.2 OpenGL图形操作步骤154 GRABCUT图像抠取算法简介174.1 GraphCutst算法简介174.2 GrabCut算法简介174.3 GrabCut算法准备184.3.2 高斯混合模型介绍184.3.2 GrabCut算法中的数据结构194.4 算法过程描述204.4.1 算法初始化过程204.4.
9、2 自学习的高斯组件204.4.3 最小分割204.4.4 算法流程介绍215 GRABCUT算法及辅助功能的实现235.1 GrabCut 算法的实现235.1.1 数据结构介绍及初始化235.1.2 高斯混合模型的建立的实现275.1.3 高斯混合模型的学习过程的实现295.2 GrabCut 算法实现后的效果演示295.3 目标对象处理305.3.1 可分离目标对象的标记305.3.2 目标图像大小的调整325.3.3 目标图像/合成图像的保存336 总结与展望386.1 总结386.2 展望38参考文献39声 明40致 谢41附录1 关键代码42附录 2 翻译(原文和译文)47四川大学
10、本科毕业论文 基于图像分割的简单图像抠取算法的研究与实现1 绪论本章节对课题研究的背景和意义,以及目前可用于实现图像抠取的软件的现状进行了介绍。并在最后就本文所做的主要安排进行了简述。1.1课题研究的背景和意义随着电子数码设备的普及,以及电子计算机,互联网的广泛使用,人们对各种图像的使用的频度的增加,广大用户对一些图像进行一些简单处理的需求也越来越多。然而现在存在的一些专业图像处理软件并没能够很好的解决大部分用户的一些极为简单的需求。如如何从图像中抠取出自己想要的对象如一个人,一辆车,再如如何简单快速的替换一些图片的背景这种极为简单的图像处理需求对一些不会使用专业图像处理软件的用户来说却非常困
11、难的一件事。大家都渴望出现一个简单却智能的图像处理软件,它不需要用户掌握及其高难度的操作,以及记忆大量操作命令,而仅仅是提供一个单一功能却易操作的可进行目标抠取,背景替换的图像处理软件。并且对于会使用专业图像处理软件的用户来说,一个简单的目标抠取,背景替换的图像处理软件能够为他们在制作一些复杂项目时提供大量的素材来源,不用为了得到一张图像中的一个目标,而花费大量时间去利用专业软件从中抠取图像对象。他只需要一些简单操作就可快速得到他想要的效果。除此之外,随着计算机视觉理论和算法研究的发展,以及计算机硬件性能的不断提高,越来越多的智能处理系统的广泛使用,以及复杂情况下处理要求的攀升,对于做为很多图
12、像处理技术基础的图像分割目标提取技术就显得更为需要简单化,智能化。简单是指的交互简单,而智能则是指系统能更加智能的理解用户的需求。这样就可以在更少的交互下得到更为满意的处理效果。这样一个好的图像分割算法的实现成果,就会变得极为有意义。而满足以上用户需求的软件实现的核心问题就是如何实现一个在图像分割领域内有着良好表现的图像抠取算法。在算法实现的基础上想要制作出一个具有市场价值的软件就变得极为容易进行了。并且这个实现可以不仅仅可以被做为主体设计出一个软件,也可以成为一些大型系统的嵌入模块。GrabCut算法只要求极少的用户交互,因此在今后的研究发展中结合一些其他的智能算法是完全可能实现完全智能化的
13、,它可以自动找出图片中的有意义对象,并且实现多个对象的组合,以便能够更好满足用户的需求。为用户提供更为简单直接的服务。综上所述,对于GrabCut图像抠取算法的研究与实现是极为价值的。1.2 图像抠取软件及成果的现状在当前图像处理领域,图像处理软件非常多,大部分都能实现从图像中抠取出部分图像的需求 ,并且它们还基本满足了用户极大部分其他的图像处理需求。这些图像处理软件中,要么一些软件过于大型专业,虽然提供了异常强大的功能,却让初学者望而却步,让专业人士效率不高;要么只是提供一项或几项简单的服务,只是为了大量普通用户才设计出炉的过于傻瓜,而功能太过简单,创意难以得到有效发挥,产品品质和处理速度也
14、良莠不齐。大致可将这些软件分为两类,一是综合化的图像处理软件,二是单一化的图像处理软件。1.2.1 综合化的图像处理软件这类软件的数量非常多,它们虽然重心各有不同,但是从它们所提供的功能中是可以完成图像抠取的操作的,不过由于这些软件都是极为专业化,且功能众多且强大,对单纯为了完成图像目标抠取的用户来说,就有一点大材小用的感觉了。这儿列举几个功能强大,较为流行的软件。(1)PhotoShopPhotoshop是由Adobe公司推出的跨越PC和MAC两个平台的的大型图像处理软件.它功能强大,操作界面友好, 主要应用于图像处理、广告设计的一个电脑软件。ADOBE PHOTOSHOP最初的程序是由Mc
15、higan大学的研究生Thomas创建,后经Knoll兄弟以及ADOBE公司程序员的努力ADOBE PHOTOSHOPf进行了很多功能上的改进,成为优秀的平面设计编辑软件。经过3.0,4.0,5.0,5.5的不断升级,直到目前最新的cs5版,功能强大,处理领域也宽广,逐渐成为使用广泛的图像处理软件.Photoshop支持众多的图像格式,对图像的常见操作和变换都 做得非常精细;此处,它还拥有异常丰富的插件(在Photoshop中叫滤镜),使得photoshop的功能更为全面。然而由于其功能异常强大使得并不是大部分用户都能在短时间内流利的使用其一些简单功能。(2)Turbo PhotoTurbo
16、Photo是一个以数码影像为背景,面向数码相机普通用户和准专业用户而设计的一套集图片管理,浏览,处理,输出为一身的软件系统。它能完成数码摄影相关的大部分后期工作,拓展数码摄影的创作手段,从而深化数码相机的应用。它包括两个部分:Turbo Photo 相册和Turbo Photo 编辑器。Turbo Photo 相册是一个照片管理、浏览与批处理为一体的软件。它是 Turbo Photo 软件的一部分。Turbo Photo编辑器的所有功能均围绕如何让照片更出色的主题设计。每个功能都是针对数码相机本身的特点和最常见的问题。(3)光影魔术手光影魔术手是国内比较受欢迎的图像处理软件,曾被很多主流期刊评
17、为最佳图像处理软件。光影魔术手是一个对数码照片画质进行改善及效果处理的软件。它在处理数码图像及照片时非常高速、且实用。光影魔术手能够满足绝大部分照片后期处理的需要,批量处理功能非常强大。它无须改写注册表,能够非常方便的移除。1.2.2 单一化的图像处理软件(1) KnockOut KnockOut是Corel公司出品的专业去背景软件,能够处理复杂背景下的精细目标。去背景操作就是制作遮罩的过程,所谓的去背景,指的是将特定的主体从背景中分离出来,以便进行其它的后续设计。KnockOut不仅能够处理复杂情况其对背景单纯时的处理方式也同样保持其它软件同样的简单化,快速化。对于一般的去背景需求,Knoc
18、kOut的处理效果都及为准确,快速,且其需要的操作方便,容易。KnockOut图像抠取软件使用的是KnockOut自然景物抠取算法,而Knockout 方法的特点在于模型简单、处理速度快,但其处理效果不佳。其仅仅是在处理光滑图像有着较好的效果。(2)可牛影像可牛影像是新一代的图像处理软件,独有美白祛痘、瘦脸瘦身、明星场景、多照片叠加等功能,更有50余种照片特效,数秒即可制作出影楼级的专业照片。可牛影像的有照片编辑功能。可牛影像还具有智能修复功能,只要点击一下鼠标,就可以对照片进行自动亮白,自动白平衡,自动对比度调整等操作。此外可牛影像还拥有数十种风格特效和影楼特效,能够使用户快速为照片添加艺术
19、效果;而且它还使得去红眼,背景虚化这些看似复杂的操作,变得相当简单,即使是新手也能得到很好的处理效果。另外,可牛影像的智能抠图功能,能够使用户在较小的操作后得到抠取结果,并且能够对处理后的结果进行编辑,使得结果更加满足用户的需求。此外,可牛影像具有补光、柔和等6大自动修复能力,素描、黑白、怀旧等数十种另类效果,以及其他一些延伸功能的实现使得其具有了全套的照片的编辑功能。1.3 本文所做的主要工作本论文的内容结构安排如下:第一章为绪论。首先介绍了课题研究的背景与意义,再对目前可用于图像抠取的软件或研究成果进行了简单的介绍。最后列出了本论文的主要安排和作者所做的主要工作。第二章为图像分割简述。在这
20、个章节中对图像分割进行了概述,并就其目前使用基本方法进行了介绍。第三章为算法实现所涉及的工具及技术简介。在这章中对MFC,GDI+,OpenGL等在算法实现过程中所用到的工具或技术做了简要的阐述。第四章为GrabCut图像分割方法简介。首先对GrabCut算法做了简介,再就GrabCut算法的思想及过程进行了详细的阐述。第五章为GrabCut算法及其辅助功能的实现。本章详细的介绍了GrabCut算法在MFC程序框架下的实现过程,并对针对算法处理结果所进行的辅助功能的实现进行了介绍。第六章为总结与展望。在这个章节中对GrabCut算法的研究与实现过程所做的工作进行了总结,并对图像分割算法及建立在
21、算法实现基础上图像抠取软件的前景进行了展望。2 图像分割简述2.1图像分割概述在计算机视觉领域的研究中,图像分割是图像处理,模式识别和人工智能等许多领域中一个十分重要且困难的问题.是计算机视觉技术中首要的,重要的关键步骤,也是非常基础的研究领域. 图像分割就是从图像中把感兴的目标与背景分割开来,或从图像中识别和解释出有意义的物体实体而提取不同的图像特征的操作。而在图像分割中提出的感兴趣的目标可以是指视野中的运动物体,可以通过一系列的图像序列中分析得到,也可以是指一些可分离的物体对象,如人,苹果等,这儿主要是指两物体间没有存在明显的重叠,可以通过分析单幅或者序列图像得到。图像分割是一个经典的难题
22、,到目前为止即不存在一种通用的图像分割方法,也不存在一种判断是否分割成功的标准.按照图像分割的定义,分割出的区域需要同时满足均匀性和连通性的条件。其中均匀性是指该区域中的所有像素点都满足基于灰度,纹理,色彩等特征的某种相似性准则;连通性是指在该区域内存在连接任意两点的路径1,1。而这些区域或者几个区域的联合就可以表示一个感兴趣的对象。这样通过对分割区域或者区域组合的的提取从而实现感兴趣目标的提取。而目标提取的结果的好坏对后续的处理操作有着非常重要的影响。因此,有效的图像分割对如目标检测,身份确认和行为理解与处理等中高层次的任务非常重要。而在视频编码,图像检索,人机互动,运动监测等研究领域中,往
23、往只考虑感兴趣区域的像素,所以好的图像分割技术往往能促进这些课题的研究发展。图像分割在实际应用中应用的范围非常广泛,仅仅是在对医学图像的处理方向,就存在着如肿瘤与其他病变的定位,计算机辅助手术,解剖学研究等分支,更不要说其在卫星图像中的目标定位,交通控制,机器视觉等研究方向的广泛应用。并且随着计算机应用范围的增加,一些新的图像分割的应用领域也会慢慢诞生出来。另外,由于计算机图像处理技术是对人类视觉的模拟,而人类的视觉系统又是一种高度自动化的生物图像处理系统。而目前的研究对这个系统的认识又不是很足,因此,要完全形成与人类视觉功能同样强大的计算机视觉系统,还需要一个漫长的过程。而就需要对一些基础研
24、究领域加强研究使其首先完整化,才能有望实现计算机视觉。总之,图像分割的重要地位必定只会得到的加强,而不会有所衰退。2.1图像分割的基本方法3.1.1 经典的图像分割方法这些图像分割的方法都是经过了很长的发展过程,拥有很强的理论依据,是目前发展极为成熟的算法,虽然在处理的场景要求有一些严格,且处理效果不是很好,但毕竟是最初的处理算法,对其加深了解有助于更好的理解图像分割的基本内容和处理方式,对后续的新颖的图像分割算法的学习也能起到一些作用,甚至做一些比对作用.1) 基于阈值的分割阈值法是一种比较传统的图像分割方法,也是经典的、流行的图像分割方法之一,是最为简单的一种图像分割方法.图像阈值分割利用
25、了图像中要提取的目标物与其背景在灰度特性上的差异,把图像视为具有不同灰度级的两类区域的结合.选取一个合适的阈值,以确定图像中每一个像素点应该属于目标还是背景区域,从而产生相应的二值图像. 阈值分割可以通过全局的信息如整个图象的灰度直方图,或者局部信息如灰度共生矩阵实现。而根据其使用的信息类型的区别可将其分为全局阈值法和局部阈值法,或者单值法和多值法1,2。在多区域的分割前提下,我们的目的是获得一个阈值集合(t1,t2, ,tk ),使得所有灰度值满足f(x,y)ti,ti+1 的象素点构成第i个区域,其中(i=0,1, ,k)。阈值分割法,也可以看成是一个分类问题,比如单阈值分割中,相当于把所
26、有象素点分成两类:目标和背景。阈值分割图像的基本原理,可用下式作一般表达式: (2-1) 其他其中Z为阈值,是图像灰度级范围内的任一个灰度级集合, , 为任意选定的目标和背景灰度级。由此可见,基于阈值的图像分割技术,如果想要比较为复杂的背景下将目标分辨并将其形状完全提取出来,则对于阈值的选取是非常重要的。阈值的高低完全确定了一些关键点是属于背景还是目标,也就完全影响了最后的分割结果1,3。2) 区域增长技术区域增长有时也称为区域生长.区域生长技术是一种简单的图象分割技术,它仅适用于高反差的简单图象的分割,不能满足灰度渐变或以某种纹理而不是灰度来表征不同区域的那些复杂图象的分割。区域增长在很多领
27、域都受到了很大的关注,其在计算机视觉的智能化应用中也具有很大的作用。并且其在图像的纹理信息分割方面具有很好的处理效果,它可以在灰度与局部特征值信息上进行简单的聚类分类,也可以利用统计均匀性检测进行复杂的分裂与合并处理。该算法的核心思想就是将在像素某一特征上具有相似性的像素集标记为一个区域,然后具体在每一个区域中通过某种准则选出一个种子点。再对种子点周围的领域进行考查,找出具有相似性的像素,将其规为种子点所在的区域。再将这些新的点做为新的种子生长点,重复上面的步骤,直至没有再满足条件的点出现,就说明一个区域被划分出来了1,4。直到将整幅图像分割成满足条件的不同子区域.这些初始的小区域可能是小的邻
28、域甚至是单个象素。对这些小的区域,通过计算它们反映这个区域内像素一致性的特征,如平均灰度值,纹理,等信息,来进行一些小区域的合并。从而最终完成整个分割过程。区域合并的第一步就是根据前面的特征给每个区域赋一组参数。这些参数能够反映区域属于哪个物体1,5。接下来根据相邻区域特征的差异为所有的边界赋一个强度值,这样就能够通过判断这个强度值的大小来考查是否要对两个相邻区域的共同边界进行消除操作。如果这个值很大,则表示这个边界的强度很大,即这两个相邻的区域拥有着很大的差异,则不需要进行合并,它们的边界也就不能消除,反之,若这个值较小,则认为相邻区域拥有很高的相似度,可以起先边界消除完成合并。在这个过程完
29、成后需要对所有的区域根据它当前的所有像素重新计算出一个特征值,以便完成下一次的边界消除,区域合并过程。可以看出区域合并是一个反复迭代的过程,直到没有区域再进行合并时,才停止。这个过程就是一个不断生长的过程,直到生长出目标,生长过程才会结束1,6。3) 基于边缘的分割图像的边缘是图像最基本的特征之一,所谓边缘是指其周围像素灰度有阶跃变化或屋顶变化的那些像素的集合.边缘广泛存在于物体与背景之间,物体与物体之间,基元与基元之间,因此,它是图像分割依赖的重要特征.图像分割在某种程度上可以说是为一找到各个区域的边缘的操作。而由以上对于边缘的定义知,边缘是图像的局部特征,这样通过对局部特征的分析就可以确定
30、某个像素是否是边缘。基于边缘的分割技术主要有基于点的检测,基于线的检测经及基于边缘检测等几种方法1,7。基于点的检测主要是先检测出离散的点,然后再将点连接成封闭的边界,其处理过程就是用一个对待检测区域进行离散点的检测,如下示:W1W2W3R = W1Z2+ W1Z2+.+ W9Z9W4W5W6W7W8W9表2-1其中Zk是与模板系数Wk相联系的灰度级像素,R代表模板中心像素的值。而基于线的检测有两种方式,一种是利用线检测模板进行线检测,另外是利用哈夫变换进行直线检测。而基于边缘检测的分割方法则主要是利用各种算子得到图像中的边缘,进而根据边缘信息得到分割后的区域。边缘检测的基本问题是噪声对图像检
31、测精度的影响。由于图像边缘和噪声均为频域中的高频分量,简单的微分运算会增加图像中的噪声。因此,在微分运算之前应采用适当的平滑滤波以减少高频分量中噪声的影响。Cannny应用严格的数学方法对此问题进行了分析,提出了4个指数函数线性组合形成的最佳边缘检测算子,其实质是用一个准高斯函数做平滑运算,然后以带方向的一阶微分定位导数最大值,它可用高斯函数的梯度来近似,属于具有平滑功能的一阶微分算子1,8。Canny给出了评价边缘检测性能优劣的三个指标: 好的信噪比,即将边缘点判为非边缘点,非边缘点判为边缘点的概率应该比较低。 好的定位性能,即检测出的边缘点,应尽可能在实际边缘点的中心。 对单一边缘仅有唯一
32、响应,即单个边缘产生多个响应的效率应该比较低,并且虚假边缘的响应应该得到最大的抑制。并且,优秀的边缘检测器可以通过以下方式得到: 使图像信噪比SNR最大化 使标记的边缘点与真实边缘中央的距离的均方根的估计值的倒数最大化为了同时达到检测性能指标和定位标准的最大化,Canny认为SNR与边缘点位移的估计值一的标准方差的倒数乘积应达到最大1,9。3.1.2 新颖的图像分割方法目前应用于图像分割的新方法非常的多,它们的应用范围也各有不同,处理效果即理论的成熟度也表现出了一些差异,下面就基于分形的图像分割技术和基于神经网络的图像分割技术做一个简单的介绍。1) 基于分形的图像分割技术基于分形的图像分割技术
33、的核心思想是利用图像的分形维数进行分割。而分形维数在一定程度上对物体表面的粗糙度有着一定程度的反映,而自然物体与人造物体在分形维数上有着很大的差异,这样就可以利用这个特征从自然背景中提取出人造物体。B. B. Mandelbrot指出,Hausdorff Besicovitch维数严格大于拓扑维数的集合称为分形,而目前较为流行的描述如下2,1:一般的,如果F是具有以下性质的集合,则称它是一个分形。(1) F具有精细的结构,即有任意小比例的细节。(2) F是如此不规则,以至于它的整体与局部都不能用传统的几何语言来描述。(3) F通常具有某种自相似形式,可能是近似的或统计的。(4)一般地,F的“分
34、形维数”(以某种方式定义的)大于它的拓扑维数。(5)在大多数令人感兴趣的情形下,F可以以某种非常简单的方法产生,可能由迭代产生。在上面的定义中,自相似性是分形具有的一个最重要的特征2,2。所谓自相似,是指系统的总体和部分之间,这部分和那部分之间具有的相似性。分形作为一个数学集,它的内部应具有精细结构,也就是在所有比例尺度上其组成部分应包含整体,而且是自相似的,它以其独特的手段来解决整体与部分的关系问题。自相似性具有标度不变性,其严密的量化方法至今未形成,仅能借助计算机模拟2,3。2) 基于神经网络的图像分割技术神经网络是目前较为新颖的研究领域,已经被使用在了很多问题的解决中。神经网络技术在图像
35、分割中的应用目前也有了极大的发展。基于神经网络的分割是用一个或一系列人工神经网络对图像中的小区域进行处理的分割技术。经过这样的决策机制处理后,图像中各个区域就由神经网络确认的类别进行了标志。这种类型的神经网络的一个经典用例就是基于Kohonen 图的网络。脉冲耦合神经网络(PCNNs)是通过模拟猫的视皮层神经元模型和为了获得高性能图像处理仿生而开发的。1989年,Eckhorn介绍了神经网络模型来模拟猫的视皮层机制。Eckhorn模型为研究小型哺乳动物的视觉皮层提供了一个简单而有效的工具,并很快在图像处理方面获得了具有重大应用潜力的认可。1994年,Eckhorn模型被约翰逊应用于一种图像处理
36、算法中,该算法称为脉冲耦合神经网络。在过去的十年中,PCNNs已被用于图像处理的各种应用,包括:图像分割,特征生成,面部提取,运动检测,区域生长,减少噪声等。PCNN的是一个二维神经网络。网络中的每个神经元对应一个像素的图像输入,接收其对应的颜色信息(如强度)作为外部刺激。 每个神经元又与邻近神经元的连接,接收从他们而来的本地刺激。 外部和地方刺激在内部激活系统相结合直到它超过一个动态的门限值,然后就倒输出一个脉冲。通过迭代计算,PCNN的神经元产生的脉冲输出的时间序列。 输出的脉冲时间序列包含图像信息的输入,可为各种不同的图像处理应用,如图像分割和特征生成,利用。 与传统的图像处理手段,PC
37、NNs有几个显着优点,包括对噪声的鲁棒性,几何变化的输入模式,输入模式的衔接等小强度的变化能力等3。3 算法实现的工具及技术简介在GrabCut算法的实现过程中,整个算法的实现都是建立在MFC框架之上的。MFC框架很好的完成了算法实现系统的界面显示以及用户交互等工作。另外为了很好的完成GrabCut算法的图像输入及显示工作,在其实现中分别用到了GDI+中CImage类和OpenGL中的绘制函数来完成。3.1 MFC概述43.1.1 MFC编程框架MFC 是Microsoft Foundation Class的简写。MFC中所包含的各种类组合起来构成了一个应用程序框架,它的目的就是让程序员在此基
38、础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。Microsoft Visual C+提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等);资源编辑器用于帮助直观地设计用户接口;ClassWizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑4,1。1)封装MFC框架的构成主要是由MFC类库,而MFC类库主要是一些C+类库。这样这些类库就可以对Win
39、32应用程序编程接口,应用程序概念,OLE特性,ODBC或DAO数据库访问等功能进行封装。具体的分述如下4,2:对Win32应用程序编程接口的封装用一个C+ Object来包装一个Windows Object。例如:class CWnd是一个C+ window object,它把Windows window(HWND)和Windows window有关的API函数封装在C+ window object的成员函数内,后者的成员变量m_hWnd就是前者的窗口句柄。对应用程序概念的封装在使用SDK编写Windows应用程序时,必须首先定义窗口过程,然后对窗口进行登记操作,最后才会完成对窗口的创建过程
40、,等等。而对于这一套过程的实现每一次使用的代码都极为类似,这就造成了过多的重复操作。于是MFC把许多类似的处理用一些类封装起来,替程序员完成这些工作,以提高编码的效率。另外,MFC还对文档-视图模式进行了封装支持,而文档就表示了用户操作的数据对象,而视图则被视为完成对数据对象操作的接口,用户通过对视图的操作就可以完成对数据对象的查看及处理。对COM/OLE特性的封装OLE即Object Linking and Embedding,它是建立的com模型的基础上的,而应用程序若要实现对OLE的支持就必须实现一套接口,以完成OLE的初始化装载。而这一套接口的实现又极为繁琐,因此,MFC的OLE类对O
41、LE API大量的复杂工作进行了封装,这些类提供了实现OLE的更高级接口4,3。对ODBC功能的封装以少量的能提供与ODBC之间更高级接口的C+类,封装了ODBC API的大量的复杂的工作,提供了一种数据库编程模式。2)继承 MFC拥有一个庞大的类库,这些类库对MFC所能够提供的功能进行了很好的封装。而类库中的各个类并不是独立的,它们大多从一些基础类中派生而来,而这些基础类对MFC中众多类的共同实现进行了很好的实现。首先,MFC抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。这些类大多都是从CObject和CCmdTarget派生而来.CObject类对一些重要的特性提供很好的实现
42、,这些特性包括动态类信息、动态创建、对象序列化、对程序调试的支持,而CCmdTarget通过封装一些属性和方法,提供了消息处理的架构。从这个两个类派生出的子类都具有这两个类的特性.3)虚拟函数和动态约束 MFC是在C+的基础上构建的,它对C+中的虚函数与动态约束都提供了很好的支持,并且MFC还建立了消息映射机制来对过多的使用虚函数所带来的如程序臃肿,内存消耗过大,效率低下等问题进行优化.通过对虚拟函数和消息映射的支持,MFC类就为提供了丰富的编程接口。用户继承基类的同时,把自己实现的虚拟函数和消息处理函数嵌入MFC的编程框架。这样MFC框架就能够完成用户所期望的处理效果.4)MFC的宏观框架体
43、系 MFC对一切用于更好的使用户进行应用程序开发的功能,动态约束,及它们间的一些关系与相互作用都进行了很好的封装。这使得用户的整个开发过程大部分的工作都用于对这些开发模板的使用以及调配。而在不同的应用程序的开发过程,仅仅是对不同模板的使用而已。然而,为了实现如上模板或模式的支持,MFC内部将会有着非常复杂的实现过程。例如,如果要使应用程序能够建立在消息映射的机制上,MFC就必须对消息映射机制的过程做很好的实现,即对整个消息获取,消息处理等一系列的操作都必须预定义其操作的流程及处理方式。又如,为了实现对DLL编程的支持和多线程编程的支持,MFC的内部同样必须采用一些内部约定的方法对其进行如初始化
44、,信息管理,句柄获取等一系列必须的操作进行处理。虽然对于大多数的用户来说,在不明白MFC的一些内部实现的情况下,也能做出一些良好的应用。但是如果能够对这些不透明的实现有着很好的理解,那么就能够在开发中更加的随心所欲,甚至说对其实现进行优化。总之,MFC封装了Win32 API,OLE API,ODBC API等底层函数的功能,并提供更高一层的接口,简化了Windows编程。同时,MFC支持对底层API的直接调用4,4。MFC提供了一个Windows应用程序开发模式,对程序的控制主要是由MFC框架完成的,而且MFC也完成了大部分的功能,预定义或实现了许多事件和消息处理,等等。框架或者由其本身处理
45、事件,不依赖程序员的代码;或者调用程序员的代码来处理应用程序特定的事件4,5。MFC是C+类库,程序员就是通过使用、继承和扩展适当的类来实现特定的目的。例如,继承时,应用程序特定的事件由程序员的派生类来处理,不感兴趣的由基类处理。实现这种功能的基础是C+对继承的支持,对虚拟函数的支持,以及MFC实现的消息映射机制。3.1.2 MDI应用程序构成上面对MFC的编程框架做了介绍,现在就MDI应用程序做一下简单的分析.使用VC的AppWizard可以在很方便的情况下生成一个MDI应用程序,这个使用AppWizard生成的MDI程序框架,包含很多MFC为简化用户开发而生成的文件,它们能够使用户在极为方
46、便的情况下得到想要实现的效果。这些文件可分为四类:头文件(.h),实现文件(.cpp),资源文件(.rc),模块定义文件(.def),等4,6。1)构成应用程序的对象 图3-1解释了该应用程序的结构,箭头表示信息流向。从CWinApp、CDocument、CView、CMDIFrameWnd、CMDIChildWnd类对应地派生出CAApp、CADoc、CAView、CMainFrame、CChildFrame五个类,这五个类的实例分别是应用程序对象、文档对象、视图对象、主框架窗口对象和文档边框窗口对象。主框架窗口包含了视图窗口、工具条和状态栏。对这些类或者对象解释如下4,7。应用程序应用程序类派生于CWinApp。基于框架的应用程序必须有且只有一个应用程序对象,它负责应用程序的初始化、运行和结束。并且在整个程序运行的过程中都可以调用theApp对象,对其进行引用。边框窗口MDI与SDI应用程序的窗口类并不一样,MDI是由CMainFrame和CChildFrame构成,而SDI应用程序的窗口类则只有CMainFrame.且它们各自继承的基类也不一样。SDI的窗口类是从CFrameWnd派生而来,而MDI的窗口类则分别是从CMDIFrameWnd和CChild