- Timestamp:
- May 3, 2010, 8:41:49 AM (16 years ago)
- Location:
- branches/tap_branches
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/tap_branches
- Property svn:mergeinfo changed
-
branches/tap_branches/psModules
-
Property svn:mergeinfo
set to (toggle deleted branches)
/trunk/psModules merged eligible /branches/eam_branches/stackphot.20100406/psModules 27623-27653 /branches/pap_delete/psModules 27530-27595
-
Property svn:mergeinfo
set to (toggle deleted branches)
-
branches/tap_branches/psModules/src/imcombine/pmSubtractionMask.c
r24257 r27838 38 38 ////////////////////////////////////////////////////////////////////////////////////////////////////////////// 39 39 40 psImage *pmSubtractionMask(const psImage *mask1, const psImage *mask2, psImageMaskType maskVal, 41 int size, int footprint, float badFrac, pmSubtractionMode mode) 42 { 43 PS_ASSERT_IMAGE_NON_NULL(mask1, NULL); 44 PS_ASSERT_IMAGE_TYPE(mask1, PS_TYPE_IMAGE_MASK, NULL); 45 if (mask2) { 46 PS_ASSERT_IMAGE_NON_NULL(mask2, NULL); 47 PS_ASSERT_IMAGE_TYPE(mask2, PS_TYPE_IMAGE_MASK, NULL); 48 PS_ASSERT_IMAGES_SIZE_EQUAL(mask2, mask1, NULL); 49 } 40 psImage *pmSubtractionMask(psRegion *bounds, const pmReadout *ro1, const pmReadout *ro2, 41 psImageMaskType maskVal, int size, int footprint, float badFrac, 42 pmSubtractionMode mode) 43 { 44 int numCols = 0, numRows = 0; // Size of the images 45 if (ro1) { 46 PM_ASSERT_READOUT_NON_NULL(ro1, NULL); 47 PM_ASSERT_READOUT_IMAGE(ro1, NULL); 48 PM_ASSERT_READOUT_MASK(ro1, NULL); 49 numCols = ro1->image->numCols; 50 numRows = ro1->image->numRows; 51 } 52 if (ro2) { 53 PM_ASSERT_READOUT_NON_NULL(ro2, NULL); 54 PM_ASSERT_READOUT_IMAGE(ro2, NULL); 55 PM_ASSERT_READOUT_MASK(ro2, NULL); 56 numCols = ro2->image->numCols; 57 numRows = ro2->image->numRows; 58 } 59 if (ro1 && ro2) { 60 PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->image, ro2->image, NULL); 61 } 62 if (!ro1 && !ro2) { 63 psError(PS_ERR_UNEXPECTED_NULL, true, "No image provided."); 64 return false; 65 } 66 psAssert(numCols > 0 && numRows > 0, "There should be an image provided"); 50 67 PS_ASSERT_INT_NONNEGATIVE(size, NULL); 51 68 PS_ASSERT_INT_NONNEGATIVE(footprint, NULL); … … 55 72 } 56 73 57 int numCols = mask1->numCols, numRows = mask1->numRows; // Size of the images58 59 74 // Dereference inputs for convenience 60 psImageMaskType **data1 = mask1->data.PS_TYPE_IMAGE_MASK_DATA; 61 psImageMaskType **data2 = NULL; 62 if (mask2) { 63 data2 = mask2->data.PS_TYPE_IMAGE_MASK_DATA; 64 } 75 psF32 **imageData1 = ro1 ? ro1->image->data.F32 : NULL; 76 psF32 **imageData2 = ro2 ? ro2->image->data.F32 : NULL; 77 psImageMaskType **maskData1 = ro1 ? ro1->mask->data.PS_TYPE_IMAGE_MASK_DATA : NULL; 78 psImageMaskType **maskData2 = ro2 ? ro2->mask->data.PS_TYPE_IMAGE_MASK_DATA : NULL; 65 79 66 80 // First, a pass through to determine the fraction of bad pixels 67 if (isfinite(badFrac) && badFrac != 1.0) { 81 if (bounds || (isfinite(badFrac) && badFrac != 1.0)) { 82 int xMin = numCols, xMax = 0, yMin = numRows, yMax = 0; // Bounds of good pixels 68 83 int numBad = 0; // Number of bad pixels 69 84 for (int y = 0; y < numRows; y++) { 70 85 for (int x = 0; x < numCols; x++) { 71 if ( data1[y][x] & maskVal) {86 if (ro1 && ((maskData1[y][x] & maskVal) || !isfinite(imageData1[y][x]))) { 72 87 numBad++; 73 88 continue; 74 89 } 75 if ( data2 && data2[y][x] & maskVal) {90 if (ro2 && ((maskData2[y][x] & maskVal) || !isfinite(imageData2[y][x]))) { 76 91 numBad++; 92 continue; 77 93 } 78 } 79 } 80 if (numBad > badFrac * numCols * numRows) { 94 xMin = PS_MIN(xMin, x); 95 xMax = PS_MAX(xMax, x); 96 yMin = PS_MIN(yMin, y); 97 yMax = PS_MAX(yMax, y); 98 } 99 } 100 if (bounds) { 101 bounds->x0 = xMin; 102 bounds->x1 = xMax; 103 bounds->y0 = yMin; 104 bounds->y1 = yMax; 105 } 106 if (isfinite(badFrac) && badFrac != 1.0 && numBad > badFrac * numCols * numRows) { 81 107 psError(PM_ERR_SMALL_AREA, true, 82 108 "Fraction of bad pixels (%d/%d=%f) exceeds limit (%f)\n", … … 117 143 for (int y = 0; y < numRows; y++) { 118 144 for (int x = 0; x < numCols; x++) { 119 if ( data1[y][x] & maskVal) {145 if (ro1 && maskData1[y][x] & maskVal) { 120 146 maskData[y][x] |= PM_SUBTRACTION_MASK_BAD_1; 121 147 } 122 if ( data2 && data2[y][x] & maskVal) {148 if (ro2 && maskData2[y][x] & maskVal) { 123 149 maskData[y][x] |= PM_SUBTRACTION_MASK_BAD_2; 124 150 } … … 133 159 134 160 // Pixels that will be bad (or poor) if we convolve with a bad reference pixel 135 if ( !psImageConvolveMask(mask, mask, PM_SUBTRACTION_MASK_BAD_1, PM_SUBTRACTION_MASK_CONVOLVE_1,136 -size, size, -size, size)) {137 psError( PS_ERR_UNKNOWN, false, "Unable to convolve bad pixels from mask 1.");161 if (ro1 && !psImageConvolveMask(mask, mask, PM_SUBTRACTION_MASK_BAD_1, PM_SUBTRACTION_MASK_CONVOLVE_1, 162 -size, size, -size, size)) { 163 psError(psErrorCodeLast(), false, "Unable to convolve bad pixels from mask 1."); 138 164 psFree(mask); 139 165 return NULL; 140 166 } 141 if ( !psImageConvolveMask(mask, mask, PM_SUBTRACTION_MASK_BAD_2, PM_SUBTRACTION_MASK_CONVOLVE_2,142 -size, size, -size, size)) {143 psError( PS_ERR_UNKNOWN, false, "Unable to convolve bad pixels from mask 2.");167 if (ro2 && !psImageConvolveMask(mask, mask, PM_SUBTRACTION_MASK_BAD_2, PM_SUBTRACTION_MASK_CONVOLVE_2, 168 -size, size, -size, size)) { 169 psError(psErrorCodeLast(), false, "Unable to convolve bad pixels from mask 2."); 144 170 psFree(mask); 145 171 return NULL; … … 163 189 psAbort("Unsupported subtraction mode: %x", mode); 164 190 } 165 if ( !psImageConvolveMask(mask, mask, maskRej, PM_SUBTRACTION_MASK_REJ,166 -footprint, footprint, -footprint, footprint)) {167 psError( PS_ERR_UNKNOWN, false, "Unable to convolve bad pixels.");191 if (ro1 && ro2 && !psImageConvolveMask(mask, mask, maskRej, PM_SUBTRACTION_MASK_REJ, 192 -footprint, footprint, -footprint, footprint)) { 193 psError(psErrorCodeLast(), false, "Unable to convolve bad pixels."); 168 194 psFree(mask); 169 195 return NULL;
Note:
See TracChangeset
for help on using the changeset viewer.
