您的位置:首页 > 编程语言

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

2010-12-28 10:55 232 查看




4.算法描述:
设在数字化网格平面的形状是封闭的,且只有一个连通的区域,这个连通的区域在二维数组中用1来标记,其余的数组元素用0来标记。算法中的坐标与程序中的二维数组的下标对应。
Step 1. 对数组进行逐行查找,找到由数字1表示的封闭图形的最上端一行的最左边一个点(其数组行下标应该是最小的),用P0表示。P0是边界跟踪的起始点。定义变量dir 表示上述“关于方向码的概念”中的8个方向,所以dir的取值范围是 0,1 … 7 ,注意,后面的计算过程,有dir对8的模(求余)运算。
对dir 赋初值 dir=7;
Step 2. 按逆时针方向顺序依次判断当前点(一开始为P0点)的8个3x3邻居是否为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点的8个3x3邻居中第一个为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)点的8个3x3邻居中第一个为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)点的8个3x3邻居中第一个为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 ;
(两个数组记录,以便最后输出结果)

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: