IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Aug 29, 2007, 5:50:28 PM (19 years ago)
Author:
Paul Price
Message:

Extensive changes to image subtraction codes. Discovered that I
wasn't (again) implementing the algorithm correctly --- I was
accumulating

sum_x,y C_i(x,y) sum_x,y C_j(x,y)

instead of

sum_x,y C_i(x,y) C_j(x,y)

i.e., I was doing the sums separately. I'm amazed that it was
actually getting fairly decent results before, but now it's doing it
properly. As part of this fix, added in, for each stamp, images
corresponding to the convolution of the reference with each of the
kernel components. This allows fast rejection (instead of generating
the kernel and convolving, can simply sum the individual convolutions
with the correct scaling).
Added use of FFT to do convolutions. This involved changing around
the convolvePixel function (now convolveRef, since it generates the
entire image for the convolution of the reference stamp with a kernel
component, rather than a single pixel as previously). Tested with
POIS and ISIS kernels, but no others yet. FFT is nice and fast for
the large (size = 10) kernels I've been using, so I also moved it in
to the convolveRef function for appropriate kernel types.
As part of the FFT move, discovered that my convolutions were around
the wrong way --- supposed to be convolved = image[y][x] * conv[y - v][x - u]
instead of conv[y + v][x + u]. However, this problem didn't manifest
itself previously because everything was consistently around the wrong
way. The FFT does it the Correct Way, so it revealed the problem. This
is now fixed throughout the image subtraction code.

File:
1 edited

Legend:

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

    r14690 r14701  
    216216
    217217    // Subtract a reference kernel from all the others to maintain flux scaling
    218     int subIndex = 0;                   // Index of kernel to subtract from others
    219     psKernel *subtract = kernels->preCalc->data[subIndex]; // Kernel to subtract from others
    220     int numGaussians = fwhms->n;       // Number of Gaussians
    221     for (int i = 0, index = 0; i < numGaussians; i++) {
    222         for (int uOrder = 0; uOrder <= orders->data.S32[i]; uOrder++) {
    223             for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) {
    224                 if (uOrder % 2 == 0 && vOrder % 2 == 0 && index != subIndex) {
    225                     psKernel *kernel = kernels->preCalc->data[index]; // Kernel to subtract
    226                     psBinaryOp(kernel->image, kernel->image, "-", subtract->image);
     218//    if (spatialOrder > 0) {
     219        int subIndex = 0;                   // Index of kernel to subtract from others
     220        psKernel *subtract = kernels->preCalc->data[subIndex]; // Kernel to subtract from others
     221        int numGaussians = fwhms->n;       // Number of Gaussians
     222        for (int i = 0, index = 0; i < numGaussians; i++) {
     223            for (int uOrder = 0; uOrder <= orders->data.S32[i]; uOrder++) {
     224                for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) {
     225                    if (uOrder % 2 == 0 && vOrder % 2 == 0 && index != subIndex) {
     226                        psKernel *kernel = kernels->preCalc->data[index]; // Kernel to subtract
     227                        psBinaryOp(kernel->image, kernel->image, "-", subtract->image);
     228                    }
    227229                }
    228230            }
    229231        }
    230     }
     232//    }
    231233
    232234    if (psTraceGetLevel("psModules.imcombine.kernel") >= 10) {
     
    452454    // Subtract unity from the kernels to maintain photometric flux scaling
    453455    int numGaussians = fwhms->n;       // Number of Gaussians
    454     for (int i = 0, index = 0; i < numGaussians; i++) {
    455         for (int uOrder = 0; uOrder <= orders->data.S32[i]; uOrder++) {
    456             for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) {
    457                 if (uOrder % 2 == 0 && vOrder % 2 == 0) {
    458                     psKernel *kernel = kernels->preCalc->data[index]; // Kernel to subtract
    459                     kernel->kernel[0][0] -= 1.0;
     456//    if (spatialOrder > 0) {
     457        for (int i = 0, index = 0; i < numGaussians; i++) {
     458            for (int uOrder = 0; uOrder <= orders->data.S32[i]; uOrder++) {
     459                for (int vOrder = 0; vOrder <= orders->data.S32[i] - uOrder; vOrder++, index++) {
     460                    if (uOrder % 2 == 0 && vOrder % 2 == 0) {
     461                        psKernel *kernel = kernels->preCalc->data[index]; // Kernel to subtract
     462                        kernel->kernel[0][0] -= 1.0;
     463                    }
    460464                }
    461465            }
    462466        }
    463     }
     467//    }
    464468
    465469    int numISIS = kernels->num;         // Number of ISIS kernels
    466470    int numInner = PS_SQR(2 * inner + 1); // Number of inner kernel elements
    467471
    468     if (!p_pmSubtractionKernelsAddGrid(kernels, numGaussians, inner)) {
     472    if (!p_pmSubtractionKernelsAddGrid(kernels, numISIS, inner)) {
    469473        psAbort("Should never get here.");
    470474    }
Note: See TracChangeset for help on using the changeset viewer.