边界跟踪算法的程序说明和程序代码

来源:互联网 发布:域名注册需要什么资料 编辑:程序博客网 时间:2024/05/12 13:22

 

 

 

 


 

 

 

4.算法描述:

设在数字化网格平面的形状是封闭的,且只有一个连通的区域,这个连通的区域在二维数组中用1来标记,其余的数组元素用0来标记。算法中的坐标与程序中的二维数组的下标对应。

Step 1. 对数组进行逐行查找,找到由数字1表示的封闭图形的最上端一行的最左边一个点(其数组行下标应该是最小的),用P0表示。P0是边界跟踪的起始点。定义变量dir 表示上述“关于方向码的概念”中的8个方向,所以dir的取值范围是 01 … 7 ,注意,后面的计算过程,有dir8的模(求余)运算。

dir 赋初值 dir=7;

   Step 2. 按逆时针方向顺序依次判断当前点(一开始为P0点)的83x3邻居是否为1,开始的邻居号为:

1(dir+7) mod 8     如果 当前的dir为偶数;

2(dir+6) mod 8     如果 当前的dir为奇数;

按上述的逆时针方向找到的第一个不为0的点为找到的新的边界,记为Pn,并更新dir (以当前找到为1的点为最后更新的dir方向)。

Step 3. 如果当前的边界点Pn的坐标等于找到的第2个边界点P1的坐标,而且它前一个边界点Pn-1的坐标又与起始点P0坐标相同,则算法结束。否则,重复Step 2.

Step 4. 封闭形状的边界跟踪结果则为上述步骤记录的P0,P1,P2 ….Pn的坐标,或者是上述过程中保存的dir 值。

 

5.关于算法描述的部分举例。

   以前面的图形为例,现在对于该算法的前面若干步骤的执行情况做一描述,以便更好理解算法的执行过程。

Step 1: (n=0) 找到的Pn=P0=(1,2); dir=7;

Step 2: (n=n+1=1) 按逆时针方向顺序找到P0点的83x3邻居中第一个为1的点,此时P0的八个近邻情形为(X表示当前P)

    0 0 0

    0 X 1

    0 1 1

开始判断的方向为(dir+6) mod 8 =(7(奇数)+6) mod 8=5 ,也就是开始以逆时针依次判断的起始方向为西南方向!

此时,为0,接着要判断南,i.e. dir=dir+1=6, 好,这是1

现在要做的事情有两个:一是记录邻居“南”,(6近邻)的坐标,Pn=P1=(2,2)

                      二是记录方向码 6 ;

(这两个记录过程,一般用两个数组来实现,以便最后输出结果)

 

此时,注意,dir已经更新为 6

 

Step 3 , 不符合结束条件,继续转Step 2

Step 2: (n=n+1=2)按逆时针方向顺序找到P1(2,2)点的83x3邻居中第一个为1的点,此时P1(2,2)的八个近邻情形为(X表示当前P)

    0 1 1

    0 X 1

    1 1 1

开始判断的方向为(dir+6) mod 8 =(6(偶数)+6) mod 8=4 ,也就是开始以逆时针依次判断的起始方向为西方向

此时,为0,接着要判断西南,i.e. dir=dir+1=5, 好,这是1

现在要做的事情有两个:一是记录邻居“西南”,(5近邻)的坐标,P2=(3,1)

                      二是记录方向码 5 ;

(两个数组记录,以便最后输出结果)

Step 3 , 不符合结束条件,继续转Step 2

 

Step 2: (n=n+1=3) 按逆时针方向顺序找到P2(3,1)点的83x3邻居中第一个为1的点,此时P1(2,2)的八个近邻情形为(X表示当前P)

    0 0 1

    0 X 1

    0 0 1

开始判断的方向为(dir+6) mod 8 =(5(奇数)+6) mod 8=3 ,也就是开始以逆时针依次判断的起始方向为西北方向

此时,为0,接着要判断西,西南,南,也为0,再继续判断东南i.e. dir=7, 好,这是1

一是记录邻居“东南”,(7近邻)的坐标,P3=(4,2)

二是记录方向码 7 ;

(两个数组记录,以便最后输出结果)

 

。。。。。。。。。。。。