Changeset 19335
- Timestamp:
- Sep 2, 2008, 3:37:23 PM (18 years ago)
- File:
-
- 1 edited
-
trunk/psModules/src/imcombine/pmSubtraction.c (modified) (11 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/psModules/src/imcombine/pmSubtraction.c
r19299 r19335 223 223 if (threaded) { 224 224 psMutexUnlock(image); 225 psMutexLock(mask); 226 } 227 psImage *subMask = mask ? psImageSubset(mask, border) : NULL; // Subimage mask 228 if (threaded) { 229 psMutexUnlock(mask); 225 } 226 227 psImage *subMask; // Subimage mask 228 if (mask) { 229 if (threaded) { 230 psMutexLock(mask); 231 } 232 subMask = psImageSubset(mask, border); 233 if (threaded) { 234 psMutexUnlock(mask); 235 } 236 } else { 237 subMask = NULL; 230 238 } 231 239 … … 238 246 if (threaded) { 239 247 psMutexUnlock(image); 240 psMutexLock(mask); 241 } 242 psFree(subMask); 243 if (threaded) { 244 psMutexUnlock(mask); 245 } 246 247 // Now, we have to chop off the borders, and stick it in where it belongs 248 // No locking because we own this one 249 psImage *subConv = psImageSubset(convolved, psRegionSet(size, -size, size, -size)); // Cut off the edges 250 248 } 249 250 if (mask) { 251 if (threaded) { 252 psMutexLock(mask); 253 } 254 psFree(subMask); 255 if (threaded) { 256 psMutexUnlock(mask); 257 } 258 } 259 260 // Now, we have to stick it in where it belongs 251 261 int xMin = region.x0, xMax = region.x1, yMin = region.y0, yMax = region.y1; // Bounds of region 252 262 if (background != 0.0) { … … 262 272 } 263 273 } 264 psFree(subConv);265 274 psFree(convolved); 266 275 … … 303 312 float background, // Background value to apply 304 313 psRegion region, // Region to convolve 314 psMaskType maskBad, // Value to give bad pixels 315 psMaskType maskPoor, // Value to give poor pixels 305 316 float poorFrac, // Fraction for "poor" 306 317 bool useFFT, // Use FFT to convolve? … … 313 324 } 314 325 315 psMaskType maskSource; // Mask these values when 316 psMaskType maskTarget; // Set this mask value when convolving 326 psMaskType subBad; // Bad pixels in subtraction mask 327 psMaskType subConvBad; // Bad pixels in subtraction mask when convolving 328 psMaskType subConvPoor; // Poor pixels in subtraction mask when convolving 317 329 if (kernels->mode == PM_SUBTRACTION_MODE_1 || (kernels->mode == PM_SUBTRACTION_MODE_DUAL && !wantDual)) { 318 maskSource = PM_SUBTRACTION_MASK_BAD_1; 319 maskTarget = PM_SUBTRACTION_MASK_CONVOLVE_BAD_1; 330 subBad = PM_SUBTRACTION_MASK_BAD_1; 331 subConvBad = PM_SUBTRACTION_MASK_CONVOLVE_BAD_1; 332 subConvPoor = PM_SUBTRACTION_MASK_CONVOLVE_1; 320 333 } else { 321 maskSource = PM_SUBTRACTION_MASK_BAD_2; 322 maskTarget = PM_SUBTRACTION_MASK_CONVOLVE_BAD_2; 334 subBad = PM_SUBTRACTION_MASK_BAD_2; 335 subConvBad = PM_SUBTRACTION_MASK_CONVOLVE_BAD_2; 336 subConvPoor = PM_SUBTRACTION_MASK_CONVOLVE_2; 323 337 } 324 338 … … 327 341 // Use Fast Fourier Transform to do the convolution 328 342 // This provides a big speed-up for large kernels 329 convolveFFT(convImage, image, subMask, maskSource, *kernelImage, region, background, kernels->size);343 convolveFFT(convImage, image, subMask, subBad, *kernelImage, region, background, kernels->size); 330 344 if (weight) { 331 convolveFFT(convWeight, weight, subMask, maskSource, *kernelWeight, region, 0.0, kernels->size);345 convolveFFT(convWeight, weight, subMask, subBad, *kernelWeight, region, 0.0, kernels->size); 332 346 } 333 347 } else { 348 // XXX Direct convolution doesn't account for bad pixels yet 334 349 convolveDirect(convImage, image, *kernelImage, region, background, kernels->size); 335 350 if (weight) { … … 344 359 if (box > 0) { 345 360 int colMin = region.x0, colMax = region.x1, rowMin = region.y0, rowMax = region.y1; // Bounds 346 347 361 bool threaded = pmSubtractionThreaded(); // Are we running threaded? 362 348 363 if (threaded) { 349 364 psMutexLock(subMask); 350 365 } 351 366 psImage *image = psImageSubset(subMask, psRegionSet(colMin - box, colMax + box, 352 rowMin - box, rowMax + box)); 367 rowMin - box, rowMax + box)); // Mask 353 368 if (threaded) { 354 369 psMutexUnlock(subMask); 355 370 } 356 371 357 psImage *convolved = psImageConvolveMask(NULL, image, maskSource, maskTarget,372 psImage *convolved = psImageConvolveMask(NULL, image, subBad, subConvBad, 358 373 -box, box, -box, box); // Convolved subtraction mask 359 374 … … 366 381 } 367 382 368 int numBytes = (colMax - colMin) * PSELEMTYPE_SIZEOF(PS_TYPE_MASK); // Number of bytes to copy369 383 psAssert(convolved->numCols - 2 * box == colMax - colMin, "Bad number of columns"); 370 384 psAssert(convolved->numRows - 2 * box == rowMax - rowMin, "Bad number of rows"); 371 385 372 // Since we're copying back into the source, we need to lock373 if (threaded) {374 psMutexLock(subMask);375 }376 386 for (int yTarget = rowMin, ySource = box; yTarget < rowMax; yTarget++, ySource++) { 377 memcpy(&subMask->data.PS_TYPE_MASK_DATA[yTarget][colMin], 378 &convolved->data.PS_TYPE_MASK_DATA[ySource][box], numBytes); 379 } 380 if (threaded) { 381 psMutexUnlock(subMask); 387 // Dereference images 388 psMaskType *target = &convMask->data.PS_TYPE_MASK_DATA[yTarget][colMin]; // Target values 389 psMaskType *source = &convolved->data.PS_TYPE_MASK_DATA[ySource][box]; // Source values 390 for (int xTarget = colMin; xTarget < colMax; xTarget++, target++, source++) { 391 if (*source & subConvBad) { 392 *target |= maskBad; 393 } else if (*source & subConvPoor) { 394 *target |= maskPoor; 395 } 396 } 382 397 } 383 398 … … 896 911 if (kernels->mode == PM_SUBTRACTION_MODE_1 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) { 897 912 convolveRegion(out1->image, out1->weight, convMask, &kernelImage, &kernelWeight, 898 ro1->image, ro1->weight, subMask, kernels, polyValues, background, 899 *region, poorFrac, useFFT, false);913 ro1->image, ro1->weight, subMask, kernels, polyValues, background, *region, 914 maskBad, maskPoor, poorFrac, useFFT, false); 900 915 } 901 916 if (kernels->mode == PM_SUBTRACTION_MODE_2 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) { 902 917 convolveRegion(out2->image, out2->weight, convMask, &kernelImage, &kernelWeight, 903 ro2->image, ro2->weight, subMask, kernels, polyValues, background, 904 *region, poorFrac, useFFT, kernels->mode == PM_SUBTRACTION_MODE_DUAL);918 ro2->image, ro2->weight, subMask, kernels, polyValues, background, *region, 919 maskBad, maskPoor, poorFrac, useFFT, kernels->mode == PM_SUBTRACTION_MODE_DUAL); 905 920 } 906 921 … … 909 924 psFree(polyValues); 910 925 911 // Propagate the subtraction mask912 if (subMask) {913 psMaskType **target = convMask->data.PS_TYPE_MASK_DATA; // Target mask914 psMaskType **source = subMask->data.PS_TYPE_MASK_DATA; // Source mask915 916 psMaskType poor, bad; // Mask value for "poor" and "bad" pixels in subtraction mask917 switch (kernels->mode) {918 case PM_SUBTRACTION_MODE_1:919 poor = PM_SUBTRACTION_MASK_CONVOLVE_1;920 bad = PM_SUBTRACTION_MASK_CONVOLVE_BAD_1 | PM_SUBTRACTION_MASK_BAD_1 | PM_SUBTRACTION_MASK_BAD_2;921 break;922 case PM_SUBTRACTION_MODE_2:923 poor = PM_SUBTRACTION_MASK_CONVOLVE_2;924 bad = PM_SUBTRACTION_MASK_CONVOLVE_BAD_2 | PM_SUBTRACTION_MASK_BAD_1 | PM_SUBTRACTION_MASK_BAD_2;925 break;926 case PM_SUBTRACTION_MODE_DUAL:927 poor = PM_SUBTRACTION_MASK_CONVOLVE_1 | PM_SUBTRACTION_MASK_CONVOLVE_1;928 bad = PM_SUBTRACTION_MASK_CONVOLVE_BAD_1 | PM_SUBTRACTION_MASK_CONVOLVE_BAD_2 |929 PM_SUBTRACTION_MASK_BAD_1 | PM_SUBTRACTION_MASK_BAD_2;930 break;931 default:932 psAbort("Unrecognised subtraction mode: %x", kernels->mode);933 }934 935 for (int y = yMin; y < yMax; y++) {936 for (int x = xMin; x < xMax; x++) {937 // Pixels marked as "bad" shouldn't also be marked as "poor"938 if (source[y][x] & bad) {939 target[y][x] |= maskBad;940 } else if (source[y][x] & poor){941 target[y][x] |= maskPoor;942 }943 }944 }945 }946 926 if ((kernels->mode == PM_SUBTRACTION_MODE_1 || kernels->mode == PM_SUBTRACTION_MODE_DUAL) && ro1->mask) { 947 927 psMaskType **target = convMask->data.PS_TYPE_MASK_DATA; // Target mask … … 1160 1140 psArrayAdd(args, 1, (pmReadout*)ro1); // Casting away const 1161 1141 psArrayAdd(args, 1, (pmReadout*)ro2); // Casting away const 1142 // Since adding to the array can impact the reference count, we need to lock 1143 psMutexLock(subMask); 1162 1144 psArrayAdd(args, 1, (psImage*)subMask); // Casting away const 1145 psMutexUnlock(subMask); 1163 1146 PS_ARRAY_ADD_SCALAR(args, maskBad, PS_TYPE_U8); 1164 1147 PS_ARRAY_ADD_SCALAR(args, maskPoor, PS_TYPE_U8);
Note:
See TracChangeset
for help on using the changeset viewer.
