2012-01-07 76 views
0

有沒有辦法更快地做到這一點?我想把O(N^2)的複雜度降低到更低的水平。注意:濾波器內核在N/2附近是旋轉對稱的。二維濾波算法

for(unsigned int k=N/2;k<source.getHeight()-N/2;k++) 
    { 
    for(unsigned int l=N/2;l<source.getWidth()-N/2;l++) 
     { 

     for(unsigned int m=0;m<N;m++) 
      { 
      for(unsigned int n=0;n<N;n++) 
       { 
       dest(l,k).red +=p_kernel[m][n]*source(l+n-N/2,k+m-N/2).red; 
       dest(l,k).green+=p_kernel[m][n]*source(l+n-N/2,k+m-N/2).green; 
       dest(l,k).blue +=p_kernel[m][n]*source(l+n-N/2,k+m-N/2).blue; 
       } 
      } 

     } 
    } 

回答

1

您需要了解卷積定理。它基本上對圖像和內核進行傅立葉變換,然後將結果進行逆向變換。搜索它,有大量的網站與示例代碼。

+0

所以fftw會做到這一點。但是接下來我需要將我的內核填充到與我的圖像相同的尺寸,或者? – user877329 2012-01-10 13:26:43

+0

根據對稱性計算FFT可能是必要的,但最終它會自行分攤。如果不測量,你無法確定。對於小尺寸的內核,可以利用SIMD硬件並回退到FFT。 – artificialidiot 2012-01-12 12:34:10

+0

我會試試看 – user877329 2012-01-13 20:32:48