+ int nx = m_nx;
+ int ny = m_ny;
+ ImageFileArrayConst v = getArray();
+
+ if (v == NULL || nx == 0 || ny == 0)
+ return;
+
+ mean = 0;
+ min = v[0][0];
+ max = v[0][0];
+ for (int ix = 0; ix < nx; ix++) {
+ for (int iy = 0; iy < ny; iy++) {
+ if (v[ix][iy] > max)
+ max = v[ix][iy];
+ if (v[ix][iy] < min)
+ min = v[ix][iy];
+ mean += v[ix][iy];
+ }
+ }
+ mean /= (nx * ny);
+
+ static const int nbin = 1024;
+ int hist[ nbin ] = {0};
+ double spread = max - min;
+ mode = 0;
+ stddev = 0;
+ for (int ix = 0; ix < nx; ix++) {
+ for (int iy = 0; iy < ny; iy++) {
+ int b = static_cast<int>((((v[ix][iy] - min) / spread) * (nbin - 1)) + 0.5);
+ hist[b]++;
+ double diff = (v[ix][iy] - mean);
+ stddev += diff * diff;
+ }
+ }
+ stddev = sqrt(stddev / (nx * ny));
+
+ int max_binindex = 0;
+ int max_bin = -1;
+ for (int ibin = 0; ibin < nbin; ibin++) {
+ if (hist[ibin] > max_bin) {
+ max_bin = hist[ibin];
+ max_binindex = ibin;
+ }
+ }
+
+ mode = (max_binindex * spread / (nbin - 1)) + min;
+
+ int nPixels = nx * ny;
+ slist<double> vecImage;
+ for (int ix = 0; ix < nx; ix++)
+ for (int iy = 0; iy < ny; iy++)
+ vecImage.push_front (v[ix][iy]);
+ vecImage.sort();
+ slist<double>::const_iterator iter = vecImage.begin();
+ for (int i = 0; i < (nPixels / 2) - 1; i++)
+ iter++; // Advance iterator to (nPixels / 2) - 1;
+
+ if (nPixels % 2) { // Odd
+ iter++;
+ median = *iter;
+ } else // Even
+ median = (*iter++ + *iter) / 2;