利用freeman链码对二值图像进行编码,可以表示图像边缘。
参考论文:崔倩等《基于细化的Freeman直线识别算法》
裘镇宇,危辉《基于Freeman链码的边缘跟踪算法及直线段检测》
王平,董玉德,罗喆帅《基于Freeman链码的直线识别方法》
1、freeman链码简介
首先给出 Freeman编码的定义描述: 任选一个像素点(通常对已细化的图像进行)作为参考点,与其相邻的像素分别在 8 个不 同 的 位 置上, 给它们赋予方向值 0~7(如图 1), 称为0~7 位链码方向值, 一个线条可以用Freeman 链码 的 码值串来表示称为该线条图形的链码。如图 2, 给出一个9 ×9 的点阵图, 其中一条线段, S 为起始点, E 为终点,此线段可做如表示为 L = 43322100000066。
2 Freeman 链码基础上的矢量跟踪方法
针对线条图像的链码识别问题,Freeman 提出了直线链码应满足的三个基本条件:1) 只包含最多两个方向的码值。2) 该两码值之一总是单独出现。3) 该单独出现的码值要尽可能均匀的分布在整个链码中。也就是说, 在绘制或编历一条直线的时候, 只需要进行两个方向的移动, 其中一个方向一定是独立出现的。在理想状态下, 当在一个单独出现的方向上识别到某像素后, 下一个像素点的方向就是另一个链码的方向。
Freeman 准则的直线检测算法通过跟踪线段子元,并根据两相邻线段子元间的偏转角度判断是否需要进行子线段合并。
Freeman链码算法设计:
参考论文: 尚振宏等《运用Freeman准则的直线检测算法》;史册《对一种快速边缘跟踪算法的讨论》
输入为二值图像,输出为图像中物体边界的各条线段·
整个算法流程如下所述,其中,Line Sub Cell、Line Cell和Line Segment分别表示存储线段子元、线段元和线段的结构·
Step1·从扫描二值图像,定位边界跟踪起点Pi,i=0·将Pi作为第一个像素保存到线段子元Line Sub Cell中·
Step2·i=i+1,利用文献[6]中提出的边界跟踪算法顺时针(或逆时针)跟踪得到下一边界点Pi,若跟踪回到起始点,则算法结束;否则,根据定义1确定Pi是否属于当前线段子元Line Sub Cell·若属于,则将Pi保存到Line SubCell中,转Step2;否则,当前线段子元Line Sub Cell即为一完整的线段子元,执行Step3·
Step3·若线段元Line Cell中无线段子元,则将LineSub Cell作为Line Cell的第一线段子元加入Line Cell;否则,根据定义2判断线段子元Line Sub Cell是否属于线段元Line Cell·若属于,将Line Sub Cell加入Line Cell,然后将Line Sub Cell置空并将Pi加入Line Sub Cell中,转Step2;否则,Line Cell为一完整的线段元,执行Step4·
Step4·若当前线段Line Segment中无线段元,则将Line Cell作为Line Segment的第一线段元加入LineSegment;否则根据下面的准则判断Line Cell是否属于Line Segment·若不属于,则Line Segment为一完整直线段,保存该直线段并置空Line Segment·然后,无论LineCell是否属于Line Segment均将Line Cell加入LineSegment,并分别用当前的线段子元Line Sub Cell和点Pi初始化线段元Line Cell和线段子元Line Sub Cell并转回Step2·
判断线段元Line Cell是否属于线段LineSegment的准则:见论文