关于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的文章,以及该文中给出的论文连接,在此表示感谢。

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
7.3.1 Suzuki–Kasami Algorithm This algorithm is defined for a completely connected network of processes. It assumes that initially an arbitrary process has the token. A process i that does not have the token but wants to enter its CS broadcasts a request (i, num), where num is sequence number of that request. The algorithm guarantees that eventually process i receives the token. Every process i maintains an array req[0.. n − 1] of integers, where req[j] designates the sequence number of the latest request received from process j. Note that although every process receives a request, only one process (which currently has the token) can grant the token. As a result, some pending requests become stale or outdated. An important issue in this algorithm is to identify and discard these stale requests. To accomplish this, each process uses the following two additional data structures that are passed on with the token by its current holder: • An array last[0.. n − 1] of integers, where last[k] = r implies that during its last visit to its CS, process k has completed its rth trip • A queue Q containing the identifiers of processes with pending requests When a process i receives a request with a sequence number num from process k, it updates req[k] to max(req[k], num), so that req[k] now represents the most recent request from process k. A process holding the token must guarantee (before passing it to another process) that its Q contains the most recent requests. To satisfy this requirement, when a process i receives a token from another process, it executes the following steps: • It copies its num into last[i]. • For each process k, process i retains process k’s name in its local queue Q only if 1 + last[k] = req[k] (this establishes that the request from process k is a recent one). • Process i completes the execution of its CS codes. • If Q is nonempty, then it forwards the token to the process at the head of Q after deleting its entry. To enter the CS, a process sends (n − 1) requests and receives one message containing the token. The total number of messages required to complete one visit to its CS is thus (n − 1) + 1 = n. Readers are referred to [SK85] for a proof of this algorithm理解Suzuki-Kasami算法,并回答如下问题: 算法是如何辨别和丢弃过时的请求的,或者说为什么要求1 + last[k] = req[k]?
最新发布
06-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

愚鬼

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

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

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

打赏作者

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

抵扣说明:

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

余额充值