2.1 平滑
通常情况下,地图中存在着大量的高频噪声。地图中不是没有高频信号,但这些高频信号应该存在于不同的要素之间,而不是在同一要素之中。我们不希望看到地图中存在着那么多的“微尘”,希望地图能够变得单一,纯净一些。这种情况下就需要平滑。平滑虽然属于辅助处理,但对最终的效果影响也很大,必须认真对待。
在图形图形处理中,平滑的算法很多,技术也相当成熟,但不同的算法将导致不同的效果,用不好,将适得其反。平滑算法主要分为频域和空域两大类方法。对本应用来说,频域法是那么出乎意料的失败,经过FFT变换,处理再反变换后,原来很干净的地方竟生出了许多的“微尘”。所以我选用了空域中的众数均值法,就是用一个点的邻域中数目最多的那种颜色代替本点的颜色。根据需要,可以选取4邻域,8邻域,12邻域。以12邻域应用较多。邻域面积越大,平滑效果越强,但也不是没有限制,效果强不一定就意味着佳。推广到极限,我们把整幅地图看成一个邻域,平滑之后,整个地图都成一种颜色了,平滑效果最强,可以吗?
我之所以用一个点的邻域中最多数目的那种颜色代替其该点颜色,而不是用邻域中所有颜色的平均值,是因为该平均值可能又是一个新的颜色值,“平滑”之后,颜色值的总数反而增加了。虽然视觉效果变好了,但并不意味着对我下面的处理有好处。这是一种“聚块”式的平滑。这种平滑效果大多数情况下很不错,在后面的结果示例中可以看到这一点。
2.2 腐蚀
腐蚀就是使前景的边界剥去一层。当然一个前提就是道路足够宽,不然的话,就会把道路给剥断掉。一般情况下,道路的宽度是大于2的,剥一层边界之后无损于道路的连通性,但地图中的经纬线一般宽度为1或2,腐蚀一遍后就可以消失了。另外,如前所述,C类文字是一部分落在道路上,另一部分落在背景上,这一部分文字会作为道路的噪声被提取出来。如果文字与道路粘连的部分不是太大,经过腐蚀可以与道路相分离开来,转换为B类文字(知道这样做的好处是什么吗?)。如果道路足够宽,可以多腐蚀几次,效果尤佳。

图2-1 边界模板图
关于如何识别前景的边界,请看图2-1所示的模板图,标记为F的点是一个待处理的前景点,标记为B的点是背景点,标记为X的点是任意点,如果满足这种条件,该前景点就可以作为边界被腐蚀掉了。当然,这个模板只是一个代表,以中分线为轴翻转和中心点为轴旋转后,可以得到其他的7个模板,恕不另画。
有一种情况,如果道路中有很多洞,经过腐蚀后,这些洞就变的更大了,甚而使路断掉。如果这样,在腐蚀之前,就要先把这些洞给填好。当然需要使用者给出一个洞的最大面积,不然会把所有的背景当作洞填成道路的。
2.3 扩展算法
道路提取算法的实质就是相连点的扩展算法,RoadIdent中大量用到这个算法,其实就是人工智能课程所将的搜索算法。这里简单介绍一下:
Step1 准备一个Open表,准备一个Closed表。Open表用来装待扩展的点,Closed表用来装扩展过的点。
Step2 把第一个点装入Open表中。
Step3 从Open表中的头部取出一点做新的扩展。与这个点直接相连的点即为新扩展的点。
这个点投入Closed表中。
新扩展的点如果既不存在于Closed表中,也不存在于Open表中,就追加到Open表的尾部。
Step4 重复Step3,直到Open表为空。Closed表即是所要得的点集。
这个算法还稍微有点意思,其他的算法都没什么可说的,不再赘述。


