IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 23851


Ignore:
Timestamp:
Apr 14, 2009, 10:40:50 AM (17 years ago)
Author:
Paul Price
Message:

Convolve subtraction mask so that we can easily identify bad stamps.

Location:
trunk/psModules/src/imcombine
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/imcombine/pmSubtractionMask.c

    r23849 r23851  
    3838
    3939psImage *pmSubtractionMask(const psImage *mask1, const psImage *mask2, psImageMaskType maskVal,
    40                            int size, int footprint, float badFrac, bool useFFT)
     40                           int size, int footprint, float badFrac, pmSubtractionMode mode)
    4141{
    4242    PS_ASSERT_IMAGE_NON_NULL(mask1, NULL);
     
    114114    }
    115115
    116     // XXX Could do something smarter here --- we will get images that are predominantly masked (where the
    117     // skycell isn't overlapped by a large fraction by the observation), so that convolving around every bad
    118     // pixel is wasting time.  As a first cut, I've put in a check on the fraction of bad pixels, but we could
    119     // imagine looking for the edge of big regions and convolving just at the edge.  As a second cut, allow
    120     // use of FFT convolution.
    121 
    122116    for (int y = 0; y < numRows; y++) {
    123117        for (int x = 0; x < numCols; x++) {
     
    131125    }
    132126
    133     // Block out the entire stamp footprint around bad input pixels.
    134 
    135127    // We want to block out with the CONVOLVE mask anything that would be bad if we convolved with a bad
    136     // reference pixel (within 'size').  Then we want to block out with the FOOTPRINT mask everything within a
     128    // reference pixel (within 'size').  Then we want to block out with the REJ mask everything within a
    137129    // footprint's distance of those (within 'footprint').
    138130
    139131    bool oldThreads = psImageConvolveSetThreads(true); // Old value of threading for psImageConvolve
    140132
     133    // Pixels that will be bad (or poor) if we convolve with a bad reference pixel
    141134    if (!psImageConvolveMask(mask, mask, PM_SUBTRACTION_MASK_BAD_1, PM_SUBTRACTION_MASK_CONVOLVE_1,
    142135                             -size, size, -size, size)) {
     
    148141                             -size, size, -size, size)) {
    149142        psError(PS_ERR_UNKNOWN, false, "Unable to convolve bad pixels from mask 2.");
     143        psFree(mask);
     144        return NULL;
     145    }
     146
     147    // Pixels that should not be chosen as stamps
     148    psImageMaskType maskRej = PM_SUBTRACTION_MASK_BAD_1 | PM_SUBTRACTION_MASK_BAD_2 |
     149        PM_SUBTRACTION_MASK_BORDER;     // Mask value for rejection
     150    switch (mode) {
     151      case PM_SUBTRACTION_MODE_1:
     152        maskRej |= PM_SUBTRACTION_MASK_CONVOLVE_1;
     153        break;
     154      case PM_SUBTRACTION_MODE_2:
     155        maskRej |= PM_SUBTRACTION_MASK_CONVOLVE_2;
     156        break;
     157      case PM_SUBTRACTION_MODE_UNSURE:
     158      case PM_SUBTRACTION_MODE_DUAL:
     159        maskRej |= PM_SUBTRACTION_MASK_CONVOLVE_1 | PM_SUBTRACTION_MASK_CONVOLVE_2;
     160        break;
     161      default:
     162        psAbort("Unsupported subtraction mode: %x", mode);
     163    }
     164    if (!psImageConvolveMask(mask, mask, maskRej, PM_SUBTRACTION_MASK_REJ,
     165                             -footprint, footprint, -footprint, footprint)) {
     166        psError(PS_ERR_UNKNOWN, false, "Unable to convolve bad pixels.");
    150167        psFree(mask);
    151168        return NULL;
  • trunk/psModules/src/imcombine/pmSubtractionMask.h

    r21183 r23851  
    1111                           int footprint, ///< Half-size of the kernel footprint
    1212                           float badFrac, ///< Maximum fraction of bad input pixels to accept
    13                            bool useFFT  ///< Use FFT to do convolution?
     13                           pmSubtractionMode mode  ///< Subtraction mode
    1414    );
    1515
  • trunk/psModules/src/imcombine/pmSubtractionMatch.c

    r23849 r23851  
    240240
    241241    psImage *subMask = pmSubtractionMask(ro1->mask, ro2 ? ro2->mask : NULL, maskVal, size, 0,
    242                                          badFrac, useFFT); // Subtraction mask
     242                                         badFrac, mode); // Subtraction mask
    243243    if (!subMask) {
    244244        psError(PS_ERR_UNKNOWN, false, "Unable to generate subtraction mask.");
     
    373373
    374374    subMask = pmSubtractionMask(ro1->mask, ro2 ? ro2->mask : NULL, maskVal, size, footprint,
    375                                 badFrac, useFFT);
     375                                badFrac, subMode);
    376376    if (!subMask) {
    377377        psError(PS_ERR_UNKNOWN, false, "Unable to generate subtraction mask.");
  • trunk/psModules/src/imcombine/pmSubtractionStamps.c

    r23850 r23851  
    9696    }
    9797
    98     // Determine mask value
    99     psImageMaskType maskVal = PM_SUBTRACTION_MASK_BAD_1 | PM_SUBTRACTION_MASK_BAD_2 |
    100         PM_SUBTRACTION_MASK_BORDER;     // Mask value to check for
    101     switch (mode) {
    102       case PM_SUBTRACTION_MODE_1:
    103         maskVal |= PM_SUBTRACTION_MASK_CONVOLVE_1 | PM_SUBTRACTION_MASK_CONVOLVE_BAD_1;
    104         break;
    105       case PM_SUBTRACTION_MODE_2:
    106         maskVal |= PM_SUBTRACTION_MASK_CONVOLVE_2 | PM_SUBTRACTION_MASK_CONVOLVE_BAD_2;
    107         break;
    108       case PM_SUBTRACTION_MODE_UNSURE:
    109       case PM_SUBTRACTION_MODE_DUAL:
    110         maskVal |= PM_SUBTRACTION_MASK_CONVOLVE_1 | PM_SUBTRACTION_MASK_CONVOLVE_BAD_1 |
    111             PM_SUBTRACTION_MASK_CONVOLVE_2 | PM_SUBTRACTION_MASK_CONVOLVE_BAD_2;
    112         break;
    113       default:
    114         psAbort("Unsupported subtraction mode: %x", mode);
    115     }
    116 
    11798    // Check the central pixel
    118     if (mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] & (maskVal | PM_SUBTRACTION_MASK_REJ)) {
    119         goto BAD_STAMP;
    120     }
    121 
    122     // Check the footprint
    123     int xMin = PS_MAX(x - footprint, 0), xMax = PS_MIN(x + footprint, numCols - 1); // Bounds in x
    124     int yMin = PS_MAX(y - footprint, 0), yMax = PS_MIN(y + footprint, numRows - 1); // Bounds in y
    125     for (int j = yMin; j <= yMax; j++) {
    126         for (int i = xMin; i <= xMax; i++) {
    127             if (mask->data.PS_TYPE_IMAGE_MASK_DATA[j][i] & maskVal) {
    128                 goto BAD_STAMP;
    129             }
    130         }
     99    if (mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] & (PM_SUBTRACTION_MASK_BORDER | PM_SUBTRACTION_MASK_REJ)) {
     100        mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] |= PM_SUBTRACTION_MASK_REJ;
     101        return false;
    131102    }
    132103
    133104    return true;
    134 
    135 BAD_STAMP:
    136     // Stamp is bad, so mark it as such so we don't find it again
    137     mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] |= PM_SUBTRACTION_MASK_REJ;
    138     return false;
    139105}
    140106
Note: See TracChangeset for help on using the changeset viewer.