IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Feb 28, 2022, 2:40:32 PM (4 years ago)
Author:
eugene
Message:

for bright stars in stacks, the peak in the S/N image can have a central divot if the variance of the central pixels is relatively large compared to the ring of pixels further from the center. the detected peaks are then not well centered. this can be avoided if we detect on the signal image itself (after first determining an appropriate flux value for the desired S/N limit); added an option to use the signal image for the first pass peak detetion step

Location:
trunk/psphot
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psphot

  • trunk/psphot/src/psphotFindPeaks.c

    r33761 r42088  
    44// image must be constructed to represent (S/N)^2.  If nMax is non-zero, only return a maximum
    55// of nMax peaks
    6 psArray *psphotFindPeaks (pmReadout *significance, pmReadout *readout, psMetadata *recipe, const float threshold, const int nMax, int *totalPeaks) {
     6psArray *psphotFindPeaks (pmReadout *significance, pmReadout *readout, psMetadata *recipe, const float threshold, const int nMax, int *totalPeaks, bool firstPass) {
    77
    88    bool status = false;
     
    1010    psTimerStart ("psphot.peaks");
    1111
    12     // find the peaks in the smoothed image
    13     // NOTE : significance->variance actually carries the detection S/N image
    14     psArray *peaks = pmPeaksInImage (significance->variance, threshold);
    15     if (peaks == NULL) {
    16         // we only get a NULL peaks array due to a programming or config error.
    17         // this will result in a failure.
    18         psError(PSPHOT_ERR_DATA, false, "no peaks found in this image");
    19         return NULL;
     12    psArray *peaks = NULL;
     13
     14    bool useSignalImage = psMetadataLookupF32 (&status, recipe, "PEAKS_USE_SIGNAL_IMAGE"); PS_ASSERT (status, NULL);
     15
     16    if (firstPass && useSignalImage) {
     17        // find the approximate smoothed signal image that corresponds to the desired threshold
     18
     19        // find all pixels within 25% of the threshold:
     20        float minThresh = threshold * 0.80;
     21        float maxThresh = threshold * 1.25;
     22
     23        psImage *smooth_sn = significance->variance;
     24        psImage *smooth_im = significance->image;
     25
     26        psVector *SNvalues = psVectorAllocEmpty (1000, PS_TYPE_F32);
     27        for (int iy = 0; iy < smooth_im->numRows; iy++) {
     28            for (int ix = 0; ix < smooth_im->numCols; ix++) {
     29                // select all valid pixels within the S/N range
     30                if (!isfinite(smooth_sn->data.F32[iy][ix])) continue;
     31                if (!isfinite(smooth_im->data.F32[iy][ix])) continue;
     32                if (smooth_sn->data.F32[iy][ix] < minThresh) continue;
     33                if (smooth_sn->data.F32[iy][ix] > maxThresh) continue;
     34                psVectorAppend (SNvalues, smooth_im->data.F32[iy][ix]);
     35            }
     36        }
     37
     38        // what is the median of the selected values?
     39        psStats *stats = psStatsAlloc (PS_STAT_SAMPLE_MEDIAN);
     40        if (!psVectorStats(stats, SNvalues, NULL, NULL, 0)) {
     41            // psVectorStats will only fail due to a programming error (e.g., invalid vector type)
     42            psError(PSPHOT_ERR_UNKNOWN, false, "Unable to perform statistics to measure image quality");
     43            psFree (SNvalues);
     44            return NULL;
     45        }
     46        psFree (SNvalues);
     47
     48        if (!isfinite(stats->sampleMedian)) {
     49            // could not determine relationship between SN threshold and image values
     50            // XXX fall-back could be the standard analysis above.
     51            psLogMsg ("psphot", PS_LOG_INFO, "failure to map SN to image values");
     52            psFree (stats);
     53            goto use_significance;
     54        }
     55       
     56        float alt_threshold = stats->sampleMedian;
     57        psFree (stats);
     58
     59        peaks = pmPeaksInImage (significance->image, alt_threshold);
     60        if (peaks == NULL) {
     61            // we only get a NULL peaks array due to a programming or config error.
     62            // this will result in a failure.
     63            psError(PSPHOT_ERR_DATA, false, "no peaks found in this image");
     64            return NULL;
     65        }
    2066    }
     67
     68use_significance:
     69    if (!peaks) {
     70        // peaks is NULL at this point if we did not use signal image (by choice or by failure).
     71        // find the peaks in the smoothed image
     72        // NOTE : significance->variance actually carries the detection S/N image
     73        peaks = pmPeaksInImage (significance->variance, threshold);
     74        if (peaks == NULL) {
     75            // we only get a NULL peaks array due to a programming or config error.
     76            // this will result in a failure.
     77            psError(PSPHOT_ERR_DATA, false, "no peaks found in this image");
     78            return NULL;
     79        }
     80    }
     81
    2182    // return the total number of peaks found before the nMax limit is applied
    2283    if (totalPeaks) {
Note: See TracChangeset for help on using the changeset viewer.