[Image] Créer un noyau de convolution gaussien
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)
Code:
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 2
http://humbert-florent.developpez.co...e/gauss3-2.jpg
Rayon 3 : sigma 5
http://humbert-florent.developpez.co...e/gauss3-5.jpg
Rayon 5 : sigma 5
http://humbert-florent.developpez.co...e/gauss5-5.jpg
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.
relation entre sigma et taille masque
bonsoir,
s'il vous plait peut on m'expliquer comment peut on determiner la relation entre la taille du masque et la valeur de sigma d'un filtre gaussien.
j'ai trouvé que la taille=6*sigma sans explications
s'il vous peut on m'expliquer d'ou vient cette formule.
Merci d'avance.
Citation:
Envoyé par
pseudocode
En théorie, il faudrait un rayon infini car la courbe gaussienne ne devient jamais nulle. La courbe gaussienne possède cependant des propriétés intéressantes : la plupart des valeurs "fortes" sont autour de zéro (le centre du masque)
http://upload.wikimedia.org/wikipedi...on_diagram.svg
68% des valeurs se trouvent dans un rayon "sigma" autour du centre
95% des valeurs se trouvent dans un rayon "2*sigma" autour du centre
99% des valeurs se trouvent dans un rayon "3*sigma" autour du centre
Donc en prenant un rayon de 2*sigma ou 3*sigma, on a un "bon" noyau gaussien.
C'est à dire un masque de taille (2*rayon) entre 4*sigma et 6*sigma.
probléme du lissage gaussien et solution
slt..certes,utiliser un filtre gaussien, revient à éliminer le bruit,mais il ne faut pas oublier que c'est un filtre linéaire:il diffuse de la méme maniere sur toute l'image.une solution pour palier à ce probléme serait de le combiner avec un filtre non linéaire, comme le filtre AOS, qui diffuse de façon uniforme,de cette façon on peut controlér le lissage du filtrage, en imposant un lissage faible au niveau des contours (ou régions d’intérêt ) et un autre important ailleurs.