【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外包
原文地址:https://www.cnblogs.com/SoaringLee/p/10532514.html