面向对象的遥感影像矢量编辑系统的设计与实现
2021-04-30李翰洋
李翰洋
(兰州市勘察测绘研究院,甘肃 兰州 730000)
1 概述
在遥感影像分割结果的综合过程中,需要提取影像分割结果中各个地物对象的边界,然后依据此边界信息对分割的结果进行空间信息的转化与合成,形成最终的分割图。在该过程中,需要频繁更新对象边界。如果能够将影像分割的结果以矢量数据的形式进行组织管理,然后在该矢量数据的基础上对影像分割结果进行转化与合成,无疑会对面向对象的遥感影像分类提供良好的数据支撑。鉴于此,本文针对遥感影像分割后的边界数据,采用VC6.0开发平台及Win7 操作系统,设计相应的数据结构和算法,构建了面向对象的遥感影像矢量编辑系统,并将该系列算法封装成为组件,以API 的形式供其他遥感影像分类系统使用。
2 总体框架设计
2.1 主界面类设计
为了提高所设计的编辑系统的可移植性和可扩展性,本文在设计该编辑系统时,采用了面向对象以及组件的方式来进行实现。将该矢量编辑系统打包为动态链接库(DLL),并提供相应的接口,可在其他应用系统中直接使用。
2)将主界面类设计为导出类(__declspec(dllexport)),以DLL 的形式导出。由于DLL 本身所具备的特性,本文在更新主界面类时不需要重新进行编译,只需要更新动态链接库即可。这种方法一致性好,便于维护。
2.2 点、线、面类设计
在矢量编辑系统中,不仅要对点、线、面数据进行显示,而且要对其进行选中、删除等操作。
1)点类。在该矢量系统中,点存在两种状态:选中和未选中;存在一个判断方法:在指定的限差内是否能被选中。主要代码如下:
2)弧段类。在该矢量系统中,弧段存在两种状态:选中和未选中;存在两个判断方法:在指定的限差内是否能被选中以及在当前窗口范围内是否可见(在提高显示速率时需要该方法)。主要代码如下:
3)多边形类。在该矢量系统中,多边形存在两种状态:选中和未选中;存在一个判断方法:鼠标点击的位置是否在多边形内。主要代码如下:
3 关键技术的设计与实现
在矢量编辑系统的具体实现过程中,需要充分考虑到系统的效率、用户操作的友好性等问题,本文针对这些问题给出了相应的解决方案。
3.1 矢量图形和栅格数据的显示
遥感影像数据量一般较大,特别是分割之后,包含大量的点、线和面信息。在进行数据显示时,必须采用一定的优化方法,以快速显示矢量数据,减少矢量数据刷新时的屏幕闪烁,提高用户交互操作时的响应速度,包括点、线、面的捕捉等。本文采用了三种技术来优化处理,以提高显示的速率,方便用户操作。下面依次对这三种技术进行说明。
1)对矢量数据进行分块处理。由于矢量数据量较大,当鼠标在屏幕内移动时,如果计算鼠标和整幅矢量数据之间的关系,以判断哪些点、线或面可以选中,效率将会非常低。为此,本文将整体数据分块,分别统计各个块中所包含的点、线、面信息。当鼠标在进行移动时,首先计算鼠标的位置,以获得其所处的区块,然后提取出该区块中的点、线、面数据,与鼠标的位置进行判断,以获得它们之间的相对关系。如图1 所示,将一幅遥感影像分成50 像素*50 像素的多个矩形块。
排除标准:患者病例资料不完整;接受手术的结肠癌患者为急诊患者;患者有腹部手术史;患者具有家族性多发性息肉;患者合并有肠梗阻;患者具有溃疡性结肠炎;患者合并有其它恶性疾病;患者具有克罗恩病史;对本手术药物过敏或者属于过敏体质的患者。
在统计了各个区块的点、线、面信息之后,以此数据为基础来提高用户操作时的效率。具体实现如下:
图1 影像分块示意图
第一、获取鼠标所在的位置,并判断该位置属于第多少个区块;
第二、提取该区块,并获得该区块中所包含的点、线、面信息;
第三、根据给定的阈值,判断鼠标附近是否有节点可以捕捉,如果有,选择距离最近的结点,给出结点捕捉标志;否则,判断是否有弧段可以捕捉,如果有,选择距离最近的弧段,给出弧段捕捉标志;如果点、线都无法捕捉,则捕捉相应的多边形。该方法可以大大减少鼠标移动时所进行的捕捉判断,减少用户操作的响应时间,提高捕捉效率。
另一方面,通过将矢量数据进行分块保存,可以提高显示效率。通常情况下,在显示矢量数据时,为了提高显示效率,需要判断哪些点、线、面元素是落在可见窗口之内的,通过只显示这些可见元素,能有效提高显示效率。在显示矢量数据时,如果对所有的点、线、面元素均判断其可见性,无疑将会效率低下。通过分块统计的方法,在显示矢量数据时,首先计算哪些区块落在当前可见窗口之中,然后只绘制处于这些区块当中的弧段,将会大大降低不必要的判断过程,有效提高显示效率。
2)只显示落在当前可见窗口之中的像素。在进行矢量编辑的过程中,需要将栅格数据和矢量数据叠加显示,便于用户对比操作。然而,由于遥感影像数据量较大,在显示栅格数据时,如果一直显示整幅栅格图像,必然会影像到整个系统的显示效率。因此在显示栅格数据时需要进行相应的处理,以提高显示的速度。本文在具体实现时,计算只属于可见窗口之中的像素,然后进行显示。
3)采用双缓冲机制进行显示。在进行矢量数据的平移和缩放等操作时,不可避免的需要对矢量数据进行刷新。而通常情况下,矢量数据的数据量比较大,刷新一次需要耗费比较多的CPU 时钟,从而产生闪烁现象,因此也会影响到显示的效果。针对这个问题,本文采用了双缓冲机制来实现矢量图形的显示。实现思路如下:首先创建一个和当前可见窗口同样大小的画布,在需要刷新窗口时,计算刷新之后新的状态下的显示画面,然后将此画面绘制到该画布上,最后将该画布整个贴在屏幕上,从而达到刷新窗口的目的。在使用该机制对窗口进行刷新的过程中,用户看到的只是整体画布的一次性更换,速度很快,从而减小了闪烁,提高了显示的效率。
3.2 撤销和重做的设计与实现
一个比较人性化的软件系统应该能提供比较好的撤销与重做功能,以便用户能及时对操作错误的步骤进行更改,对于编辑系统更是如此。在该矢量编辑系统中,本文实现了撤销与重做的功能。
矢量编辑系统不同于其他的软件系统,该系统中的操作基本都是可逆的。例如分割一个多边形,其可逆操作为合并分割后的两个多边形;移动一个节点,其可逆操作为将该节点平移回来。针对这一特性,本文采用了面向对象和多态的方法来实现撤销与重做功能。其基本思想为:对于每一步操作,生成一个Undo 对象,同时计算该操作所对应的可逆操作的参数,将这些参数赋值给Undo 对象,并将该Undo 对象压入到撤销堆栈之中;同时生成一个Redo 对象,与该Undo 对象相反,压入到重做堆栈之中。其中,Undo 对象和Redo 对象的行为采用多态的方式来实现。以节点移动为例,进行简单说明。
1)在移动节点完成时,派生一个继承于CUndoBase 的类CUndoMove,在该类的Undo()函数中添加对本次操作的逆处理,在逆处理完成之后向重做堆栈中添加与之相关联的CRedoBase 对象,并设置与之相关联的CRedoBase 对象为空。
2)派生一个继承于CRedoBase 的类CRedo-Move,在该类的Redo()函数中添加对本次操作的重复处理,在重复处理完成之后向撤销堆栈中添加与之相关联的CUndoBase 对象,并设置与之相关联的CUndoBase 对象为空。
3)生成一个CUndoMove 对象pUndo,生成一个CRedoMove 对象pRedo,设置pUndo 指向pRedo,设置pRedo 指向pUndo,并分别将这两个对象压入到撤销和重做栈中。
4)在撤销和重做的过程中,分别从撤销和重做栈中取出栈首对象,调用相应的方法即可。
通过上述方法,可以一致地完成矢量编辑系统的撤销与重做功能。该方法的优点是对于所有的操作,当进行撤销或重做时只需要调用相同的方法即可:对于撤销调用Undo()函数,对于重做调用Redo()函数,简单方便;其缺点是对于每种类型的操作,都需要派生一个继承CUndoBase 或CRedoBase 的类,并定制其行为,代码实现比较复杂。
3.3 采集数据以及分类的辅助算法和工具
通过对遥感影像进行分割,其最终目的是服务于遥感影像分类。因此,提供一些针对于遥感影像分类的工具,有助于分割后的工作。
1)对遗漏区域的处理。对遥感影像进行分类之后一个很重要的工作是评价其分类的精度,为此,必须建立一个地物类型库,以对比分类后的结果。地物类型库通常是以手工勾绘的方式进行的,在建立的过程中,勾绘出比较典型的地物,赋予属性,对于不感兴趣或不清楚其类型的地块,往往不对其进行处理,因此,地物类型库中的地块对象中通常会存在遗漏的区域。在评价分类精度时,根据实际需要可能会要求对遗漏的区域进行补绘,赋予其属性,更新原有的地物类型库数据,因此,如果能提供添加遗漏区域的工具,将方便用户工作的进行。为此,本文在矢量编辑系统中添加了用户手动勾绘遗漏区域的工具,并提供了三种方式以方便用户的操作:完全随意勾绘、节点捕捉勾绘和弧段捕捉勾绘。
2)分类样本采集工具。在进行分类的过程中,需要获得比较典型的地物样本,以这些样本的特征来指导分割后数据的分类。由于矢量数据已经获得了典型地物的边界,因此,如果能够通过矢量数据来提取典型地物样本,将比通过栅格数据来进行要方便得多。为此,本文在矢量编辑系统中提供了样本采集的工具,并以特定的格式将采集的样本进行保存,方便用户的使用。
3)对象等级网络的建立。在进行分类的过程中,根据不同的应用目的可能需要在不同的等级上对分割数据进行处理。为此,本文利用分割地块的类别信息将地块由小到大建立了一个对象等级网络,即在较粗糙等级上的地块对象是由多个较精细的地块对象所组成的,而这些较精细的地块对象则是由多个更精细的地块对象所组成的。效果如图2 所示。
图2 不同等级地物分类示意图
4 系统效果
通过该矢量编辑系统,对原始的分割影像进行编辑之后结果如下图所示,其中图3 为原始分割结果,图4 为编辑后结果。通过对比可以看出,该对象编辑系统能方便地更新对象的边界,形成良好的分割结果,以用于遥感影像分类。
图3 影像原始分割图
图4 分割影像编辑结果图
5 结论与展望
5.1 结论
本文设计了一个小型的对象编辑系统,该系统采用面向对象和组件的方式进行实现,可重用性强。在实现该系统的过程中,采用多种技术解决了大数据量栅格、矢量数据显示及捕捉时效率低下的问题,并实现了撤销与重做功能。另外,为了满足分类过程中采集样本、获取数据、评价分类结果的需求,本文设计实现了一系列的辅助工具,包括样本采集、分类结果比较、地物等级网络建立等,操作简单方便,效果良好。
5.2 不足与展望
一个完善的矢量对象编辑系统的编辑方式应该多样化。本文所实现的编辑系统只实现了点、线、面元素的选择、基元多边形的合并与拆分、节点移动以及生成等级网络等功能,这些功能还不能完全满足对象编辑的需要。本矢量对象编辑系统有待进一步扩充完善。