IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 21383


Ignore:
Timestamp:
Feb 6, 2009, 12:48:53 PM (17 years ago)
Author:
Paul Price
Message:

Fixing ranges.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/imageops/psImageCovariance.c

    r21382 r21383  
    88#include <string.h>
    99
     10#include "psAbort.h"
    1011#include "psMemory.h"
    1112#include "psConstants.h"
     
    182183
    183184    int xMin = covar->xMin, xMax = covar->xMax, yMin = covar->yMin, yMax = covar->yMax; // Range
    184     int maxRadius = PS_MAX(PS_MAX(PS_MAX(xMax, yMax), -xMin), yMin); // Maximum radius of covariance matrix
     185    int maxRadius = PS_MAX(PS_MAX(PS_MAX(xMax, yMax), -xMin), -yMin); // Maximum radius of covariance matrix
    185186
    186187    double sum = 0.0;                   // Sum of covariance
    187     psVector *radiusSum = psVectorAlloc(maxRadius, PS_TYPE_F64); // Totals within (square) radius
     188    psVector *radiusSum = psVectorAlloc(maxRadius + 1, PS_TYPE_F64); // Totals within (square) radius
    188189    psVectorInit(radiusSum, 0.0);
    189190    for (int y = yMin; y <= yMax; y++) {
    190191        for (int x = xMin; x <= xMax; x++) {
    191192            int radius = PS_MAX(abs(x), abs(y)); // Squarish radius
     193            psAssert(radius <= maxRadius, "Radius doesn't fit");
    192194            radiusSum->data.F64[radius] += fabsf(covar->kernel[y][x]);
    193195            sum += fabsf(covar->kernel[y][x]);
     
    204206    psFree(radiusSum);
    205207
     208    if (radius >= maxRadius) {
     209        radius = maxRadius;
     210    }
     211
    206212    // Generate truncated version
    207     psKernel *trunc = psKernelAlloc(-radius, radius, -radius, radius); // Truncated covariance matrix
    208     int numBytes = (2 * radius + 1) * PSELEMTYPE_SIZEOF(PS_TYPE_F32); // Number of bytes to copy
    209     for (int y = -radius; y <= radius; y++) {
    210         memcpy(&trunc->kernel[y][-radius], &covar->kernel[y][-radius], numBytes);
     213    int xMinNew = PS_MAX(xMin, -radius), xMaxNew = PS_MIN(xMax, radius); // New range in x
     214    int yMinNew = PS_MAX(yMin, -radius), yMaxNew = PS_MIN(yMax, radius); // New range in y
     215    psKernel *trunc = psKernelAlloc(xMinNew, xMaxNew, yMinNew, yMaxNew); // Truncated covariance matrix
     216    int numBytes = (xMaxNew - xMinNew + 1) * PSELEMTYPE_SIZEOF(PS_TYPE_F32); // Number of bytes to copy
     217    for (int y = yMinNew; y <= yMaxNew; y++) {
     218        memcpy(&trunc->kernel[y][xMinNew], &covar->kernel[y][xMinNew], numBytes);
    211219    }
    212220
Note: See TracChangeset for help on using the changeset viewer.