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