Changeset 10169 for trunk/psLib/src/imageops/psImageBackground.c
- Timestamp:
- Nov 22, 2006, 7:26:30 PM (19 years ago)
- File:
-
- 1 edited
-
trunk/psLib/src/imageops/psImageBackground.c (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psLib/src/imageops/psImageBackground.c
r9975 r10169 11 11 #include "psError.h" 12 12 13 13 // XXX allow the user to choose the stats method? 14 // (SAMPLE_MEAN, CLIPPED_MEAN, ROBUST_MEDIAN, FITTED_MEAN) 14 15 psStats *psImageBackground(const psImage *image, const psImage *mask, psMaskType maskValue, 15 double fmin, double fmax, long nMax, ps Random *rng)16 double fmin, double fmax, long nMax, psStatsOptions option, psRandom *rng) 16 17 { 17 18 PS_ASSERT_IMAGE_NON_NULL(image, NULL); … … 32 33 long ny = image->numRows; 33 34 34 psStats *stats = psStatsAlloc(PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_QUARTILE); // Statistics, for return35 36 35 int Nsubset = PS_MIN(nMax, nx*ny); // Number of pixels in nubset 37 36 int Npixels = nx*ny; // Total number of pixels … … 43 42 float max = values->data.F32[0]; 44 43 44 // select a subset of the image pixels to measure the stats 45 45 long n = 0; // Number of actual pixels in subset 46 46 for (long i = 0; i < Nsubset; i++) { … … 62 62 values->n = n; 63 63 64 int imin = fmin * n; 65 int imax = fmax * n; 66 int npts = imax - imin + 1; 64 psStats *stats = psStatsAlloc(option); // Statistics, for return 67 65 68 if (!psVectorSort(values, values)) { 69 psError(PS_ERR_UNKNOWN, false, "Unable to sort values.\n"); 70 psFree(stats); 71 psFree(values); 72 return NULL; 66 if (stats->options & PS_STAT_ROBUST_QUARTILE) { 67 // use simple stats code (old verions) 68 // XXX this hack is just for testing, drop when I am happy with the psStats version of the values 69 70 int imin = fmin * n; 71 int imax = fmax * n; 72 int npts = imax - imin + 1; 73 74 if (!psVectorSort(values, values)) { 75 psError(PS_ERR_UNKNOWN, false, "Unable to sort values.\n"); 76 psFree(stats); 77 psFree(values); 78 return NULL; 79 } 80 81 // Subtract the median when we add the numbers, so we don't get numerical problems 82 float median = npts % 2 ? 0.5 * (values->data.F32[npts/2 - 1] + values->data.F32[npts/2]) : 83 values->data.F32[npts/2]; 84 double value = 0; 85 for (long i = imin; (i <= imax) && (i < n); i++) { 86 value += values->data.F32[i] - median; 87 } 88 value = value / npts + median; 89 stats->robustMedian = value; 90 stats->robustUQ = values->data.F32[imax]; 91 stats->robustLQ = values->data.F32[imin]; 92 } else { 93 // XXX leave this as a psphot user option (passed in as part of stats?) 94 if (stats->options & PS_STAT_FITTED_MEAN) { 95 stats->clipSigma = 1.0; 96 } 97 psVectorStats (stats, values, NULL, NULL, 0); 73 98 } 74 75 // Subtract the median when we add the numbers, so we don't get numerical problems76 float median = npts % 2 ? 0.5 * (values->data.F32[npts/2 - 1] + values->data.F32[npts/2]) :77 values->data.F32[npts/2];78 double value = 0;79 for (long i = imin; (i <= imax) && (i < n); i++) {80 value += values->data.F32[i] - median;81 }82 value = value / npts + median;83 84 stats->robustMedian = value;85 stats->robustUQ = values->data.F32[imax];86 stats->robustLQ = values->data.F32[imin];87 99 88 100 psFree(values); 89 101 return stats; 90 // XXX correct for selection bias??91 102 }
Note:
See TracChangeset
for help on using the changeset viewer.
