Changeset 23308
- Timestamp:
- Mar 12, 2009, 3:22:20 PM (17 years ago)
- Location:
- trunk/psModules/src/imcombine
- Files:
-
- 2 edited
-
pmSubtractionMatch.c (modified) (1 diff)
-
pmSubtractionMatch.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmSubtractionMatch.c
r23307 r23308 160 160 161 161 bool pmSubtractionMatchPrecalc(pmReadout *conv1, pmReadout *conv2, const pmReadout *ro1, const pmReadout *ro2, 162 p mSubtractionKernels *kernel, psRegion *region, int stride, float sysError,162 psMetadata *analysis, int stride, float sysError, 163 163 psImageMaskType maskVal, psImageMaskType maskBad, psImageMaskType maskPoor, 164 164 float poorFrac, float badFrac) 165 165 { 166 PM_ASSERT_SUBTRACTION_KERNELS_NON_NULL(kernel, false); 167 pmSubtractionMode subMode = kernel->mode; // Subtraction mode: which input to convolve 166 PS_ASSERT_METADATA_NON_NULL(analysis, false); 167 168 // Extract the kernels 169 pmSubtractionMode mode = PM_SUBTRACTION_MODE_UNSURE; // Subtraction mode: which image to convolve 170 int size = 0; // Size of kernel 171 psList *kernelList = psListAlloc(NULL); // List of kernels 172 { 173 psMetadataIterator *iter = psMetadataIteratorAlloc(analysis, PS_LIST_HEAD, 174 "^" PM_SUBTRACTION_ANALYSIS_KERNEL "$"); 175 psMetadataItem *item; // Item from iteration 176 while ((item = psMetadataGetAndIncrement(iter))) { 177 if (item->type != PS_DATA_UNKNOWN) { 178 psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unexpected type for kernel."); 179 psFree(iter); 180 psFree(kernelList); 181 return false; 182 } 183 pmSubtractionKernels *kernel = item->data.V; // Kernel 184 PM_ASSERT_SUBTRACTION_KERNELS_NON_NULL(kernel, false); 185 size = PS_MAX(size, kernel->size); 186 if (mode == PM_SUBTRACTION_MODE_UNSURE) { 187 mode = kernel->mode; 188 } else if (kernel->mode != mode) { 189 // There's some confusion, so let's set the mode to dual convolution. 190 // This is only used for the subtraction mask, so it's not a big deal. 191 mode = PM_SUBTRACTION_MODE_DUAL; 192 } 193 psListAdd(kernelList, PS_LIST_TAIL, kernel); 194 } 195 psFree(iter); 196 } 197 if (psListLength(kernelList) == 0) { 198 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Unable to find kernels"); 199 psFree(kernelList); 200 return false; 201 } 202 psArray *kernels = psListToArray(kernelList); // Array of kernels 203 psFree(kernelList); 204 205 // Extract the regions 206 psArray *regions = psArrayAllocEmpty(kernels->n); // Array of regions 207 { 208 psMetadataIterator *iter = psMetadataIteratorAlloc(analysis, PS_LIST_HEAD, 209 "^" PM_SUBTRACTION_ANALYSIS_REGION "$"); 210 psMetadataItem *item; // Item from iteration 211 while ((item = psMetadataGetAndIncrement(iter))) { 212 if (item->type != PS_DATA_REGION) { 213 psError(PS_ERR_BAD_PARAMETER_TYPE, true, "Unexpected type for region."); 214 psFree(iter); 215 psFree(kernels); 216 psFree(regions); 217 return false; 218 } 219 psRegion *region = item->data.V; // Region 220 psArrayAdd(regions, regions->n, region); 221 } 222 psFree(iter); 223 } 224 if (regions->n != kernels->n) { 225 psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Differing number of kernels (%ld) and regions (%ld)", 226 kernels->n, regions->n); 227 psFree(regions); 228 psFree(kernels); 229 return false; 230 } 231 168 232 if (!subtractionMatchCheck(conv1, conv2, ro1, ro2, stride, sysError, maskVal, maskBad, maskPoor, 169 poorFrac, badFrac, subMode)) { 233 poorFrac, badFrac, mode)) { 234 psFree(kernels); 235 psFree(regions); 170 236 return false; 171 237 } 172 238 173 psImage *subMask = pmSubtractionMask(ro1->mask, ro2 ? ro2->mask : NULL, maskVal, kernel->size, 0,239 psImage *subMask = pmSubtractionMask(ro1->mask, ro2 ? ro2->mask : NULL, maskVal, size, 0, 174 240 badFrac, useFFT); // Subtraction mask 175 241 if (!subMask) { 176 242 psError(PS_ERR_UNKNOWN, false, "Unable to generate subtraction mask."); 243 psFree(kernels); 244 psFree(regions); 177 245 return false; 178 246 } 179 247 248 psMetadata *outAnalysis = psMetadataAlloc(); // Output analysis values 249 180 250 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; 251 for (int i = 0; i < kernels->n; i++) { 252 pmSubtractionKernels *kernel = kernels->data[i]; // Kernel of interest 253 psRegion *region = regions->data[i]; // Region of interest 254 255 if (!pmSubtractionAnalysis(outAnalysis, kernel, region, ro1->image->numCols, ro1->image->numRows)) { 256 psError(PS_ERR_UNKNOWN, false, "Unable to generate QA data"); 257 psFree(outAnalysis); 258 psFree(subMask); 259 psFree(kernels); 260 psFree(regions); 261 return false; 262 } 263 264 if (!pmSubtractionConvolve(conv1, conv2, ro1, ro2, subMask, stride, maskBad, maskPoor, poorFrac, 265 sysError, region, kernel, true, useFFT)) { 266 psError(PS_ERR_UNKNOWN, false, "Unable to convolve image."); 267 psFree(outAnalysis); 268 psFree(subMask); 269 psFree(kernels); 270 psFree(regions); 271 return false; 272 } 186 273 } 187 274 188 275 psFree(subMask); 276 psFree(kernels); 277 psFree(regions); 278 279 if (conv1) { 280 psMetadataCopy(conv1->analysis, outAnalysis); 281 } 282 if (conv2) { 283 psMetadataCopy(conv2->analysis, outAnalysis); 284 } 285 psFree(outAnalysis); 189 286 190 287 return true; -
trunk/psModules/src/imcombine/pmSubtractionMatch.h
r23307 r23308 53 53 const pmReadout *ro1, ///< Image 1 54 54 const pmReadout *ro2, ///< Image 2 55 pmSubtractionKernels *kernels, ///< Pre-calculated matching kernel 56 psRegion *region, ///< Region of applicability for kernel 55 psMetadata *analysis, ///< Analysis metadata with pre-calculated kernel, region 57 56 int stride, ///< Size for convolution patches 58 57 float sysError, ///< Relative systematic error
Note:
See TracChangeset
for help on using the changeset viewer.
