IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 23308


Ignore:
Timestamp:
Mar 12, 2009, 3:22:20 PM (17 years ago)
Author:
Paul Price
Message:

It's a little more complicated than I thought --- there could be multiple kernels, if we have specified multiple regions. Decided to handle that at the psModules level, instead of higher.

Location:
trunk/psModules/src/imcombine
Files:
2 edited

Legend:

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

    r23307 r23308  
    160160
    161161bool pmSubtractionMatchPrecalc(pmReadout *conv1, pmReadout *conv2, const pmReadout *ro1, const pmReadout *ro2,
    162                                pmSubtractionKernels *kernel, psRegion *region, int stride, float sysError,
     162                               psMetadata *analysis, int stride, float sysError,
    163163                               psImageMaskType maskVal, psImageMaskType maskBad, psImageMaskType maskPoor,
    164164                               float poorFrac, float badFrac)
    165165{
    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
    168232    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);
    170236        return false;
    171237    }
    172238
    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,
    174240                                         badFrac, useFFT); // Subtraction mask
    175241    if (!subMask) {
    176242        psError(PS_ERR_UNKNOWN, false, "Unable to generate subtraction mask.");
     243        psFree(kernels);
     244        psFree(regions);
    177245        return false;
    178246    }
    179247
     248    psMetadata *outAnalysis = psMetadataAlloc(); // Output analysis values
     249
    180250    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        }
    186273    }
    187274
    188275    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);
    189286
    190287    return true;
  • trunk/psModules/src/imcombine/pmSubtractionMatch.h

    r23307 r23308  
    5353                               const pmReadout *ro1, ///< Image 1
    5454                               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
    5756                               int stride, ///< Size for convolution patches
    5857                               float sysError, ///< Relative systematic error
Note: See TracChangeset for help on using the changeset viewer.