Changeset 23851
- Timestamp:
- Apr 14, 2009, 10:40:50 AM (17 years ago)
- Location:
- trunk/psModules/src/imcombine
- Files:
-
- 4 edited
-
pmSubtractionMask.c (modified) (4 diffs)
-
pmSubtractionMask.h (modified) (1 diff)
-
pmSubtractionMatch.c (modified) (2 diffs)
-
pmSubtractionStamps.c (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmSubtractionMask.c
r23849 r23851 38 38 39 39 psImage *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) 41 41 { 42 42 PS_ASSERT_IMAGE_NON_NULL(mask1, NULL); … … 114 114 } 115 115 116 // XXX Could do something smarter here --- we will get images that are predominantly masked (where the117 // skycell isn't overlapped by a large fraction by the observation), so that convolving around every bad118 // pixel is wasting time. As a first cut, I've put in a check on the fraction of bad pixels, but we could119 // imagine looking for the edge of big regions and convolving just at the edge. As a second cut, allow120 // use of FFT convolution.121 122 116 for (int y = 0; y < numRows; y++) { 123 117 for (int x = 0; x < numCols; x++) { … … 131 125 } 132 126 133 // Block out the entire stamp footprint around bad input pixels.134 135 127 // 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 FOOTPRINTmask everything within a128 // reference pixel (within 'size'). Then we want to block out with the REJ mask everything within a 137 129 // footprint's distance of those (within 'footprint'). 138 130 139 131 bool oldThreads = psImageConvolveSetThreads(true); // Old value of threading for psImageConvolve 140 132 133 // Pixels that will be bad (or poor) if we convolve with a bad reference pixel 141 134 if (!psImageConvolveMask(mask, mask, PM_SUBTRACTION_MASK_BAD_1, PM_SUBTRACTION_MASK_CONVOLVE_1, 142 135 -size, size, -size, size)) { … … 148 141 -size, size, -size, size)) { 149 142 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."); 150 167 psFree(mask); 151 168 return NULL; -
trunk/psModules/src/imcombine/pmSubtractionMask.h
r21183 r23851 11 11 int footprint, ///< Half-size of the kernel footprint 12 12 float badFrac, ///< Maximum fraction of bad input pixels to accept 13 bool useFFT ///< Use FFT to do convolution?13 pmSubtractionMode mode ///< Subtraction mode 14 14 ); 15 15 -
trunk/psModules/src/imcombine/pmSubtractionMatch.c
r23849 r23851 240 240 241 241 psImage *subMask = pmSubtractionMask(ro1->mask, ro2 ? ro2->mask : NULL, maskVal, size, 0, 242 badFrac, useFFT); // Subtraction mask242 badFrac, mode); // Subtraction mask 243 243 if (!subMask) { 244 244 psError(PS_ERR_UNKNOWN, false, "Unable to generate subtraction mask."); … … 373 373 374 374 subMask = pmSubtractionMask(ro1->mask, ro2 ? ro2->mask : NULL, maskVal, size, footprint, 375 badFrac, useFFT);375 badFrac, subMode); 376 376 if (!subMask) { 377 377 psError(PS_ERR_UNKNOWN, false, "Unable to generate subtraction mask."); -
trunk/psModules/src/imcombine/pmSubtractionStamps.c
r23850 r23851 96 96 } 97 97 98 // Determine mask value99 psImageMaskType maskVal = PM_SUBTRACTION_MASK_BAD_1 | PM_SUBTRACTION_MASK_BAD_2 |100 PM_SUBTRACTION_MASK_BORDER; // Mask value to check for101 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 117 98 // 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; 131 102 } 132 103 133 104 return true; 134 135 BAD_STAMP:136 // Stamp is bad, so mark it as such so we don't find it again137 mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] |= PM_SUBTRACTION_MASK_REJ;138 return false;139 105 } 140 106
Note:
See TracChangeset
for help on using the changeset viewer.
