Changeset 23307
- Timestamp:
- Mar 12, 2009, 2:42:22 PM (17 years ago)
- Location:
- trunk/psModules/src/imcombine
- Files:
-
- 2 edited
-
pmSubtractionMatch.c (modified) (3 diffs)
-
pmSubtractionMatch.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmSubtractionMatch.c
r23259 r23307 90 90 } 91 91 92 // Check input arguments 93 static bool subtractionMatchCheck(pmReadout *conv1, pmReadout *conv2, // Convolved images 94 const pmReadout *ro1, const pmReadout *ro2, // Input images 95 int stride, // Size for convolution patches 96 float sysError, // Relative systematic error 97 psImageMaskType maskVal, // Value to mask for input 98 psImageMaskType maskBad, // Mask for output bad pixels 99 psImageMaskType maskPoor, // Mask for output poor pixels 100 float poorFrac, // Fraction for "poor" 101 float badFrac, // Maximum fraction of bad input pixels to accept 102 pmSubtractionMode subMode // Mode of subtraction 103 ) 104 { 105 if (subMode != PM_SUBTRACTION_MODE_2) { 106 PM_ASSERT_READOUT_NON_NULL(conv1, false); 107 if (conv1->image) { 108 psFree(conv1->image); 109 conv1->image = NULL; 110 } 111 if (conv1->mask) { 112 psFree(conv1->mask); 113 conv1->mask = NULL; 114 } 115 if (conv1->variance) { 116 psFree(conv1->variance); 117 conv1->variance = NULL; 118 } 119 } 120 if (subMode != PM_SUBTRACTION_MODE_1) { 121 PM_ASSERT_READOUT_NON_NULL(conv2, false); 122 if (conv2->image) { 123 psFree(conv2->image); 124 conv2->image = NULL; 125 } 126 if (conv2->mask) { 127 psFree(conv2->mask); 128 conv2->mask = NULL; 129 } 130 if (conv2->variance) { 131 psFree(conv2->variance); 132 conv2->variance = NULL; 133 } 134 } 135 136 PM_ASSERT_READOUT_NON_NULL(ro1, false); 137 PM_ASSERT_READOUT_NON_NULL(ro2, false); 138 PM_ASSERT_READOUT_IMAGE(ro1, false); 139 PM_ASSERT_READOUT_IMAGE(ro2, false); 140 PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->image, ro2->image, false); 141 PS_ASSERT_INT_NONNEGATIVE(stride, false); 142 if (isfinite(sysError)) { 143 PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL(sysError, 0.0, false); 144 PS_ASSERT_FLOAT_LESS_THAN(sysError, 1.0, false); 145 } 146 // Don't care about maskVal 147 // Don't care about maskBad 148 // Don't care about maskPoor 149 PS_ASSERT_FLOAT_LARGER_THAN(poorFrac, 0.0, false); 150 PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(poorFrac, 1.0, false); 151 if (isfinite(badFrac)) { 152 PS_ASSERT_FLOAT_LARGER_THAN(badFrac, 0.0, false); 153 PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(badFrac, 1.0, false); 154 } 155 156 return true; 157 } 158 159 160 161 bool pmSubtractionMatchPrecalc(pmReadout *conv1, pmReadout *conv2, const pmReadout *ro1, const pmReadout *ro2, 162 pmSubtractionKernels *kernel, psRegion *region, int stride, float sysError, 163 psImageMaskType maskVal, psImageMaskType maskBad, psImageMaskType maskPoor, 164 float poorFrac, float badFrac) 165 { 166 PM_ASSERT_SUBTRACTION_KERNELS_NON_NULL(kernel, false); 167 pmSubtractionMode subMode = kernel->mode; // Subtraction mode: which input to convolve 168 if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, sysError, maskVal, maskBad, maskPoor, 169 poorFrac, badFrac, subMode)) { 170 return false; 171 } 172 173 psImage *subMask = pmSubtractionMask(ro1->mask, ro2 ? ro2->mask : NULL, maskVal, kernel->size, 0, 174 badFrac, useFFT); // Subtraction mask 175 if (!subMask) { 176 psError(PS_ERR_UNKNOWN, false, "Unable to generate subtraction mask."); 177 return false; 178 } 179 180 psTrace("psModules.imcombine", 2, "Convolving...\n"); 181 if (!pmSubtractionConvolve(conv1, conv2, ro1, ro2, subMask, stride, maskBad, maskPoor, poorFrac, 182 sysError, region, kernel, true, useFFT)) { 183 psError(PS_ERR_UNKNOWN, false, "Unable to convolve image."); 184 psFree(subMask); 185 return false; 186 } 187 188 psFree(subMask); 189 190 return true; 191 } 192 92 193 93 194 bool pmSubtractionMatch(pmReadout *conv1, pmReadout *conv2, const pmReadout *ro1, const pmReadout *ro2, … … 101 202 psImageMaskType maskPoor, float poorFrac, float badFrac, pmSubtractionMode subMode) 102 203 { 103 if (subMode != PM_SUBTRACTION_MODE_2) { 104 PM_ASSERT_READOUT_NON_NULL(conv1, false); 105 if (conv1->image) { 106 psFree(conv1->image); 107 conv1->image = NULL; 108 } 109 if (conv1->mask) { 110 psFree(conv1->mask); 111 conv1->mask = NULL; 112 } 113 if (conv1->variance) { 114 psFree(conv1->variance); 115 conv1->variance = NULL; 116 } 117 } 118 if (subMode != PM_SUBTRACTION_MODE_1) { 119 PM_ASSERT_READOUT_NON_NULL(conv2, false); 120 if (conv2->image) { 121 psFree(conv2->image); 122 conv2->image = NULL; 123 } 124 if (conv2->mask) { 125 psFree(conv2->mask); 126 conv2->mask = NULL; 127 } 128 if (conv2->variance) { 129 psFree(conv2->variance); 130 conv2->variance = NULL; 131 } 132 } 133 134 PM_ASSERT_READOUT_NON_NULL(ro1, false); 135 PM_ASSERT_READOUT_NON_NULL(ro2, false); 136 PM_ASSERT_READOUT_IMAGE(ro1, false); 137 PM_ASSERT_READOUT_IMAGE(ro2, false); 138 PS_ASSERT_IMAGES_SIZE_EQUAL(ro1->image, ro2->image, false); 204 if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, sysError, maskVal, maskBad, maskPoor, 205 poorFrac, badFrac, subMode)) { 206 return false; 207 } 139 208 140 209 PS_ASSERT_INT_NONNEGATIVE(footprint, false); 141 PS_ASSERT_INT_NONNEGATIVE(stride, false);142 210 // regionSize can be just about anything (except maybe negative, but it can be NAN) 143 211 PS_ASSERT_FLOAT_LARGER_THAN(stampSpacing, 0.0, false); … … 168 236 PS_ASSERT_INT_POSITIVE(iter, false); 169 237 PS_ASSERT_FLOAT_LARGER_THAN(rej, 0.0, false); 170 if (isfinite(sysError)) {171 PS_ASSERT_FLOAT_LARGER_THAN_OR_EQUAL(sysError, 0.0, NULL);172 PS_ASSERT_FLOAT_LESS_THAN(sysError, 1.0, NULL);173 }174 // Don't care about maskVal175 // Don't care about maskBad176 // Don't care about maskPoor177 PS_ASSERT_FLOAT_LARGER_THAN(poorFrac, 0.0, NULL);178 PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(poorFrac, 1.0, NULL);179 if (isfinite(badFrac)) {180 PS_ASSERT_FLOAT_LARGER_THAN(badFrac, 0.0, NULL);181 PS_ASSERT_FLOAT_LESS_THAN_OR_EQUAL(badFrac, 1.0, NULL);182 }183 238 184 239 // If the stamp footprint is smaller than the kernel size, then we won't get much signal in the outer -
trunk/psModules/src/imcombine/pmSubtractionMatch.h
r21183 r23307 48 48 ); 49 49 50 /// Match two images using precalculated kernel 51 bool pmSubtractionMatchPrecalc(pmReadout *conv1, ///< Output convolved data for image 1 52 pmReadout *conv2, ///< Output convolved data for image 2 53 const pmReadout *ro1, ///< Image 1 54 const pmReadout *ro2, ///< Image 2 55 pmSubtractionKernels *kernels, ///< Pre-calculated matching kernel 56 psRegion *region, ///< Region of applicability for kernel 57 int stride, ///< Size for convolution patches 58 float sysError, ///< Relative systematic error 59 psImageMaskType maskVal, ///< Value to mask for input 60 psImageMaskType maskBad, ///< Mask for output bad pixels 61 psImageMaskType maskPoor, ///< Mask for output poor pixels 62 float poorFrac, ///< Fraction for "poor" 63 float badFrac ///< Maximum fraction of bad input pixels to accept 64 ); 65 50 66 /// Execute a thread job to measure the PSF width ratios 51 67 bool pmSubtractionOrderThread(psThreadJob *job ///< Job to execute
Note:
See TracChangeset
for help on using the changeset viewer.
