2012-01-07 6 views
0

Est-il possible de le faire plus rapidement? Je veux réduire la complexité de O (N^2) à quelque chose de plus bas. Note: Le noyau du filtre est symétrique en rotation autour de N/2.Algorithme de filtre 2D

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; 
       } 
      } 

     } 
    } 

Répondre

1

Vous devez apprendre le théorème de convolution. Il s'agit essentiellement de la transformée de Fourier de votre image et du noyau multiplié puis le résultat inverse transformé. Recherche, il y a des tonnes de sites avec un exemple de code.

+0

Donc fftw le ferait. Mais alors j'ai besoin de zéro-pad mon noyau pour lui faire la même dimension que mon image ou? – user877329

+0

Il pourrait être nécessaire pour le calcul de FFT en fonction de la symétrie mais à la fin il s'auto-amortira. Vous ne pouvez pas vraiment dire sans mesurer. Pour les petites tailles de noyaux, il existe des implémentations qui tirent parti du matériel SIMD et reviennent à la FFT. – artificialidiot

+0

Je vais essayer – user877329

Questions connexes