Solitamente un kernel gaussiano viene utilizzato come filtro di smoothing per diminuire il rumore presente nelle immagini o come kernel per una SVM.In questi giorni ho avuto la necessità di eseguire una convoluzione fra una matrice a valori reali ed un kernel gaussiano; mi sono quindi creato un piccolo metodo di cui vi allego il codice...

private static double[,] gaussian(int length)
       {
           //Dimensione dispari
           if (length % 2 == 0)
               length++;
           // deviazione std, da passare per una migliore implementazione come parametro della funzione
           double stddev = length / 4.9;
           // kernel gaussiano monodimensionale
           double[] monodimensional = new double[length];
 
           for (int i = 0; i < length; i++)
           {
               int x = i - length / 2;
               double exponent = x * x / (-2 * stddev * stddev);
               monodimensional[i] = Math.Exp(exponent);
           }
 
           // kernel gaussiano bidimensionale
           double[,] bidimensional = new double[length, length];
           double sum = 0.0;
           for (int i = 0; i < length; i++)
           {
               for (int j = 0; j < length; j++)
               {
                   bidimensional[i, j] = monodimensional[i] * monodimensional[j];
                   sum += bidimensional[i, j];
               }
           }
 
           //Normalizzazione
           for (int i = 0; i < length; i++)
           {
               for (int j = 0; j < length; j++)
               {
                   bidimensional[i, j] /= sum;
               }
           }
           return bidimensional;
       }
Technorati tags: ,