空间数据的结构转换

矢量─栅格转换

一、线的栅格化方法

    线是由多个直线段组成的,因此,线的栅格化的核心就是直线段如何由矢量数据转换为栅格数据。

    设直线段的两端点坐标转换到栅格数据的坐标系后为(xA,yA),(xB,yB)。则栅格化的两种常用方法为DDA(数字微分分析法)Bresenham法。                           

   1°、DDA(数字微分分析法)

    该方法的基本依据是直线的微分方程,即dydx=常数。其本质是用数值方法解微分方程,通过同时对xy各增加一个小增量来计算下一步的x,y值,即这是一种增量算法。

   2°、Bresenham算法

    该算法构思巧妙,只需根据由直线斜率构成的误差项的符号,就可确定下一列坐标的递增值。

    根据直线的斜率,把直线分为8个卦限。下面举斜率在第一卦限的情况为例,其余卦限的情况类似。

    该算法的基本思路可描述为:若直线的斜率为12≤△yx1,则下一点取(11)点,若0≤△yx12,则下一点取(10)点。

    在算法实现时,令起始的误差项为e=-12,然后在推断出下一点后,令ee+△yx[SX)],e0时,ee1。这样只要根据e的符号就可确定下一点的增量,即:

      若e0,取(11)

      若e0,取(10)

    这种算法不仅速度快、效果好,而且可以理论上证明它是目前同类各种算法中最优的。

二、面(多边形)的栅格化方法

   1°、内部点扩散法

    由一个内部的种子点,向其4个方向的邻点扩散。判断新加入的点是否在多边形边界上,如果是,不作为种子点,否则当作新的种子点,直到区域填满,无种子点为止。

    该算法比较复杂,而且可能造成阻塞而造成扩散不能完成,此外若多边形不完全闭合时,会扩散出去。

  2°、扫描法

    按扫描线的顺序,计算多边形与扫描线的相交区间,再用相应的属性值填充这些区间,即完成了多边形的栅格化。                               

3°、边填充算法

    其基本思想是:对于每一条扫描线和每条多边形边上的交点,将该扫描线上交点右方的所有象素取原属性值之补。对多边形的每条边作此处理,多边形的方向任意。图430是一个简单的例子。

        本算法的优点是算法简单,缺点是对于复杂图形,每一象素可能被访问多次,增加了运算量。为了减少边填充算法访问象素的次数,可引入栅栏。

    所谓栅栏指的是一条与扫描线垂直的直线,栅栏位置通常取多边形的顶点,且把多边形分为左右两半。栅栏填充算法的基本思路是:对于每个扫描线与多边形的交点,将交点与栅栏之间的象素用多边形的属性值取补。若交点位于栅栏左边,则将交点右边,栅栏左边的所有象素取补;若交点位于栅栏的右边,则将栅栏右边,交点左边的象素取补。 

栅格矢量转换

    栅格数据到矢量数据转换的一般过程可描述为:

一、二值化

    由于扫描后的图像是以不同灰度级存储的,为了进行栅格数据矢量化的转换,需压缩为两级(01),这就称为二值化。

    二值化的关键是在灰度级的最大和最小值之间选取一个阈值,当灰度级小于阈值时,取值为0,当灰度级大于阈值时,取值为1。当扫描图不清晰时,需由灰度级直方图来确定阈值  。

    对于地图,通常在灰度级直方图上出现两个峰值,这时,取波谷处的灰度级为阈值,二值化的效果较好。                             

二、二值图像的预处理

    对于扫描输入的图幅,由于原稿不干净等原因,总是会出现一些飞白、污点、线划边缘凹凸不平等。除了依靠图像编辑功能进行人机交互处理外,还可以通过一些算法来进行处理。

三、细化

    所谓细化就是将二值图像象元阵列逐步剥除轮廓边缘的点,使之成为线划宽度只有一个象元的骨架图形。

    细化的基本过程是:(1)确定需细化的象元集合;(2)移去不是骨架的象元;(3)重复,直到仅剩骨架象元。

    细化的算法很多,各有优缺点。经典的细化算法是通过3×3的象元组来确定如何细化的。      

       如果是对扫描后的地图图像进行细化处理,应符合下列基本要求:

  1°、保持原线划的连续性;

  2°、线宽只为一个象元;

  3°、细划后的骨架应是原线划的中心线;

  4°、保持图形的原有特征。

四、追踪

    细化后的二值图像形成了骨架图,追踪就是把骨架转换为矢量图形的坐标序列。其基本步骤为:

  1°、从左向右,从上向下搜索线划起始点,并记下坐标。

  2°、朝该点的8个方向追踪点,若没有,则本条线的追踪结束,转(1)进行下条线的追踪;否则记下坐标。

  3°、把搜索点移到新取的点上,转2°。

  五、拓扑化

    为了进行拓扑化,需找出线的端点和结点,以及孤立点。

    1°、孤立点:8邻城中没有为1的象元。  

   2°、端点:8邻城中只有一个为1的象元。

   3°、结点:8邻城中有三个或三个以上为1的象元

    在追踪时加上这些信息后,就可形成结点和孤段,就可用矢量数据的自动拓扑方法进行拓扑化了。

你可能感兴趣的:(算法,存储,图形)