Bonjour à tous je suis entrain d'étudier différents algorithmes de détection de contours. Après diverses lectures, j'ai un petit truc que je ne saisie pas très bien c'est la notion de "gradient"
Pour calculer un "gradient" on applique un filtre de convolution, et c'est là que je décroche un peu d'un point de vue compréhension.
Là ou j'ai un doute, c'est lorsque que l'on applique un filtre de convolution on divise le résultat par une valeur.
(par exemple pour Sobel le diviseur est 4)
Mais pour le calcul du "gradient" on ne divise pas c'est bien ça ?
Le calcul du "gradient" diffère-t-il légèrement de la convolution ?
Doit on borner le résultat dans l'intervalle [0,1] ?
Voici une partie simplifiée du code (en pascal) que j'utilise pour la convolution
Code pascal : 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 For Y := 0 To ImageHeight-1 Do begin For X := 0 To ImageWidth-1 Do begin For J := 0 To KS Do //taille de la matrice = KSxKS Begin // Position Source Y pY := Clamp(Y + J - KSDiv2, OwnerBitmap.ClipRect.Top, OwnerBitmap.ClipRect.Bottom); moffset := J * Size; For I := 0 To KS Do Begin // Position Source X pX := Clamp(X + I - KSDiv2, OwnerBitmap.ClipRect.Left, OwnerBitmap.ClipRect.Right); KernelValue := aMatrix[moffset + I]; // Valeur dans la matrice FColor := TmpBmp.GetPixel(pX, pY).AsColorVector; // Convolution standard FColor := FColor * KernelValue; SumRec := SumRec + FColor; end; end; SumRec := SumRec * RDiv; // RDIV = 1/Divisor SumRec := SumRec + (Bias * _FloatColorRatio); AColor.Create(SumRec); DstPtr^ := AColor; end; end;
et les données du filtre de sobel par exemple
Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 ( Name : 'Sobel horizontal'; Category : cfcEdgeDetect; Bias : 0; Divisor : 4; MatrixType : mct3x3; MatrixSize : 3; Matrix : (_3 : ( -1,-2,-1, 0, 0, 0, 1, 2, 1 )); )
Après pour le reste ca va (je pense) :
la norme c'est Sqrt(Gx2 + Gy2)
et pour la direction c'est Tan-1(gx/gy) = arctan2(gx,gy)
Merci d'avance pour vos éclaircissements
Jérôme
Partager