zoukankan      html  css  js  c++  java
  • 【CV】傅里叶描绘子原理及应用简介

    转载自:http://www.cnblogs.com/edie0902/p/3658174.html

    1 引言

    物体的形状识别是模式识别的重要研究方向,广泛用于图像分析、机器视觉和目标识别的应用中。在计算机中物体的形状表示方式有多种:边界曲线上点的坐标序列,边界上的点到物体中心的距离以及边界上的点随弧长变化的切线方向等。基于形状不同的表示方式,已有大量的形状识别方法被提出,如:基于边界特征点,不变矩、傅里叶描绘子和自回归模型等。Kauppien 比较了各种典型的形状识别方法,实验表明基于物体轮廓坐标序列的傅里叶描述子具有最佳形状识别性能。

    2 傅里叶描述子

    傅里叶描述子的基本思想是:假定物体的形状是一条封闭的曲线,沿边界曲线上的一个动点P(l)的坐标变化x(l)+iy(l)是一个以形状边界周长为周期的函数,这个周期函数可以用傅里叶级数展开表示,傅里叶级数中的一系列系数z(k)是直接与边界曲线的形状有关的,称为傅里叶描述子。

    The outline of the shape is seen as a closed curve, described by its arc length s from an origin A.  We normalize this parameter so that its sum over the whole curve is equal to 2.Pi, it is the parameter t as shown below. We define a function of t, called Phi, that gives the angular variation between the tangent at the origin A and the tangent at position s.

    (1)

    此函数是连续的周期的(周期为2.pi),所以可以通过傅里叶级数来表示:

    (2)

    式中a(k)就是傅里叶描绘子

    3测试算法

    3.1 寻找形状的闭合边界

     

    复制代码
     1 function [new_indeces]=find_close_indeces(im_in)
     2 
     3 [r,c]=find(im_in);
     4 
     5 p=pdist([r c]);
     6 psqr=squareform(p);
     7 
     8  nl=length(r);
     9  
    10 new_indeces=[r(1) c(1)];
    11 ind_ind_data=1;
    12 lenindata=1;
    13 newind=1;
    14  for ind=2:nl
    15   
    16     mcur_dist=psqr(newind,:);
    17     [dist_min,dist_min_ind]=sort(mcur_dist);
    18     [dmin inddmin]=setdiff( dist_min_ind,ind_ind_data);
    19     dist_min_ind =  dist_min_ind(sort(inddmin));
    20     newind=dist_min_ind(1);
    21     new_indeces  =[new_indeces; [r(newind) c(newind)]];
    22     
    23      ind_ind_data=[ind_ind_data; newind];
    24     lenindata=length(ind_ind_data);
    25     
    26  end
    27  
    复制代码

    3.2  傅里叶描述子对形状进行处理并且重建

    复制代码
     1 function [border_fft,border_restored,xx,yy] = make_fft_sec(image_edged,ncoef)
     2 
     3 border_fft=zeros(size(image_edged));border_restored=zeros(size(image_edged));
     4 [a,b]=size(image_edged);
     5 
     6 % find border
     7  f=find(image_edged);
     8  lenf=length(f);
     9 
    10  
    11   [new_indeces]=find_close_indeces(image_edged);
    12   ii=new_indeces(:,1);jj=new_indeces(:,2);
    13  border_cmplx=ii+j*jj;
    14 
    15    border_fft =fftshift(fft(border_cmplx));
    16    
    17    if mod(lenf,2) % odd
    18     lenf = lenf-1;
    19    end
    20     rc = fix(lenf/2)+1;  
    21 
    22 
    23 p1=[ (rc+1):(rc+1+ncoef-1)];
    24 p2=[ (rc-1):-1:(rc-1-ncoef+1)];
    25 
    26 
    27 
    28 border_ifft=zeros(1,lenf);
    29 for ind=1:(ncoef)
    30     mfreq_vec=zeros(1,lenf);
    31    mfreq_vec(p1(ind))=border_fft(p1(ind));
    32     mfreq_vec(p2(ind))=border_fft(p2(ind));
    33     
    34     border_ifft = border_ifft+(ifft(ifftshift(mfreq_vec)));
    35 end
    36 
    37 %add dc
    38  mfreq_vec=zeros(1,lenf);
    39  mfreq_vec(rc)=border_fft(rc);
    40  border_ifft = border_ifft+(ifft(ifftshift(mfreq_vec)));
    41 
    42 
    43 border_restored = zeros(size(image_edged));
    44 xx=real(border_ifft);yy=imag(border_ifft);
    45 
    46 
    47 yyt=round(yy);xxt=round(xx);
    48 
    49 if(length(xxt)==0)
    50     return ;
    51 end
    52 
    53 hind=sub2ind(size(border_restored),yyt,xxt);
    54 border_restored(round(hind))=1;
    55 
    56 figure(4),plot((xx),yy,'ro');
    复制代码

     

    3.3 测试代码 

    复制代码
     1 %% create the matrix
     2 shapes=2;
     3 
     4 switch shapes
     5     case 1
     6         m=zeros(22);
     7         m(4:19,4)=1;m(4:19,19)=1;
     8         m(4,5:19)=1;m(19,5:19)=1;
     9     case 2
    10         m=zeros(41);
    11         m(5,18:24)=1;
    12         m(5:19,18)=1; m(5:19,24)=1; m(19:25,5)=1;
    13         m(19,5:18)=1;m(19,24:37)=1; m(19:25,37)=1;
    14         m(25,5:18)=1;m(25,24:37)=1;
    15         m(25:39,18)=1; m(25:39,24)=1;
    16         m(39,18:24)=1;
    17     case  3
    18         m=zeros(30);
    19          m(10,14:20)=1;
    20          m(10:22,14)=1;
    21           m(16,14:20)=1;
    22 end
    23 
    24 figure(1),imagesc(m);length(find(m))
    25 %% make fft transform                       
    26 
    27 [border_fft,border_restored]=make_fft_sec(m,10);
    28 figure(2),imagesc(border_restored);
    复制代码

    参考:

    http://www.tsi.telecom-paristech.fr/pages/enseignement/ressources/beti/descript_fourier/index.html

    王涛, 刘文印, 孙家广, 张宏江 - 《计算机研究与发展》2002年12期

    本文为博主原创文章,未经博主允许不得转载。若允许转载,请注明来源https://www.cnblogs.com/SoaringLee/,否则保留追究法律责任的权利!另外,本人提供付费咨询服务并长期承接各类毕设以及外包项目。联系QQ:2963033731。加Q备注:CSDN外包
  • 相关阅读:
    安利博客
    python 的高阶算法之堆排序
    functools模块用途
    类型注解
    高阶函数和装饰器
    生成器

    递归函数
    匿名函数
    函数 的 返回值作用域
  • 原文地址:https://www.cnblogs.com/SoaringLee/p/10532514.html
Copyright © 2011-2022 走看看