1. 程式人生 > >基於影象形狀的一種比較漂亮的分類演算法

基於影象形狀的一種比較漂亮的分類演算法

Fréchet distance(弗雷歇距離)是法國數學家Maurice René Fréchet在1906年提出的一種路徑空間相似形描述( 此外還在這篇論文裡定義了 度量空間),這種描述同時還考慮進路徑空間距離的因素[1],對於空間路徑的相似性比較適用。

直觀的理解,Fréchet distance就是狗繩距離:主人走路徑A,狗走路徑B,各自走完這兩條路徑過程中所需要的最短狗繩長度

嚴格的數學定義如下:

設二元組(\boldsymbol{S},d)是一個度量空間,其中d\boldsymbol{S}上的度量函式.

1. 在單位區間[0, 1]上的對映\gamma :[0,1]\rightarrow \boldsymbol{S}是連續對映,則稱\gamma\boldsymbol{S}上的連續曲線。

2. 從單位區間到其自身的對映\zeta :[0, 1]\rightarrow [0,1],滿足如下三個條件:1)\zeta是連續的,2)\zeta是非降的,即對於任意x,y\in [0, 1]

,且x\leq y,都有\zeta (x)\leq \zeta (y)成立,3)\zeta是滿射,則稱函式\zeta為單位區間[0, 1]的重引數化函式,且此時有\zeta (0)=0\zeta (1)=1. 特別地,當\zeta為恆等函式\zeta (x)=x時,稱\zeta為平凡重引數化函式,否則,稱\zeta為非平凡重引數化函式。顯然的,單位區間的重引數化函式有無窮多個。

3. 設AB\boldsymbol{S} 上的兩條連續曲線,即A :[0, 1]\rightarrow \boldsymbol{S}B :[0, 1]\rightarrow \boldsymbol{S}. 又設 α 和 β 是單位區間的兩個重引數化函式,即 \alpha :[0, 1]\rightarrow \boldsymbol{S}\beta  :[0, 1]\rightarrow \boldsymbol{S}. 則曲線A與曲線B的弗雷歇距離F(A, B)定義為

F(A, B)=\inf_{\alpha,\beta}\max_{t\in [0, 1]}  \{d (A(\alpha (t)), B(\beta (t))) \}

其中d\boldsymbol{S}上的度量函式.

數字化/離散化

設定t是時間點,該時刻,曲線A上的取樣點為A(\alpha (t)), 曲線B上取樣點為B(\alpha (t)). 如果使用歐氏距離,則容易定義d (A(\alpha (t)), B(\beta (t))). 在每次取樣中t離散的遍歷區間[0,1], 得到該種取樣下的最大距離\max_{t\in [0, 1]}  \{d (A(\alpha (t)), B(\beta (t))) \}. 弗雷歇距離就是使該最大距離最小化的取樣方式下的值。

易於理解的,在離散方式下,我們不可能得到真實的弗雷歇距離,而可以無限的趨近。但是越精確的值需要越大的計算量。

F(A, B)=\lim_{n\rightarrow \infty ,max{\left | t_k - t_{k+1})\right |}\rightarrow 0} {\widetilde{F}^{n}(A,B)}=\lim_{n\rightarrow \infty ,max{\left | t_k - t_{k+1})\right |}\rightarrow 0}\inf_{\alpha,\beta}\max_{t\in \{t_k\}}  \{d (A(\alpha (t)), B(\beta (t))) \}

基於該離散思想,對應的兩條空間(3D)路徑弗雷歇距離matlab程式碼如下:

%% Frechet Distance between two curves (3D)

%%

functionf =frechet3D(P1,P2,varargin)

X1=P1(:,1);

X2=P2(:,1);

Y1=P1(:,2);

Y2=P2(:,2);

Z1=P1(:,3);

Z2=P2(:,3);

%get path point length

L1=length(X1);

L2=length(X2);

%check vector lengths

if or(L1~=length
(Y1),L2~=length(Y2)) error('Paired input vectors (Xi,Yi) must be the same length.') end %check for column inputs if or(or(size(X1,1)<=1,size(Y1,1)<=1),or(size(X2,1)<=1,size(Y2,1)<=1)) error('Input vectors must be column vectors.') end %create maxtrix forms X1_mat=ones(L2,1)*X1'; Y1_mat=ones(L2,1)*Y1'; Z1_mat=ones(L2,1)*Z1'; X2_mat=X2*ones(1,L1); Y2_mat=Y2*ones(1,L1); Z2_mat=Z2*ones(1,L1); %calculate frechet distance matrix frechet1=sqrt((X1_mat-X2_mat).^2+(Y1_mat-Y2_mat).^2+(Z1_mat-Z2_mat).^2); fmin=min(frechet1(:)); fmax=max(frechet1(:)); %handle resolution if ~isempty(varargin) res=varargin{1}; if res<=0 error('The resolution parameter must be greater than zero.') elseif ((fmax-fmin)/res)>10000 warning('Given these two curves, and that resolution, this might take a while.') elseif res>=(fmax-fmin) warning('The resolution is too low given these curves to compute anything meaningful.') f=fmax; return end else res=(fmax-fmin)/100; end %compute frechet distance clear f for q3=fmin:res:fmax im1=bwlabel(frechet1<=q3); %get region number of beginning and end points if and(im1(1,1)~=0,im1(1,1)==im1(end,end)) f=q3; break end end if (~(exist ('f'))) f=fmax; end % disp(f) return

--------

[1] Fréchet, M. Maurice. "Sur quelques points du calcul fonctionnel." Rendiconti del Circolo Matematico di Palermo (1884-1940) 22.1 (1906): 1-72.