您的位置:首页 > 其它

特征点识别(Breakpoint/Dominant-points Classsification)——AKC函数的分析与实现

2012-11-18 20:43 204 查看
摘要:本文所述算法来自IEEE PAMI的文章"Multiprimitive Segmenatation of Planar Curves-A Two-Level Breakpoint Classification and Tuning Approach"。大家可以到百度文库:http://wenku.baidu.com/view/e01f28f10242a8956bece43f.html?st=1下载。如果没有文库号的,可以到新浪爱问:http://ishare.iask.sina.com.cn/f/34715669.html免费下载。本文算法程序均系作者原创,欢迎各位研究指正。如需转载,请注明出处。

一、AKC函数介绍

首先把特征点分为两类,一类角点(corners),一类平滑结点(Smooth joints)。(注意:论文中把特征点称为Breakpoints断点,两者是同一概念。如果宽泛的将,有时我们也把特征点或者断点统称为角点)。其中角点类表明其两侧具有不连续的切线。其中平滑结点类表明其两侧具有不连续的曲率。如图1图2。

View Code

double* AKC(Link &p, int kb)
{
// AKC函数
int i=0;
Link PJ = kPriorPoint(p, kb);    // PJ is Pj Pj∈(p-k, p+k)
Link PJN = NULL;    // PJN is Pj-, Pj-=Pj-k
Link PJP = NULL;    // PJP is Pj+, Pj+=Pj+k
int ajx, ajy, bjx, bjy;
int tk=2*kb;
double *c = new double [tk+1];
while(i<=tk)
{
PJN = kPriorPoint(PJ, kb);
PJP = kNextPoint(PJ, kb);
ajx = PJP->x-PJ->x;
ajy = PJP->y-PJ->y;
bjx = PJN->x-PJ->x;
bjy = PJN->y-PJ->y;
c[i] = (ajx*bjx+ajy*bjy)/(sqrt(ajx*ajx+ajy*ajy)*sqrt(bjx*bjx+bjy*bjy));
PJ = PJ->next;
if (PJ->csp[0] == 0)
{
PJ=PJ->next;
}
i++;
}
return c;
}


其中Link kPriorPoint(Link &p, int k);和Link kNextPoint(Link &p, int k);函数为寻找当前节点的前面k个结点,和后面k个结点。

三、实验结果

对下图进行操作。







上图的角点(正坐标在前,纵坐标在后)49 75;49 100;65 117;156 119;156 56;72 56;共6个角点。那么使用AKC函数后,结果如何?先看看每一点的AKC函数图,从72 56点开始,逆时钟转依次显示每一点的AKC,共6幅图。













从图中可以清晰看出最后两幅图对应为角点,其余为smooth点。

四、结束语

其实AKC函数是为后面的PHF函数做准备的,因此本文没有列举大量的实例。后面的PHF函数将会有更直观的分类感受。写博客真不是件轻松的事情啊,图片还得一张张传,字还得慢慢敲......好不容易写了篇,加油吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐