L'algorithme créait un noyau de convolution d'un certain rayon et d'un sigma défini.
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)
Rayon 3 : sigma 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Partager