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

Private GIT Repository
version opérationnelle
[lniv_gpu.git] / levelines_common.h
index ddb0ea2a01f25a19095bb56b10a1a0eb1f06383c..b96bc6b7b0227513c6deebd1fae6659ff25dabd7 100644 (file)
 // Reference CPU functions
 ////////////////////////////////////////////////////////////////////////////////
 //extern "C" void fonc(...);
+/**
+ *
+ * \brief determine la valeur de NG de la ligne de niveau demarrant de i,j
+ * \author NB - PhyTI
+ *
+ * \param[in] image  image d'entree
+ * \param[in] i      coord i du point de depart
+ * \param[in] j      coord j du point de depart
+ *
+ * \return la valeur de la ligne
+ *
+ * la ligne de niveau ne va que d'un cote
+ * on cherche le segment de r pixels ou les valeurs
+ * de l'image ont une variance minimale 
+ * il y a 24 segments possibles (4 par quadrants)
+ * la direction 0 va vers le haut, les directions tournent 
+ * dans le sens horaire, dans l'ordre croissant
+ *
+ * pas de test de bord : pas d'utilisation a moins de r pixels du bords
+ * 
+ *
+ * EN TEST
+ */
+int lniv4_value(unsigned int *image, int2 *path, int i, int j, int idim, int jdim, int *dout, unsigned int r )
+{
+  int value_c ;
+  int value2_c ;
+  int d, v, p, d_min, eq_min, eq, sum, sum2 ;
+  int sum_eq_min ;
+  int it, jt ;
+
+
+  /* mem */
+  value_c = image[i*jdim + j] ;
+  value2_c = value_c*value_c ;
+
+  // direction d=0
+  sum = value_c ;
+  sum2 = value2_c ;
+  it = i ;
+  jt = j ;
+  for (p=0; p<r-1; p++)
+    {
+      it += path[p].x ; // Di_Q1[0][p] ;
+      jt += path[p].y ; // Dj_Q1[0][p] ;
+      v = image[it*jdim + jt] ;
+      sum += v ;
+      sum2 += v*v ;
+    }
+  eq_min = sum2 - sum*sum/r ; /* *4 */
+  sum_eq_min = sum ;
+  d_min = 0 ;
+
+  /* direction 1 a 5 */
+  for (d=1; d<6; d++)
+    {
+      sum = value_c ;
+      sum2 = value2_c ;
+      it = i ;
+      jt = j ;
+      for (p=0; p<r-1; p++)
+       {
+         it += path[d*jdim + p].x ; // Di_Q1[d][p] ;
+         jt += path[d*jdim + p].y ; // Dj_Q1[d][p] ;
+         v = image[it*jdim + jt] ;
+         sum += v ;
+         sum2 += v*v ;
+       }
+      eq = sum2 - sum*sum/r ; /* *4 */
+      if (eq < eq_min)
+       {
+         eq_min = eq ;
+         sum_eq_min = sum ;
+         d_min = d ; /* pour info */    
+       }
+    }
+
+  /* direction 6 a 11 */
+  for (d=0; d<6; d++)
+    {
+      sum = value_c ;
+      sum2 = value2_c ;
+      it = i ;
+      jt = j ;
+      for (p=0; p<r-1; p++)
+       {
+         it += path[d*jdim + p].y ; // Dj_Q1[d][p] ;
+         jt -= path[d*jdim + p].x ; // ]Di_Q1[d][p] ;
+         v = image[it*jdim + jt] ;
+         sum += v ;
+         sum2 += v*v ;
+       }
+      eq = sum2 - sum*sum/r ; /* *4 */
+      if (eq < eq_min)
+       {
+         eq_min = eq ;
+         sum_eq_min = sum ;
+         d_min = d+6 ; /* pour info */  
+       }
+    }
+
+  /* direction 12 a 17 */
+  for (d=0; d<6; d++)
+    {
+      sum = value_c ;
+      sum2 = value2_c ;
+      it = i ;
+      jt = j ;
+      for (p=0; p<r-1; p++)
+       {
+         it -= path[d*jdim + p].x ; // Di_Q1[d][p] ;
+         jt -= path[d*jdim + p].y ; // Dj_Q1[d][p] ;
+         v = image[it*jdim + jt] ;
+         sum += v ;
+         sum2 += v*v ;
+       }
+      eq = sum2 - sum*sum/r ; /* *4 */
+      if (eq < eq_min)
+       {
+         eq_min = eq ;
+         sum_eq_min = sum ;
+         d_min = d+12 ; /* pour info */         
+       }
+    }
+  
+  /* direction 18 a 23 */
+  for (d=0; d<6; d++)
+    {
+      sum = value_c ;
+      sum2 = value2_c ;
+      it = i ;
+      jt = j ;
+      for (p=0; p<r-1; p++)
+       {
+         it -= path[d*jdim + p].y ; // Dj_Q1[d][p] ;
+         jt += path[d*jdim + p].x ; // Di_Q1[d][p] ;
+         v = image[it*jdim + jt] ;
+         sum += v ;
+         sum2 += v*v ;
+       }
+      eq = sum2 - sum*sum/r ; /* *4 */
+      if (eq < eq_min)
+       {
+            eq_min = eq ;
+            sum_eq_min = sum ;
+            d_min = d+18 ; /* pour info */      
+       }
+    }
+  
+  *dout = d_min ;
+  return sum_eq_min/r ;
+}
+
 
 ////////////////////////////////////////////////////////////////////////////////
 // GPU functions (in file.cu)