关于suzuki 轮廓跟踪算法

关于suzuki 轮廓跟踪算法

 

  1. 算定义了几个概念:
  1. 连通区域,由相同像素点组成的区域,,如果自称区域的点为1,则称之为1-部件,否则为0-部件。
  2. 点(i,j)的邻域是指:

          

其中左侧的为点的4-邻域,用于连通域的路径搜索。右侧的为8-邻域,用于边缘跟踪。

 

  1. 边缘点序号NBD,标识边缘点。
  2. 边缘序号LNBD,标识边缘的从属关系。
  3. 边缘类型,表示一个边缘的类型属性,外边缘和孔边缘(outer/hole)。
  4. 图像帧(Frame),图像的最外边界所形成的连通域,即图像的背景。
  5. 环绕属性:如果说s1-部件环绕s2-部件,则对于s2-部件的任一点(i,j)到达帧部件的路径上都有一点(p,q)属于s1-部件(这里的路径是指4-邻域下的路径)。

 

  1. 图像格式,算法定义抽象的图像格式,V = F(vij),其中v(i,j)表示像素点的值,并且可以作为存储单元保存设定的任意值。v(i,j)=1表示白点,v(i,j)=0表示黑点。
  2. 图像坐标采用从上到下和从左到右方式,即坐标零点(i,j)在图像的左上角。

 

  1. 算法描述:
  1. 扫描给定的输入图像,在达到点(i,j)停止,如果点(i,j)满足:
    • v(i,j-1)=0且v(i,j)=1。(i,j)为外边界开始点
    • v(i,j+1)=0且v(i,j)>=1。(i,j)为孔边界开始点
    • 如果(i,j)点既满足①又满足②,则点(i,j)视为外边界点(等同于满足①)。
  2. 分配NBD++到已找到的边缘开始点对于①情况v(i,j)<- NBD。对于②情况v(i,j)<- -NBD。
  3. 确定新边界的父边界:
    • 如果上一边界存在,且类型等于新边界(outer/hole),则上一边界的父边界设定为新边界的父。新边界与上一边界共享父边界。
    • 否则上一边界为新边界的父边界(直接环绕)
  4. 从开始点跟踪边界点,并按照如下策略标注边缘点:
    • 对于外边界类型(outer),从(i,j-1)顺时针查找(i,j)点的8-邻域,确定一个非0邻域点(i1,j1)。对于孔边界(hole)从(i,j+1)顺时针查找(i,j)点的8-邻域,确定一个非0邻域点(i1,j1)。如果(i1,j1)不存在,则v(i,j)<- -NBD,转到E。
    • (i2,j2)<- (i1,j1),(i3,j3)<-(i,j).
    • 从(i2,j2)的下一个邻域点开始逆时针查找(i3,j3)点的邻域,直到找到非0邻域点为止,设置为(i4,j4)。
    • 如果(i4,j4)=(i,j)且(i3,j3)=(i1,j1)则回到开始点,转到E。
    • 按照如下策略标记(i3,j3):
      1. 如果检测到的邻域点(0点)中包含有(i3,j3+1)点,则v(i3,j3)<- -NBD。
      2. (i3,j3)已经是标记的边缘点,则不变,否则,v(i3,j3)<- NBD。
    • (i2,j2)<-(i3,j3),(i3,j3)<-(i4,j4)转到③继续跟踪。
  5. LNBD <- |v(i,j)|,(i,j)<-(i,j+1),继续扫描下一个边缘的开始点,转到A。

 

算法注释:

  1. 边缘的开始点和边缘类型。从开始点的判断条件确定边缘类型(outer/hole)。当边缘的开始点组成形式为01时,确定为outer类型,形式为x0时,则为hole类型,其中x数值是边缘初始值1或边缘标记值NBD,注意:x>=1。标记为-NBD的边缘点是不能作为新边界的开始点的。
  2. 确定开始点的逆时针邻域检测的位置。使用(i,j-1)或(i,j+1)进行顺时针检查。
  3. 确定边缘跟踪的初始化数据(i2,j2),(i3,j3),同时确定跟踪循环的终止条件(i,j)和(i1,j1)。
  4. 边缘点的标记侧率是算法的核心,此处的考量是根据标记查找出边界的从属关系和边界的属性。LNBD用于确定从属,开始点确定类型,每一个边界有相同的|NBD|。
  5. 通过对3和4的循环,查找一条边界。
  6. 通过对开始点的下一个点定位(i,j)<-(i,j+1),开始下一个边界的跟踪。直到图像的右下角为止,找出图像的所有边界以及这些边界的关系属性。

算法的变异:

  1. 仅适用外边缘开始点属性,设定LNBD=0。
  2. 对于父边缘序号LNBD>1的边缘开始点直接跳过。
  3. 仅跟踪最外层非Frame边缘,加快图像解析速度,用于图像识别。
  4. 对连通域使用NBD标记测算图像部件的特征值,可以用于模式识别等其他图像分析领域。

算法图例:

    1、用与检测算法的图例:

             

途中①点为第一个边缘的开始点,它满足01条件。设为(i,j)。通过从(i,j-1)顺时针查找得到(i,j+1)为(i1,j1),同时也是循环跟踪的(i2,j2)。按照循环跟踪标记边界得到:

           

同时第二个边界的开始点②。注意:次边界与上一个边界有共享边界点。②点不满足01条件,但是却按住x0条件,其中x>=0。根据顺时针查找得到(i2,j2)=(i+1,j),因此循环初值和终止条件为:

    (i3,j3)=(i,j)(②点)

    (i2,j2)=(i+1,j)=(i1,j1)。

v(i,j)= 2,NBD=3,LNBD=2。开始点标注后v(i,j)=-NBD(-3)

根据算法标注策略得到:

       

然后继续从(i,j+1)开始,得到边界开始点③,他也是一个单线共享边界点。继续算法直到图像的右下角。

 

跟踪算法的理解需要注意的是边缘点的标记策略:

    i在查找邻域时如果遇到(i3,j3+1)=0,则v(i,j)<- -NBD。

    ii否则如果v(i,j)=1,未标记的边缘点,则v(i,j)<-NBD。

    iii否则v(i,j)不变。

而在检查(i,j)是否为边界开始点时,x0的条件是x>=0,对于负的x,不能作为开始点。这就使得算法标记策略逻辑连贯了,否则为什么要这样标记呢。

 

从图中可以看出,单线边缘可以被标记多次,因此在存储记录边缘点时,一个点可以存在于多个边缘的记录中。

对于非闭合轮廓(线边界),查找算法沿边缘线查找两次(往复一次),最后回到查找起点,完成查询,此时轮廓标记为-NBD。

 

轮廓标记总是回到起点,并从起点的j+1点开始重复查找下一边界。

 

连通域的轮廓方向满足右手定则,outer轮廓的方向为z轴的正方向,hole轮廓的方向为z轴的负方向。轮廓查找顺序也是逆时针(outer)/顺时针(hole)方向走动。

 

在算法中,图像的二值表示,用8位,01位白点,00位黑点。每点8位(一字节)。Mat类型为二维Byte数组。因此算法仅支持127(NBD有符号)个联通区域的轮廓检测。若想增加对纹理形状的轮廓进行检查,需要将图像的Mat类型改变到Int数组类型。

 

使用下图可以算法辅助理解边缘的跟踪过程。

          

左图中红点为开始点,绿点为0。右图中所有非黑点都是备点。

 

算法框图:

     

 

 

头一张框图部分给出检查边界的开始点,并设定边界的类型及父边界的编号LNBD。后一张框图部分给出了边缘点的跟踪过程,以及边缘点的标注策略。

 

此处并没有给出按照框图理解算法的程序实现。下一章将给出delphi下的代码实现。

 

本文参考了https://www.cnblogs.com/liutianrui1/articles/10281465.html的文章,以及该文中给出的论文连接,在此表示感谢。

  • 1
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

愚鬼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值