倒角距离变换

这个名词两年前看文章就看到了,可是那时候还不知道什么叫博士,不知道要挣钱养家,于是乎态度就是管他是什么,知道有这么个东西就OK了。两年里,这个词我看了不下5遍了,始终也没想搞明白。终于,最近才对此有些兴趣。可是查这个方法的时候,发现文章最新的也是在上个世纪80年代的,在文献里发现作者都是上一代甚至上两代的“圣斗士”。但是花了好大的力气,才看明白这个方法。发现关于这个方法的很多概念都不是很清晰的,那个时候,计算机视觉和图像处理还不是一个热门的话题吧。发现了很多概念,chamfer metrics(chamfer distance), distance transform, sequential distance transform。最经典的一篇文献就是88年PAMI上的hierachical chamfer matching: a parametric edge matching algorithm。看了这个文章,又查了一些网页诸如 http://www.spatialanalysisonline.com/OUTPUT/html/Distancetransforms.html 。才明白啥是chamfer,chamfer本意是砍树出现很多锯齿的斜面,这里所谓chamfer就是在离散的数字图像上近似欧式距离时候,也会产生很多有锯齿的斜面,所以叫做chamfer metric。而现在所谓的chamfer matching都是指最早的sequential distance transform。说白了这个方法就是采用distance transform的方法是如何鲁棒的匹配一个模板。 而且matlab中还有一个函数bwdist()专门完成这个功能 ,我运行了一下,一开始不是很理解,我以为不是一个函数,后来就自己遍了一段代码,结果发现结果是一样的。后来仔细分析一下,才感觉,就应该像bwdist()那样的运行效果。不过自己编写了一遍,还能找点感觉。暂且贴段代码吧。
#include "chamferDT.h"
#include "assert.h"
#define INFINITE_NUM 1000000
//sequential distance transform using (4,3) distance
void chamferDT(IplImage*edge,      //the edge images, single channel images
                 IplImage*dt,           //the distance transform images
        float threshold){
       assert(edge!=NULL);
       assert(dt!=NULL);
       int width = edge->width;
    int height = edge->height;
    int widthStep = edge->widthStep;
    cvCopyImage(edge,dt);
    BYTE *imdata =(BYTE*) dt->imageData;
    for(int i=0; i<height; i++)
     for(int j=0; j<width; j++)
      imdata[i*widthStep+j] = (imdata[i*widthStep+j]<threshold ? INFINITE_NUM : 0);
    //forward process
          for(int i=1; i<height; i++)
     for(int j=1; j<width-1; j++){
      imdata[i*widthStep+j] = min(min(min(min(imdata[(i-1)*widthStep+j-1]+4,imdata[(i-1)*widthStep+j]+3),
                                                                                     imdata[(i-1)*widthStep+(j+1)]+4),
                         imdata[i*widthStep+j-1]+3),
                         imdata[i*widthStep+j]);
     }
    //backward process
    for(int i=height-2; i>=0; i--)
     for(int j=width-2; j>=1; j-- ){
                    imdata[i*widthStep+j] = min(min(min(min(imdata[i*widthStep+j],imdata[i*widthStep+j+1]+3),
                                                                                   imdata[(i+1)*widthStep+j-1]+4),
                           imdata[(i+1)*widthStep+j]+3),
                           imdata[(i+1)*widthStep+j+1]+4);
     }
     for(int i=0; i<height; i++)
      for(int j=0; j<width; j++)
       imdata[i*widthStep+j] =(imdata[i*widthStep+j]*6 > 255 ? 255 : imdata[i*widthStep+j]*6) ;
}
转载自http://blog.sina.com.cn/s/blog_78f6d29e0100qc3x.html
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值