最近遇到这样一类问题,如何求图像中连通区域交叉点。直接上图说明。
图中
、
、
、
点为连通区域交叉点。那么如何找到交点的位置呢?难点在于实际的连通区域的宽窄大小不同,并且并不都是直线,也有一些曲线,本文介绍一种有效的方法用于搜索交叉点。
- 图像细化
首先对图像进行细化处理,由于连通区域是有一定的宽度,在遍历整个连通区时不能有效的判断交叉点的特征,将图像细化后,图像交叉点的特征将更加明显。本文用到得到细化算法是查表法,这里不详细介绍,附上细化算法链接。细化后的效果如图所示。
- 去毛刺并找交点
由细化后的图像可以看出,细化效果并不是理想中的只将连通区域的主干提取出来,还有一些毛刺。
为去毛刺,首先一视同仁,定义毛刺与主干的连接处也为交点,只不过毛刺是比较短的分支。
如果从细化后的某一端点遍历整个连通区,统计每个点的8邻域,8邻域图像会被分为3类:
- 当前所在点的8邻域内只有一个点,那么当前点是端点,如图所示,红色点表示当前点,黑色点是8邻域内的点。
2.当前所在点的8邻域内有两个点,那么当前点是主干上的点,其中8邻域内的一个点是其上一个点,另一个点是其要遍历的下一个点。
3.当前所在点的8邻域内有大于等于三个点,那么当前点是交叉点。其中8邻域内的一个点是其上一个点,另外的点是其他分支的起始点。
现在连通区域内点的所有情况都被列出。去毛刺算法如下:
1)从细化后的连通区域某一端点开始搜索所有点,搜索方法是深度优先搜索;
2)每次都判断当前点是前面介绍的三种点的哪一种点,如果是主干上点,继续搜索;如果交叉点,那么继续遍历交叉点上的每个分支;如果是端点,那么结束当前搜索回到上一次搜索起点并统计该次搜索的点数
,这个点数
即为该分支的长度,那么根据分支长度可以判断是否为毛刺,设置毛刺长度阈值
。如果分支长度
,那么保留该分支并记录该分支起点为交叉点,如果分支长度
,那么判断该分支为毛刺,删除该分支。
3)直到所有点被遍历完成。