IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 22, 2006, 7:26:30 PM (19 years ago)
Author:
magnier
Message:

added psVectorStats for sky measurement, with multiple stats options; old code selected with ROBUST_QUARTILE

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/imageops/psImageBackground.c

    r9975 r10169  
    1111#include "psError.h"
    1212
    13 
     13// XXX allow the user to choose the stats method?
     14// (SAMPLE_MEAN, CLIPPED_MEAN, ROBUST_MEDIAN, FITTED_MEAN)
    1415psStats *psImageBackground(const psImage *image, const psImage *mask, psMaskType maskValue,
    15                            double fmin, double fmax, long nMax, psRandom *rng)
     16                           double fmin, double fmax, long nMax, psStatsOptions option, psRandom *rng)
    1617{
    1718    PS_ASSERT_IMAGE_NON_NULL(image, NULL);
     
    3233    long ny = image->numRows;
    3334
    34     psStats *stats = psStatsAlloc(PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_QUARTILE); // Statistics, for return
    35 
    3635    int Nsubset = PS_MIN(nMax, nx*ny);  // Number of pixels in nubset
    3736    int Npixels = nx*ny;                // Total number of pixels
     
    4342    float max = values->data.F32[0];
    4443
     44    // select a subset of the image pixels to measure the stats
    4545    long n = 0;                         // Number of actual pixels in subset
    4646    for (long i = 0; i < Nsubset; i++) {
     
    6262    values->n = n;
    6363
    64     int imin = fmin * n;
    65     int imax = fmax * n;
    66     int npts = imax - imin + 1;
     64    psStats *stats = psStatsAlloc(option); // Statistics, for return
    6765
    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);
    7398    }
    74 
    75     // Subtract the median when we add the numbers, so we don't get numerical problems
    76     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];
    8799
    88100    psFree(values);
    89101    return stats;
    90     // XXX correct for selection bias??
    91102}
Note: See TracChangeset for help on using the changeset viewer.