]> AND Private Git Repository - lniv_gpu.git/blob - levelines_common.h
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
version opérationnelle
[lniv_gpu.git] / levelines_common.h
1
2
3 #ifndef LEVELINES_COMMON_H
4 #define LEVELINES_COMMON_H
5
6
7
8 #include <cuda_runtime.h>
9
10
11
12
13 ////////////////////////////////////////////////////////////////////////////////
14 // Reference CPU functions
15 ////////////////////////////////////////////////////////////////////////////////
16 //extern "C" void fonc(...);
17 /**
18  *
19  * \brief determine la valeur de NG de la ligne de niveau demarrant de i,j
20  * \author NB - PhyTI
21  *
22  * \param[in] image  image d'entree
23  * \param[in] i      coord i du point de depart
24  * \param[in] j      coord j du point de depart
25  *
26  * \return la valeur de la ligne
27  *
28  * la ligne de niveau ne va que d'un cote
29  * on cherche le segment de r pixels ou les valeurs
30  * de l'image ont une variance minimale 
31  * il y a 24 segments possibles (4 par quadrants)
32  * la direction 0 va vers le haut, les directions tournent 
33  * dans le sens horaire, dans l'ordre croissant
34  *
35  * pas de test de bord : pas d'utilisation a moins de r pixels du bords
36  * 
37  *
38  * EN TEST
39  */
40 int lniv4_value(unsigned int *image, int2 *path, int i, int j, int idim, int jdim, int *dout, unsigned int r )
41 {
42   int value_c ;
43   int value2_c ;
44   int d, v, p, d_min, eq_min, eq, sum, sum2 ;
45   int sum_eq_min ;
46   int it, jt ;
47
48
49   /* mem */
50   value_c = image[i*jdim + j] ;
51   value2_c = value_c*value_c ;
52
53   // direction d=0
54   sum = value_c ;
55   sum2 = value2_c ;
56   it = i ;
57   jt = j ;
58   for (p=0; p<r-1; p++)
59     {
60       it += path[p].x ; // Di_Q1[0][p] ;
61       jt += path[p].y ; // Dj_Q1[0][p] ;
62       v = image[it*jdim + jt] ;
63       sum += v ;
64       sum2 += v*v ;
65     }
66   eq_min = sum2 - sum*sum/r ; /* *4 */
67   sum_eq_min = sum ;
68   d_min = 0 ;
69
70   /* direction 1 a 5 */
71   for (d=1; d<6; d++)
72     {
73       sum = value_c ;
74       sum2 = value2_c ;
75       it = i ;
76       jt = j ;
77       for (p=0; p<r-1; p++)
78         {
79           it += path[d*jdim + p].x ; // Di_Q1[d][p] ;
80           jt += path[d*jdim + p].y ; // Dj_Q1[d][p] ;
81           v = image[it*jdim + jt] ;
82           sum += v ;
83           sum2 += v*v ;
84         }
85       eq = sum2 - sum*sum/r ; /* *4 */
86       if (eq < eq_min)
87         {
88           eq_min = eq ;
89           sum_eq_min = sum ;
90           d_min = d ; /* pour info */    
91         }
92     }
93
94   /* direction 6 a 11 */
95   for (d=0; d<6; d++)
96     {
97       sum = value_c ;
98       sum2 = value2_c ;
99       it = i ;
100       jt = j ;
101       for (p=0; p<r-1; p++)
102         {
103           it += path[d*jdim + p].y ; // Dj_Q1[d][p] ;
104           jt -= path[d*jdim + p].x ; // ]Di_Q1[d][p] ;
105           v = image[it*jdim + jt] ;
106           sum += v ;
107           sum2 += v*v ;
108         }
109       eq = sum2 - sum*sum/r ; /* *4 */
110       if (eq < eq_min)
111         {
112           eq_min = eq ;
113           sum_eq_min = sum ;
114           d_min = d+6 ; /* pour info */  
115         }
116     }
117
118   /* direction 12 a 17 */
119   for (d=0; d<6; d++)
120     {
121       sum = value_c ;
122       sum2 = value2_c ;
123       it = i ;
124       jt = j ;
125       for (p=0; p<r-1; p++)
126         {
127           it -= path[d*jdim + p].x ; // Di_Q1[d][p] ;
128           jt -= path[d*jdim + p].y ; // Dj_Q1[d][p] ;
129           v = image[it*jdim + jt] ;
130           sum += v ;
131           sum2 += v*v ;
132         }
133       eq = sum2 - sum*sum/r ; /* *4 */
134       if (eq < eq_min)
135         {
136           eq_min = eq ;
137           sum_eq_min = sum ;
138           d_min = d+12 ; /* pour info */         
139         }
140     }
141   
142   /* direction 18 a 23 */
143   for (d=0; d<6; d++)
144     {
145       sum = value_c ;
146       sum2 = value2_c ;
147       it = i ;
148       jt = j ;
149       for (p=0; p<r-1; p++)
150         {
151           it -= path[d*jdim + p].y ; // Dj_Q1[d][p] ;
152           jt += path[d*jdim + p].x ; // Di_Q1[d][p] ;
153           v = image[it*jdim + jt] ;
154           sum += v ;
155           sum2 += v*v ;
156         }
157       eq = sum2 - sum*sum/r ; /* *4 */
158       if (eq < eq_min)
159         {
160              eq_min = eq ;
161              sum_eq_min = sum ;
162              d_min = d+18 ; /* pour info */      
163         }
164     }
165   
166   *dout = d_min ;
167   return sum_eq_min/r ;
168 }
169
170
171 ////////////////////////////////////////////////////////////////////////////////
172 // GPU functions (in file.cu)
173 ////////////////////////////////////////////////////////////////////////////////
174 //extern "C" void fonc(float *h_Kernel);
175
176
177 #endif