Changeset 26047
- Timestamp:
- Nov 5, 2009, 1:22:53 PM (17 years ago)
- File:
-
- 1 edited
-
trunk/psModules/src/imcombine/pmSubtraction.c (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmSubtraction.c
r26035 r26047 390 390 } 391 391 392 // Convolve the mask for bad pixels392 // Convolve the mask for bad/poor pixels 393 393 if (subMask && convMask) { 394 394 int box = p_pmSubtractionBadRadius(*kernelImage, kernels, polyValues, 395 395 wantDual, poorFrac); // Size of bad box 396 psAssert(box >= 0, "Bad radius must be >= 0"); 397 398 int colMin = region.x0, colMax = region.x1, rowMin = region.y0, rowMax = region.y1; // Bounds 399 psImage *convolved = NULL; // Convolved subtraction mask 396 400 if (box > 0) { 397 int colMin = region.x0, colMax = region.x1, rowMin = region.y0, rowMax = region.y1; // Bounds 398 psRegion region = psRegionSet(colMin - box, colMax + box, 399 rowMin - box, rowMax + box); // Region to convolve 400 401 psImage *image = subMask ? psImageSubset(subMask, region) : NULL; // Mask to convolve 402 403 psImage *convolved = psImageConvolveMask(NULL, image, subBad, subConvBad, 404 -box, box, -box, box); // Convolved subtraction mask 405 401 psRegion maskRegion = psRegionSet(colMin - box, colMax + box, 402 rowMin - box, rowMax + box); // Region to convolve 403 psImage *image = subMask ? psImageSubset(subMask, maskRegion) : NULL; // Mask to convolve 404 convolved = psImageConvolveMask(NULL, image, subBad, subConvBad, -box, box, -box, box); 406 405 psFree(image); 407 408 psAssert(convolved->numCols - 2 * box == colMax - colMin, "Bad number of columns"); 409 psAssert(convolved->numRows - 2 * box == rowMax - rowMin, "Bad number of rows"); 410 411 for (int yTarget = rowMin, ySource = box; yTarget < rowMax; yTarget++, ySource++) { 412 // Dereference images 413 psImageMaskType *target = &convMask->data.PS_TYPE_IMAGE_MASK_DATA[yTarget][colMin]; // Target values 414 psImageMaskType *source = &convolved->data.PS_TYPE_IMAGE_MASK_DATA[ySource][box]; // Source values 415 for (int xTarget = colMin; xTarget < colMax; xTarget++, target++, source++) { 416 if (*source & subConvBad) { 417 *target |= maskBad; 418 } else if (*source & subConvPoor) { 419 *target |= maskPoor; 420 } 406 } else { 407 convolved = psImageSubset(subMask, region); 408 } 409 410 psAssert(convolved->numCols - 2 * box == colMax - colMin, "Bad number of columns"); 411 psAssert(convolved->numRows - 2 * box == rowMax - rowMin, "Bad number of rows"); 412 413 for (int yTarget = rowMin, ySource = box; yTarget < rowMax; yTarget++, ySource++) { 414 // Dereference images 415 psImageMaskType *target = &convMask->data.PS_TYPE_IMAGE_MASK_DATA[yTarget][colMin]; // Target values 416 psImageMaskType *source = &convolved->data.PS_TYPE_IMAGE_MASK_DATA[ySource][box]; // Source values 417 for (int xTarget = colMin; xTarget < colMax; xTarget++, target++, source++) { 418 if (*source & subConvBad) { 419 *target |= maskBad; 420 } else if (*source & subConvPoor) { 421 *target |= maskPoor; 421 422 } 422 423 } 423 424 // No need to lock: we own this 425 psFree(convolved); 426 } 424 } 425 426 psFree(convolved); 427 427 } 428 428 … … 1066 1066 1067 1067 if (kernels->mode == PM_SUBTRACTION_MODE_1 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) { 1068 convolveRegion(out1->image, out1->variance, convMask, &kernelImage, &kernelVariance,1068 convolveRegion(out1->image, out1->variance, out1->mask, &kernelImage, &kernelVariance, 1069 1069 ro1->image, ro1->variance, kernelErr1, subMask, kernels, polyValues, background, 1070 1070 *region, maskBad, maskPoor, poorFrac, useFFT, false); 1071 1071 } 1072 1072 if (kernels->mode == PM_SUBTRACTION_MODE_2 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) { 1073 convolveRegion(out2->image, out2->variance, convMask, &kernelImage, &kernelVariance,1073 convolveRegion(out2->image, out2->variance, out2->mask, &kernelImage, &kernelVariance, 1074 1074 ro2->image, ro2->variance, kernelErr2, subMask, kernels, polyValues, background, 1075 1075 *region, maskBad, maskPoor, poorFrac, useFFT, … … 1082 1082 1083 1083 if ((kernels->mode == PM_SUBTRACTION_MODE_1 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) && ro1->mask) { 1084 psImageMaskType **target = convMask->data.PS_TYPE_IMAGE_MASK_DATA; // Target mask1084 psImageMaskType **target = out1->mask->data.PS_TYPE_IMAGE_MASK_DATA; // Target mask 1085 1085 psImageMaskType **source = ro1->mask->data.PS_TYPE_IMAGE_MASK_DATA; // Source mask 1086 1086 … … 1092 1092 } 1093 1093 if ((kernels->mode == PM_SUBTRACTION_MODE_2 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) && ro2->mask) { 1094 psImageMaskType **target = convMask->data.PS_TYPE_IMAGE_MASK_DATA; // Target mask1094 psImageMaskType **target = out2->mask->data.PS_TYPE_IMAGE_MASK_DATA; // Target mask 1095 1095 psImageMaskType **source = ro2->mask->data.PS_TYPE_IMAGE_MASK_DATA; // Source mask 1096 1096 … … 1217 1217 out1->mask = psImageAlloc(numCols, numRows, PS_TYPE_IMAGE_MASK); 1218 1218 } 1219 psImageInit(out1->mask, 0); 1219 1220 convMask = out1->mask; 1220 1221 } 1221 1222 if (kernels->mode == PM_SUBTRACTION_MODE_2 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) { 1222 if (convMask) { 1223 if (out2->mask) { 1224 psFree(out2->mask); 1225 } 1226 out2->mask = psMemIncrRefCounter(convMask); 1227 } else { 1228 if (!out2->mask) { 1229 out2->mask = psImageAlloc(numCols, numRows, PS_TYPE_IMAGE_MASK); 1230 } 1223 if (!out2->mask) { 1224 out2->mask = psImageAlloc(numCols, numRows, PS_TYPE_IMAGE_MASK); 1225 } 1226 psImageInit(out2->mask, 0); 1227 if (!convMask) { 1231 1228 convMask = out2->mask; 1232 1229 } 1233 1230 } 1234 psImageInit(convMask, 0);1235 1231 } 1236 1232
Note:
See TracChangeset
for help on using the changeset viewer.
