IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 5, 2009, 1:22:53 PM (17 years ago)
Author:
Paul Price
Message:

Fix propagation of mask (for poor pixels) when poor box size = 0.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psModules/src/imcombine/pmSubtraction.c

    r26035 r26047  
    390390    }
    391391
    392     // Convolve the mask for bad pixels
     392    // Convolve the mask for bad/poor pixels
    393393    if (subMask && convMask) {
    394394        int box = p_pmSubtractionBadRadius(*kernelImage, kernels, polyValues,
    395395                                           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
    396400        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);
    406405            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;
    421422                }
    422423            }
    423 
    424             // No need to lock: we own this
    425             psFree(convolved);
    426         }
     424        }
     425
     426        psFree(convolved);
    427427    }
    428428
     
    10661066
    10671067    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,
    10691069                       ro1->image, ro1->variance, kernelErr1, subMask, kernels, polyValues, background,
    10701070                       *region, maskBad, maskPoor, poorFrac, useFFT, false);
    10711071    }
    10721072    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,
    10741074                       ro2->image, ro2->variance, kernelErr2, subMask, kernels, polyValues, background,
    10751075                       *region, maskBad, maskPoor, poorFrac, useFFT,
     
    10821082
    10831083    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 mask
     1084        psImageMaskType **target = out1->mask->data.PS_TYPE_IMAGE_MASK_DATA; // Target mask
    10851085        psImageMaskType **source = ro1->mask->data.PS_TYPE_IMAGE_MASK_DATA; // Source mask
    10861086
     
    10921092    }
    10931093    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 mask
     1094        psImageMaskType **target = out2->mask->data.PS_TYPE_IMAGE_MASK_DATA; // Target mask
    10951095        psImageMaskType **source = ro2->mask->data.PS_TYPE_IMAGE_MASK_DATA; // Source mask
    10961096
     
    12171217                out1->mask = psImageAlloc(numCols, numRows, PS_TYPE_IMAGE_MASK);
    12181218            }
     1219            psImageInit(out1->mask, 0);
    12191220            convMask = out1->mask;
    12201221        }
    12211222        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) {
    12311228                convMask = out2->mask;
    12321229            }
    12331230        }
    1234         psImageInit(convMask, 0);
    12351231    }
    12361232
Note: See TracChangeset for help on using the changeset viewer.