Changeset 21303
- Timestamp:
- Feb 4, 2009, 5:30:57 PM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/pap_branch_20090128/psModules/src/imcombine/pmSubtraction.c
r21301 r21303 997 997 998 998 // XXX Put kernelImage, kernelVariance and polyValues on thread-dependent data 999 static bool subtractionConvolvePatch(psKernel **covar1, psKernel **covar2, // Covariance matrices 1000 int numCols, int numRows, // Size of image 999 static bool subtractionConvolvePatch(int numCols, int numRows, // Size of image 1001 1000 int x0, int y0, // Offsets for image 1002 1001 pmReadout *out1, pmReadout *out2, // Output readouts … … 1031 1030 ro1->image, ro1->variance, sys1, subMask, kernels, polyValues, background, *region, 1032 1031 maskBad, maskPoor, poorFrac, useFFT, false); 1033 *covar1 = psImageCovarianceCalculate(kernelImage, ro1->covariance);1034 1032 } 1035 1033 if (kernels->mode == PM_SUBTRACTION_MODE_2 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) { … … 1037 1035 ro2->image, ro2->variance, sys2, subMask, kernels, polyValues, background, *region, 1038 1036 maskBad, maskPoor, poorFrac, useFFT, kernels->mode == PM_SUBTRACTION_MODE_DUAL); 1039 *covar2 = psImageCovarianceCalculate(kernelImage, ro2->covariance);1040 1037 } 1041 1038 … … 1093 1090 bool useFFT = PS_SCALAR_VALUE(args->data[18], PS_TYPE_IMAGE_MASK_DATA); // Use FFT for convolution? 1094 1091 1095 psKernel *covar1 = NULL, *covar2 = NULL; // Covariance matrices to return 1096 1097 if (!subtractionConvolvePatch(&covar1, &covar2, numCols, numRows, x0, y0, out1, out2, convMask, ro1, ro2, 1098 sys1, sys2, subMask, maskBad, maskPoor, poorFrac, region, kernels, doBG, 1099 useFFT)) { 1100 return false; 1101 } 1102 job->results = psArrayAlloc(2); 1103 job->results->data[0] = covar1; 1104 job->results->data[1] = covar2; 1105 1106 return true; 1092 return subtractionConvolvePatch(numCols, numRows, x0, y0, out1, out2, convMask, ro1, ro2, sys1, sys2, 1093 subMask, maskBad, maskPoor, poorFrac, region, kernels, doBG, useFFT); 1107 1094 } 1108 1095 … … 1264 1251 stride = 2 * size + 1; 1265 1252 } 1266 1267 psList *covariances1 = psListAlloc(NULL), *covariances2 = psListAlloc(NULL); // List of covariances1268 1253 1269 1254 for (int j = yMin; j < yMax; j += stride) { … … 1321 1306 psFree(job); 1322 1307 } else { 1323 psKernel *covar1 = NULL, *covar2 = NULL; // Covariance matrices 1324 subtractionConvolvePatch(&covar1, &covar2, numCols, numRows, x0, y0, out1, out2, convMask, 1325 ro1, ro2, sys1, sys2, subMask, maskBad, maskPoor, poorFrac, 1326 subRegion, kernels, doBG, useFFT); 1327 if (covar1) { 1328 psListAdd(covariances1, PS_LIST_TAIL, covar1); 1329 } 1330 if (covar2) { 1331 psListAdd(covariances2, PS_LIST_TAIL, covar2); 1332 } 1333 psFree(covar1); 1334 psFree(covar2); 1308 subtractionConvolvePatch(numCols, numRows, x0, y0, out1, out2, convMask, ro1, ro2, sys1, sys2, 1309 subMask, maskBad, maskPoor, poorFrac, subRegion, kernels, doBG, 1310 useFFT); 1335 1311 } 1336 1312 psFree(subRegion); … … 1352 1328 psAssert(strcmp(job->type, "PSMODULES_SUBTRACTION_CONVOLVE") == 0, 1353 1329 "Job has incorrect type: %s", job->type); 1354 psAssert(job->results->n == 2, "Job has insufficient results: %ld", job->results->n);1355 if (job->results->data[0]) {1356 psListAdd(covariances1, PS_LIST_TAIL, job->results->data[0]);1357 }1358 if (job->results->data[1]) {1359 psListAdd(covariances2, PS_LIST_TAIL, job->results->data[1]);1360 }1361 1330 psFree(job); 1362 1331 } … … 1377 1346 psFree(sys2); 1378 1347 1379 if (psListLength(covariances1) > 0) { 1380 psArray *covar = psListToArray(covariances1); 1381 out1->covariance = psImageCovarianceAverage(covar); 1382 psFree(covar); 1383 } 1384 if (psListLength(covariances2) > 0) { 1385 psArray *covar = psListToArray(covariances2); 1386 out2->covariance = psImageCovarianceAverage(covar); 1387 psFree(covar); 1388 } 1389 psFree(covariances1); 1390 psFree(covariances2); 1348 // Calculate covariances 1349 // This can take a while, so we only do it for a single instance 1350 // XXX psImageCovarianceCalculate could be multithreaded 1351 if (kernels->mode == PM_SUBTRACTION_MODE_1 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) { 1352 psKernel *kernel = pmSubtractionKernel(kernels, 0.0, 0.0, false); // Convolution kernel 1353 out1->covariance = psImageCovarianceCalculate(kernel, ro1->covariance); 1354 psFree(kernel); 1355 } 1356 if (kernels->mode == PM_SUBTRACTION_MODE_2 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) { 1357 psKernel *kernel = pmSubtractionKernel(kernels, 0.0, 0.0, 1358 kernels->mode == PM_SUBTRACTION_MODE_DUAL); // Conv. kernel 1359 out2->covariance = psImageCovarianceCalculate(kernel, ro2->covariance); 1360 psFree(kernel); 1361 } 1391 1362 1392 1363 // Copy anything that wasn't convolved … … 1397 1368 out2->variance = psMemIncrRefCounter(ro2->variance); 1398 1369 out2->mask = psMemIncrRefCounter(ro2->mask); 1370 out2->covariance = psMemIncrRefCounter(ro2->covariance); 1399 1371 } 1400 1372 break; … … 1404 1376 out1->variance = psMemIncrRefCounter(ro1->variance); 1405 1377 out1->mask = psMemIncrRefCounter(ro1->mask); 1378 out1->covariance = psMemIncrRefCounter(ro1->covariance); 1406 1379 } 1407 1380 break;
Note:
See TracChangeset
for help on using the changeset viewer.
