边缘提取思路:
从上到下,从左到右找到第一个标记点,以该点为起点,在其3*3邻域内寻找下一个边缘点,邻域点按照逆时针方向依序编号:
1 2 3
0 4
7 6 5
原则上对每个点的邻域,从编号0开始,逆时针查找每一个点是否是标记点,但是这样会产生重复查找,所以每次需要计算一个新的起点来减少避免这种不必要的重复。
以起点为例,由于它是由上至下,由左至右的第一个标记点,则可以确定其邻域中的0,1,2,3点都是非标记点,下一个查找点可以直接从4开始。
接下来以4作为新的中心点,查找其邻域点。由于4的邻域点中编号0,1,2分别对应着起点邻域中编号起点、2、3的点,且这三个点都不需要再次判断,所以直接从3开始查找:
if (dir % 2 == 0)
{
dir = (dir + 7) % 8;
}
另一种情况,假设起点邻域中的4非标记点,则继续判断5,如果5是标记点,则以5作为新的中心点。5的邻域中编号为1,2的点对应着起点邻域中编号为起点、4的点,这两个点不需要再次查找了,可以直接从编号3开始判断:
else
{
dir = (dir + 6) % 8;
}
查找的结束条件就是新找到的点等于起点,变成了封闭的环,即可结束查找。