本发明属于计算机视觉领域,更具体的涉及一种图像轮廓有序点集提取方法、计算机视觉系统,属于专利分类名称为“图像特征或特性的抽取”的g06k9/46(2006.01)i号分类。
背景技术:
图像轮廓的提取是计算机视觉中一个基础性的核心步骤,在很多场合需要对图像轮廓提取并转换为有序点集。
现有的计算机图像轮廓有序点集提取方法一般使用虫随法、光栅扫描法等,这些方法运行时都难以实现并行运算,图像内部小图像越多,耗时越大,难以预测轮廓抽取的耗时;这些方法难以解析交叉的边界;这些方法收敛特性不够稳定,可能掉入所谓的“陷阱”。
技术实现要素:
本发明的目的在于针对现有技术的不足提出一种图像轮廓有序点集提取方法,解决现有图像轮廓有序点集提取方法运行缓慢、难以解析相交叉的边界、收敛不稳定的问题,有利于计算机视觉开发者开发计算机视觉系统。
一种图像轮廓有序点集提取方法,基于一种逻辑拓扑结构,每个点对应八个碎点,一个碎点代表点的一个联通方向;将所有碎点进行连接,其方法是:如果一个碎点对应联通方向达到联通条件,则将碎点指向对应联通方向的碎点的时针方向上的下一个碎点,否则将其指向本点的时针方向上的下一个碎点。
进一步说明1:所述的时针方向包括逆时针方向和顺时针方向。
进一步说明2:所述的时针方向对所有的点都是统一的,也就是说在一次图片处理中所有点使用的时针方向必须是一致的,也就是说,不允许任何一个点使用与其他点不同的时针方向;(参见图2)。
进一步说明3:所述的联通条件是可变的,由使用本发明的计算机视觉开发者根据需求而定义。
进一步说明4:所述的统一的时针方向不是对碎点连接形成的边界链的时针方向的限定,也就是说碎点连接完毕后产生的碎点链可以是不同的时针方向,事实上本发明碎点连接形成的碎点链,其方向既有顺时针也有逆时针。
进一步说明5:由于进行过碎点连接运算后,边界碎点链就被勾出,又由于碎点和点是对应的,也就是说边界碎点链的勾出,对于计算机视觉开发者而言,等同于有序点集的勾出;(参见图3、图4、图5)。
进一步说明6:为了方便计算机视觉开发者对本发明的理解和利用,特意做出非本发明必要特征的补充——孤点的判断依据:孤点即对外无连接的点,一个碎点链其包含的所有碎点都对应同一个点,那么这条碎点链也就是一个孤点的碎点链(参见图3,点p8)。
进一步说明7:为了方便计算机视觉开发者对本发明的理解和利用,特意做出非本发明必要特征的补充——非边界碎点链的判断依据1:由于所有连接都成对出现,那么当一个点的两个相邻联通方向都对外先连接时,位于时针方向上排位靠后的碎点所在的碎点链一定是非边界碎点链;参见图3,碎点链p0(s6)、p1(s3,s4)、p4(s1)和碎点链p1(s5,s6)、p2(s3,s4)、p4(s7,s0)、p5(s5,s2)。
进一步说明8:为了方便计算机视觉开发者对本发明的理解和利用,特意做出非本发明必要特征的补充——非边界碎点链的判断依据2:孤点不算作有效图像的情况下,由于一个点对应八个碎点,那么连接后一个有效碎点链碎点数一定大于八,无效碎点链碎点数一定小于等于八;参见图3,碎点链p0(s6)、p1(s3,s4)、p4(s1)和碎点链p1(s5,s6)、p2(s3,s4)、p4(s7,s0)、p5(s5,s2)。
进一步说明9:为了方便计算机视觉开发者对本发明的理解和利用,特意做出非本发明必要特征的补充——碎点链的简化方法,以点为单元顺着时针方向的逆方向依次运算八个碎点,如果某碎点对外不联通,就将其指向更改为时针方向上下一个碎点的指向,并将下一个碎点清除;经过运算后同一点上的碎点出现在同一碎点链中的次数减少了;值得注意的是,由于孤点的所有碎点对外均无连接经过简化后会被消除(参见图5)。
进一步说明10:由于所有碎点的联通条件是一致的,也就是说一个联通方向上的连接是成对出现;由于连接成对出现且所有的点使用的连接方向规则相同(时针方向),所以所有碎点形成的连接一定都是闭合链接,所以不用担心收敛问题。
进一步说明11:由于每个碎点对应一个联通方向,碎点的连接只与这个方向是否达到条件相关,所以当两个边界交叉时,本发明也能分别检测出来,而不会出现判断冲突。
进一步说明12:因为每个联通方向上的碎点连接运算是独立的,和其他联通方向状况无关,且碎点之间的数据相关性比较小,所以本发明很适合并行运算。
进一步说明13:理解了进一步说明1-12后可知,本发明虽为并行化运算而创造,但相对传统方法其运行速度较快、可以检测交叉边界、不必担心收敛问题的优势,在非并行计算中同样存在。
本发明的新颖性在于:本发明是一种新的图像轮廓有序点集提取方法。
本发明的实用性在于:为计算机视觉开发者提供了一种图像轮廓有序点集提取方法,方便计算机视觉开发者开发适应于多处理器并行的计算机视觉系统,相对现有技术可以更加快速便捷的获得图像轮廓有序点集数据。
附图说明
图1是本发明提出的的逻辑拓扑结构一个示例,点p的横坐标为x,纵坐标为y,颜色值为c,点p对应的八个碎点为s0-s7。
图2是本发明的一个实施实例,体现的是一个3*3像素的图像数据被导入后的逻辑拓扑结构。
图3是图2实施实例的另一个状态,体现了图2经过碎点连接运算后的逻辑拓扑结构。
图4是图2实施实例的另一个状态,体现了图3清除非边界碎点链后的逻辑拓扑结构。
图5是图2实施实例的另一个状态,体现了图4简化碎点链并清除孤点后的逻辑拓扑结构。
具体实施方式
下面将结合实施实例对本发明进行说明。
如图2、图3、图4、图5所示,是本发明一种图像轮廓有序点集提取方法的一个实施实例,处理了一个具有3*3像素、具有0,1,3三种颜色值的图像;本实例使用的联通条件是颜色相同。
如图2所示,是本实施实例在图像数据导入后,碎点连接运算之前的逻辑拓扑结构;其中所有点的碎点都构成了一个顺时针的圈状闭合链;其中所有的辅助点p(-1,-1,-1)构成一道防止计算溢出的‘围墙’,因为‘围墙’中的碎点没有参与运算,为了视图的清晰、简洁,图中未将其指向画出。
如图3所示,是图2经过碎点连接运算后的逻辑拓扑结构,p0(s6)、p1(s3,s4)、p4(s1)构成了一条“长条形”的非边界碎点链;p1(s5,s6)、p2(s3,s4)、p4(s7,s0)、p5(s5,s2)构成了一个“十字形”非边界碎点链。
如图3所示,p3、p7构成的图像的边界与p6所在图像的边界虽然是交叉边界,但经过碎点连接运算后他们被分别检出为两条碎点链。
如图3所示,孤点p8对外没有联通。
如图4,是图3剔除非边界碎点链后的逻辑拓扑结构,非边界碎点链被清除(即标记为负,为了视图的清晰没有画出)。
如图5,是图4进行碎点链简化运算后的逻辑拓扑结构,同一点的碎点在同一碎点链上出现的次数减少了,孤点也被消除(即标记为负,为了视图的清晰没有画出)。
如图5所示,本实例得出的边界有序集是:(p3,p7)和(p0,p4,p6,p4,p5,p2,p1),p4在对应的轮廓有序集中出现了两次,符合实际情况。
以下是本实施实例的基于英伟达公司cuda并行计算技术的部分代码,体现了本发明适合并行运算的特性;提供这些代码的目的是,为计算机视觉开发者理解和使用本发明提供参考。
structfr_point{//碎点
longnext_x;//指向的碎点所在点的x值
longnext_y;//指向的碎点所在点的y值
longnext_s;//指向的碎点的编号
};
structpoint{
longx;//点的横坐标
longy;//点的纵坐标
longc;//点的颜色值
longselsete[4];//用于选择,可以代替if语句根据不同情况结合运
算,产生不同值
fr_points[8];//碎点集
};
pointp[5][5];//构造一个被点结构体组
for(i=0;i<5;i++){
//构造围墙,防止计算溢出,其颜色值-1为无效值,以防被连接
p[0][i].c=-1;
p[4][i].c=-1;
p[i][0].c=-1;
p[i][4].c=-1;
}
idx=threadidx.x+1;//线程号x,idx的范围1-3
idy=threadidx.y+1;//线程号y,idy的范围1-3
if(idx<4&&idy<4){//idx的范围1-3,idy的范围1-3
for(t=0;t<8;t++){
p[idx][idy].s[t].next_x=idx;//将所有碎点指向本点,
p[idx][idy].s[t].next_y=idy;
p[idx][idy].s[t].next_s=(t+1)%8;//将碎点构成顺时针闭合环状链,
结果见图2;
}
p[idx][idy].c=image_color[idx][idy];//导入图像颜色值
//碎点连接,连接运算为并行运算,运算结果见图3
p[idx][idy].selsete[3]=!p[idx][idy].c-p[idx][idy-1].c;
//保存s0对应联通方向的联通状况,颜色相等则连接状态为1,否则为零
p[idx][idy].s[0].next_y-=p[idx][idy].selsete[3];
//如果s0对外联通改变y的值,s0对应联通方向的点横坐标与s0所在点一致;s0对
应的联通方向的点横坐标x值和本点的相同所以无需变化
p[idx][idy].s[0].next_s=4*p[idx][idy].selsete[3]+1;
//如果s0对外联通变s的值为5,如果不联通则s值为1
p[idx][idy].selsete[3]=!(p[idx][idy].c-p[idx-1][idy-1].c);
p[idx][idy].s[1].next_x-=p[idx][idy].selsete[3];
p[idx][idy].s[1].next_y-=p[idx][idy].selsete[3];
p[idx][idy].s[1].next_s=4*p[idx][idy].selsete[3]+2;
p[idx][idy].selsete[3]=!(p[idx][idy].c-p[idx-1][idy].c);
p[idx][idy].s[2].next_x-=p[idx][idy].selsete[3];
p[idx][idy].s[2].next_s=4*p[idx][idy].selsete[3]+3;
p[idx][idy].selsete[3]=!(p[idx][idy].c-p[idx-1][idy+1].c);
p[idx][idy].s[3].next_x-=p[idx][idy].selsete[3];
p[idx][idy].s[3].next_y+=p[idx][idy].selsete[3];
p[idx][idy].s[3].next_s=4*!p[idx][idy].selsete[3];
p[idx][idy].selsete[3]=!(p[idx][idy].c-p[idx][idy+1].c);
p[idx][idy].s[4].next_y+=p[idx][idy].selsete[3];
p[idx][idy].s[4].next_s=4*!p[idx][idy].selsete[3]+1;
p[idx][idy].selsete[3]=!(p[idx][idy].c-p[idx+1][idy+1].c);
p[idx][idy].s[5].next_x+=p[idx][idy].selsete[3];
p[idx][idy].s[5].next_y+=p[idx][idy].selsete[3];
p[idx][idy].s[5].next_s=4*!p[idx][idy].selsete[3]+2;
p[idx][idy].selsete[3]=!(p[idx][idy].c-p[idx+1][idy].c);
p[idx][idy].s[6].next_x+=p[idx][idy].selsete[3];
p[idx][idy].s[6].next_s=4*!p[idx][idy].selsete[3]+3;
p[idx][idy].selsete[3]=!(p[idx][idy].c-p[idx+1][idy-1].c);
p[idx][idy].s[7].next_x+=p[idx][idy].selsete[3];
p[idx][idy].s[7].next_y+=p[idx][idy].selsete[3];
p[idx][idy].s[7].next_s=4*p[idx][idy].selsete[3];
//以下是将非边界碎点链标记为负数,以清除非边界碎点链,运算结果参图4
p[idx][idy].selsete[0]=-10;
p[idx][idy].selsete[1]=0;
p[idx][idy].selsete[2]=0;
p[idx][idy].selsete[3]=!(p[idx][idy].s[0].next_s-1)+!(p[idx][idy].s[1].
next_s-2);
//判断相邻两碎点s0,s1对外联通状况
p[idx][idy].s[1].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
//如果s0,s1都对外联通,s1.next_s指向被变化为负值,代表被消除
p[idx][idy].selsete[3]=!(p[idx][idy].s[1].next_s-2)+!(p[idx][idy].s[2].
next_s-3);
p[idx][idy].s[2].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[2].next_s-3)+!(p[idx][idy].s[3].
next_s-4);
p[idx][idy].s[3].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[3].next_s-4)+!(p[idx][idy].s[4].
next_s-5);
p[idx][idy].s[4].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[4].next_s-5)+!(p[idx][idy].s[5].
next_s-6);
p[idx][idy].s[5].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[5].next_s-6)+!(p[idx][idy].s[6].
next_s-7);
p[idx][idy].s[6].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[6].next_s-7)+!(p[idx][idy].s[7].
next_s-0);
p[idx][idy].s[7].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[7].next_s-0)+!(p[idx][idy].s[0].
next_s-1);
p[idx][idy].s[0].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
//以下是对前面的运算可能未完全清除的非边界碎点链(比如p1(s3))进行清除;
p[idx][idy].selsete[3]=!(p[idx][idy].s[0].next_s-1)+!(p[idx][idy].s[2].
next_s-3);
//保存s0、s2对外联通情况,如果都对外联通则所得值为零
p[idx][idy].s[1].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
//如果s0、s2对外联通,则s1的指向变为负数
p[idx][idy].selsete[3]=!(p[idx][idy].s[2].next_s-3)+!(p[idx][idy].s[4].
next_s-5);
p[idx][idy].s[3].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[4].next_s-5)+!(p[idx][idy].s[6].
next_s-7);
p[idx][idy].s[5].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[6].next_s-0)+!(p[idx][idy].s[0].
next_s-1);
p[idx][idy].s[7].next_s+=p[idx][idy].selsete[p[idx][idy].selsete[3]];
//下面是边界碎点链的简化,运算结果参见图5
p[idx][idy].selsete[3]=!(p[idx][idy].s[7].next_s-0);
//如果指向0,则说明s[7]对外不联通,如果对外不联通就将其指向s[0]的指向,并
清除s[0]
p[idx][idy].selsete[0]=p[idx][idy].s[7].next_x;
//s[7]对外联通则s7指向的横坐标x不变
p[idx][idy].selsete[1]=p[idx][idy].s[0].next_x;
//s[7]对外不联通则s7指向的横坐标x变为s[0]指向的横坐标
p[idx][idy].s[7].next_x=p[idx][idy].selsete[p[idx][idy].selsete[3]];
//选择运算,如果
p[idx][idy].selsete[0]=p[idx][idy].s[7].next_y;
p[idx][idy].selsete[1]=p[idx][idy].s[0].next_y;
p[idx][idy].s[7].next_y=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[7].next_s;
p[idx][idy].selsete[1]=p[idx][idy].s[0].next_s;
p[idx][idy].s[7].next_s=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=1;
//如果s[7]对外连通,其指向在前面几行代码中没被改变,需要保留s[0]
p[idx][idy].selsete[1]=-10;
//如果s[7]对外不连通,其指向会在前面几行代码中改变,需要清除s[0],负值代
表清除
p[idx][idy].s[0].next_s*=p[idx][idy].selsete[p[idx][idy].selsete[3]];
//做出选择运算,
p[idx][idy].selsete[3]=!(p[idx][idy].s[6].next_s-7);//如果指向7,则说
明s[6]对外不联通
p[idx][idy].selsete[0]=p[idx][idy].s[6].next_x;
p[idx][idy].selsete[1]=p[idx][idy].s[7].next_x;
p[idx][idy].s[6].next_x=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[6].next_y;
p[idx][idy].selsete[1]=p[idx][idy].s[7].next_y;
p[idx][idy].s[6].next_y=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[6].next_s;
p[idx][idy].selsete[1]=p[idx][idy].s[7].next_s;
p[idx][idy].s[6].next_s=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=1;
p[idx][idy].selsete[1]=-10;
p[idx][idy].s[7].next_s*=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[5].next_s-6);//如果指向6,则说
明s[5]对外不联通
p[idx][idy].selsete[0]=p[idx][idy].s[5].next_x;
p[idx][idy].selsete[1]=p[idx][idy].s[6].next_x;
p[idx][idy].s[5].next_x=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[5].next_y;
p[idx][idy].selsete[1]=p[idx][idy].s[6].next_y;
p[idx][idy].s[5].next_y=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[5].next_s;
p[idx][idy].selsete[1]=p[idx][idy].s[6].next_s;
p[idx][idy].s[5].next_s=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=1;
p[idx][idy].selsete[1]=-10;
p[idx][idy].s[6].next_s*=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[4].next_s-5);//如果指向5,则说
明s[4]对外不联通
p[idx][idy].selsete[0]=p[idx][idy].s[4].next_x;
p[idx][idy].selsete[1]=p[idx][idy].s[5].next_x;
p[idx][idy].s[4].next_x=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[4].next_y;
p[idx][idy].selsete[1]=p[idx][idy].s[5].next_y;
p[idx][idy].s[4].next_y=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[4].next_s;
p[idx][idy].selsete[1]=p[idx][idy].s[5].next_s;
p[idx][idy].s[4].next_s=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=1;
p[idx][idy].selsete[1]=-10;
p[idx][idy].s[5].next_s*=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[3].next_s-4);//如果指向4,则说
明s[3]对外不联通
p[idx][idy].selsete[0]=p[idx][idy].s[3].next_x;
p[idx][idy].selsete[1]=p[idx][idy].s[4].next_x;
p[idx][idy].s[3].next_x=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[3].next_y;
p[idx][idy].selsete[1]=p[idx][idy].s[4].next_y;
p[idx][idy].s[3].next_y=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[3].next_s;
p[idx][idy].selsete[1]=p[idx][idy].s[4].next_s;
p[idx][idy].s[3].next_s=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=1;
p[idx][idy].selsete[1]=-10;
p[idx][idy].s[4].next_s*=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[2].next_s-3);//如果指向3,则说
明s[2]对外不联通
p[idx][idy].selsete[0]=p[idx][idy].s[2].next_x;
p[idx][idy].selsete[1]=p[idx][idy].s[3].next_x;
p[idx][idy].s[2].next_x=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[2].next_y;
p[idx][idy].selsete[1]=p[idx][idy].s[3].next_y;
p[idx][idy].s[2].next_y=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[2].next_s;
p[idx][idy].selsete[1]=p[idx][idy].s[3].next_s;
p[idx][idy].s[2].next_s=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=1;
p[idx][idy].selsete[1]=-10;
p[idx][idy].s[3].next_s*=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[1].next_s-2);//如果指向2,则说
明s[1]对外不联通
p[idx][idy].selsete[0]=p[idx][idy].s[1].next_x;
p[idx][idy].selsete[1]=p[idx][idy].s[2].next_x;
p[idx][idy].s[1].next_x=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[1].next_y;
p[idx][idy].selsete[1]=p[idx][idy].s[2].next_y;
p[idx][idy].s[1].next_y=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[1].next_s;
p[idx][idy].selsete[1]=p[idx][idy].s[2].next_s;
p[idx][idy].s[1].next_s=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=1;
p[idx][idy].selsete[1]=-10;
p[idx][idy].s[2].next_s*=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[3]=!(p[idx][idy].s[0].next_s-1);//如果指向1,则说
明s[0]对外不联通
p[idx][idy].selsete[0]=p[idx][idy].s[0].next_x;
p[idx][idy].selsete[1]=p[idx][idy].s[1].next_x;
p[idx][idy].s[0].next_x=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[0].next_y;
p[idx][idy].selsete[1]=p[idx][idy].s[1].next_y;
p[idx][idy].s[0].next_y=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=p[idx][idy].s[0].next_s;
p[idx][idy].selsete[1]=p[idx][idy].s[1].next_s;
p[idx][idy].s[0].next_s=p[idx][idy].selsete[p[idx][idy].selsete[3]];
p[idx][idy].selsete[0]=1;
p[idx][idy].selsete[1]=-10;
p[idx][idy].s[1].next_s*=p[idx][idy].selsete[p[idx][idy].selsete[3]];
}。
本发明提供的一种图像轮廓有序点集提取方法,是一种方法发明,它可以通过cpu、gpu、mcu、dsp、fpga等计算机硬件来实现。
根据发明内容说明和实施实例可知,本发明的典型实施实例并不是对本发明的限定,任何利用本发明提出的逻辑拓扑结构,并依照本发明提出的碎点连接方法进行碎点连接的图像轮廓有序点集提取方法,都应属于本发明的范畴。