Si le rayon vaut 1 par exemple, alors le noyau sera de taille 2*rayon+1 en largeur et 2*rayon +1 en hauteur.
Pour accèder à un élément du noyau, on note : kernel(i,j) ou (i,j) désigne la position (commence à 0 et pas à 1)
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | fonction creerNoyauGaussien(Entier rayon, Reel sigma) -> Noyau kernel : Noyau de convolution de taille largeur = 2*rayon+1 hauteur = 2*rayon+1 et centré en (rayon, rayon) Si sigma == 0 Erreur Si rayon<1 Erreur Réel gaussianKernelFactor <- 0 Réel e <- 0 Pour ky = -rayon à rayon Pour kx = -rayon à rayon { e <- exp( - (kx*kx+ky*ky) / (2*sigma*sigma)) gaussianKernelFactor <- gaussianKernelFactor + e kernel(kx+rayon, ky+rayon) <- e } /*on divise tout par le facteur afin que la somme de tous les éléments * soient égaux à 1 */ Pour ky = -rayon à rayon Pour kx = -rayon à rayon { kernel(kx+rayon, ky+rayon) <- kernel(kx+rayon, ky+rayon) / gaussianKernelFactor } retourner kernel |
Rayon 3 : sigma 5
Rayon 5 : sigma 5
A noter que le temps d'attente devient infernal au dessus d'yn rayon 5 (matrice de convolution de taille 11*11), il vaut mieux passer dans l'espace de Fourier.