Bonjour à tous, j'ai besoin d'un peu d'aide pour comprendre et finir mon bout de code.

Pas très original, je souhaite implémenter l'algorithme de sobel (en vue d'une implé de canny edge par la suite...).

Je ne vois pas comment calculer la norme du gradient G = sqrt(Gx²+Gy²) avec les éléments que j'ai déjà :

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
35
36
37
38
39
40
41
42
43
44
45
46
47
void sobel(IplImage *src, IplImage *dst, bool dir){
 
    // Masques de convolution
	CvMat* sobel = cvCreateMat( 3, 3, CV_32FC1);
    cvSet( sobel, cvScalar( 0 ) );
	if( dir == true){
		cvmSet( sobel, 0, 0,-1);
		cvmSet( sobel, 0, 2,1);
		cvmSet( sobel, 1, 0,-2);
		cvmSet( sobel, 1, 2,2);
		cvmSet( sobel, 2, 0,-1);
		cvmSet( sobel, 2, 2,1);
	}
	else{
		cvmSet( sobel, 0, 0,1);
		cvmSet( sobel, 0, 1,2);
		cvmSet( sobel, 0, 2,1);
		cvmSet( sobel, 2, 0,-1);
		cvmSet( sobel, 2, 1,-2);
		cvmSet( sobel, 2, 2,-1);
	}
    cvFilter2D( src, dst, sobel );
 
int main(){
     IplImage * src = cvLoadImage("xxxx.png",1);
     IplImage * src = cvLoadImage("xxxx.png",1);
     IplImage *gray = cvCreateImage(cvSize(img->width,img->height),IPL_DEPTH_8U,1);
     IplImage *sobx = cvCloneImage(gray);
     IplImage *soby = cvCloneImage(gray);
     IplImage *sobine = cvCloneImage(gray);
 
    sobel(gray,sobx,1);
		sobel(gray,soby,0);
		CvScalar p1,p2,p3;
 
		for(int x=0;x<img->width;x++){
			for(int y=0;y<img->height;y++){
				p1 = cvGet2D(sobx,y,x);
				p2 = cvGet2D(soby,y,x);
				p3.val[0] = sqrt(p1.val[0]*p1.val[0] +                     p2.val[0]*p2.val[0]);
				cvSet2D(sobine,y,x,p3);
			}
		}
 
// Que faire de sobx et soby sachant que je souhaite leur norme dans sobine ?
 
}
Merci par avance pour l'aide !

Edit : Je pense que je me suis trompé sur ma compréhension de la norme du gradient donc je pouvais pas progresser. Je pense que j'ai résolu mon problème et j'ai mis à jour mon code. Est-ce que vous pouvez me dire si j'ai bon ou pas ?