Listing 1: The moments subroutine

moments(the_image, out_image,
        rows, cols, 
        rows_size, cols_size, 
        il, ie,
        first_moment, second_moment,
        variance, sigma)
   short  il, ie,
          **the_image,
          **out_image;
   long   rows, cols,
          rows_size, cols_size;
   float  *first_moment, *second_moment,
          *sigma, *variance;
{
   int      i, j;
   int      csd2, rsd2;
   float    mean;
   unsigned long count, sum1, sum2;
  
   char response[80];

   rsd2 = rows_size/2;
   csd2 = cols_size/2;

   if(((il+rsd2) > rows)   ||
      ((ie+csd2) > cols)   ||
      ((il-rsd2) < 0)      ||
      ((ie-csd2) < 0)) {
      printf("\nmoments> ERROR: OUT OF BOUNDS");
      *first_moment  = -1.0;
      *second_moment = -1.0;
      *variance      = -1.0;
      *sigma         = -1.0;
   }  /* ends too big */

   else{ /* else not out of bounds */
      sum1  = 0;
      sum2  = 0;
      count = 0;
      for(i=il-rsd2; i<il+rsd2; i++){
         for(j=ie-csd2; j<ie+csd2; j++){
            count++;
            sum1 = sum1 + the_image[i][j];
            sum2 = sum2 + the_image[i][j]*the_image[i][j];
         }  /* ends loop over j */
      }  /* ends loop over i */
      *first_moment  = (float)(sum1/count);
      *second_moment = (float)(sum2/count);
      mean           = *first_moment;
      *variance      = *second_moment - mean*mean;
      *sigma         = sqrt(*variance);
   }  /* ends else not out of bounds */
}  /* ends moments */