IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 13395


Ignore:
Timestamp:
May 15, 2007, 5:53:36 PM (19 years ago)
Author:
Paul Price
Message:

Bit better optimisation on convolution: was generating the kernel
every row, but now generate the kernel within each box of the kernel
size.

File:
1 edited

Legend:

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

    r13390 r13395  
    44 *  @author GLG, MHPCC
    55 *
    6  *  @version $Revision: 1.8 $ $Name: not supported by cvs2svn $
    7  *  @date $Date: 2007-05-16 01:04:43 $
     6 *  @version $Revision: 1.9 $ $Name: not supported by cvs2svn $
     7 *  @date $Date: 2007-05-16 03:53:36 $
    88 *
    99 *  Copyright 2004-2007 Institute for Astronomy, University of Hawaii
     
    621621    psKernel *kernelWeight = NULL;      // Kernel for the weight map
    622622
    623     for (int y = size; y < inImage->numRows - size; y++) {
    624         for (int x = size; x < inImage->numCols - size; x++) {
    625             convImage->data.F32[y][x] = background;
     623    for (int j = size; j < inImage->numRows - fullSize; j += fullSize) {
     624        for (int i = size; i < inImage->numCols - fullSize; i += fullSize) {
    626625
    627626            // Only generate polynomial values every kernel footprint, since we have already assumed
    628627            // (with the stamps) that it does not vary rapidly on this scale.
    629             if (x % fullSize == size) {
    630                 psFree(polyValues);
    631                 polyValues = spatialPolyValues(kernels->spatialOrder,
    632                                                2.0 * (float)(x - numCols/2.0) / (float)numCols,
    633                                                2.0 * (float)(y - numRows/2.0) / (float)numRows);
    634                 kernelImage = solvedKernel(kernelImage, solution, kernels, polyValues, imageWeighting);
    635                 if (inWeight) {
    636                     kernelWeight = solvedKernel(kernelWeight, solution, kernels, polyValues,
    637                                                 varianceWeighting);
    638                 }
    639             }
    640 
    641             // Check and propagate the kernel footprint, if required
    642             if (inMask) {
    643                 for (int v = -size; v <= size; v++) {
    644                     for (int u = -size; u <= size; u++) {
    645                         convMask->data.PS_TYPE_MASK_DATA[y][x] |=
    646                             inMask->data.PS_TYPE_MASK_DATA[y + v][x + u];
     628            psFree(polyValues);
     629            polyValues = spatialPolyValues(kernels->spatialOrder,
     630                                           2.0 * (float)(i + size - numCols/2.0) / (float)numCols,
     631                                           2.0 * (float)(j + size - numRows/2.0) / (float)numRows);
     632            kernelImage = solvedKernel(kernelImage, solution, kernels, polyValues, imageWeighting);
     633            if (inWeight) {
     634                kernelWeight = solvedKernel(kernelWeight, solution, kernels, polyValues,
     635                                            varianceWeighting);
     636            }
     637
     638            for (int y = j; y < j + fullSize; y++) {
     639                for (int x = i; x < i + fullSize; x++) {
     640                    convImage->data.F32[y][x] = background;
     641
     642                    // Check and propagate the kernel footprint, if required
     643                    if (inMask) {
     644                        for (int v = -size; v <= size; v++) {
     645                            for (int u = -size; u <= size; u++) {
     646                                convMask->data.PS_TYPE_MASK_DATA[y][x] |=
     647                                    inMask->data.PS_TYPE_MASK_DATA[y + v][x + u];
     648                            }
     649                        }
     650                        if (convMask->data.PS_TYPE_MASK_DATA[y][x] & maskVal) {
     651                            convImage->data.F32[y][x] = NAN;
     652                            if (inWeight) {
     653                                convWeight->data.F32[y][x] = NAN;
     654                            }
     655                            continue;
     656                        }
    647657                    }
    648                 }
    649                 if (convMask->data.PS_TYPE_MASK_DATA[y][x] & maskVal) {
    650                     convImage->data.F32[y][x] = NAN;
     658
     659                    // Convolve the image
     660                    for (int v = -size; v <= size; v++) {
     661                        for (int u = -size; u <= size; u++) {
     662                            convImage->data.F32[y][x] += kernelImage->kernel[v][u] *
     663                                inImage->data.F32[y + v][x + u];
     664                        }
     665                    }
     666
     667                    // Convolve the weight (variance) map
    651668                    if (inWeight) {
    652                         convWeight->data.F32[y][x] = NAN;
    653                     }
    654                     continue;
    655                 }
    656             }
    657 
    658             // Convolve the image
    659             for (int v = -size; v <= size; v++) {
    660                 for (int u = -size; u <= size; u++) {
    661                     convImage->data.F32[y][x] += kernelImage->kernel[v][u] * inImage->data.F32[y + v][x + u];
    662                 }
    663             }
    664 
    665             // Convolve the weight (variance) map
    666             if (inWeight) {
    667                 for (int v = -size; v <= size; v++) {
    668                     for (int u = -size; u <= size; u++) {
    669                         convWeight->data.F32[y][x] += kernelWeight->kernel[v][u] *
    670                             inWeight->data.F32[y + v][x + u];
     669                        for (int v = -size; v <= size; v++) {
     670                            for (int u = -size; u <= size; u++) {
     671                                convWeight->data.F32[y][x] += kernelWeight->kernel[v][u] *
     672                                    inWeight->data.F32[y + v][x + u];
     673                            }
     674                        }
    671675                    }
    672676                }
Note: See TracChangeset for help on using the changeset viewer.