IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 1940


Ignore:
Timestamp:
Oct 1, 2004, 10:58:32 AM (22 years ago)
Author:
desonia
Message:

changes related to addition of test for psKernelGenerate.

Location:
trunk/psLib
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/image/psImageConvolve.c

    r1936 r1940  
    55 *  @author Robert DeSonia, MHPCC
    66 *
    7  *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
    8  *  @date $Date: 2004-09-30 21:01:09 $
     7 *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
     8 *  @date $Date: 2004-10-01 20:58:32 $
    99 *
    1010 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    6464    result->yMax = yMax;
    6565    result->image = psImageAlloc(numCols,numRows,PS_TYPE_KERNEL);
     66    memset(result->image->rawDataBuffer,0,numCols*numRows*PSELEMTYPE_SIZEOF(PS_TYPE_KERNEL));
    6667    result->p_kernelRows = psAlloc(sizeof(psKernelType*)*numRows);
    6768
     
    9495    int y = 0;
    9596    int t = 0;
    96     int deltaT = 0;
     97    int deltaT;
     98    int oldX;
     99    int oldY;
    97100    int xMin = 0;
    98101    int xMax = 0;
     
    105108
    106109    // got non-NULL vectors?
    107     if (xShifts == NULL || yShifts == NULL) {
     110    if (tShifts == NULL || xShifts == NULL || yShifts == NULL) {
    108111        psErrorMsg(PS_ERRORNAME_DOMAIN "psKernelGenerate",
    109112                   PS_ERR_BAD_PARAMETER_NULL, true,
     
    146149        ps##TYPE *xShiftData = xShifts->data.TYPE; \
    147150        ps##TYPE *yShiftData = yShifts->data.TYPE; \
     151        x = 0; \
     152        y = 0; \
     153        t = 0; \
    148154        for (int lcv = 0; lcv < length; lcv++) { \
    149155            if (relative) { \
    150156                x += xShiftData[lcv]; \
    151157                y += yShiftData[lcv]; \
     158                t += tShiftData[lcv]; \
    152159            } else { \
    153160                x = xShiftData[lcv]; \
    154161                y = yShiftData[lcv]; \
     162                t = tShiftData[lcv]; \
    155163            } \
    156164            if (x < xMin) { \
     
    168176        kernel = result->kernel; \
    169177        \
    170         x = xShiftData[0]; \
    171         y = yShiftData[0]; \
    172         t = tShiftData[0]; \
    173         normalizeTime = 1.0 / (psKernelType)(tShiftData[length-1]-t); \
    174         for (int i = 1; i < length; i++) { \
     178        normalizeTime = 1.0 / (psKernelType)(t); \
     179        x = 0; \
     180        y = 0; \
     181        t = 0; \
     182        for (int i = 0; i < length; i++) { \
    175183            deltaT = t; \
     184            oldX = x; \
     185            oldY = y; \
    176186            if (relative) { \
    177187                t += tShiftData[i]; \
     
    185195            deltaT = t - deltaT; \
    186196            \
    187             kernel[y][x] += deltaT * normalizeTime; \
     197            kernel[oldY][oldX] += deltaT * normalizeTime; \
    188198        } \
     199        break; \
    189200    }
    190201
  • trunk/psLib/src/imageops/psImageConvolve.c

    r1936 r1940  
    55 *  @author Robert DeSonia, MHPCC
    66 *
    7  *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
    8  *  @date $Date: 2004-09-30 21:01:09 $
     7 *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
     8 *  @date $Date: 2004-10-01 20:58:32 $
    99 *
    1010 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    6464    result->yMax = yMax;
    6565    result->image = psImageAlloc(numCols,numRows,PS_TYPE_KERNEL);
     66    memset(result->image->rawDataBuffer,0,numCols*numRows*PSELEMTYPE_SIZEOF(PS_TYPE_KERNEL));
    6667    result->p_kernelRows = psAlloc(sizeof(psKernelType*)*numRows);
    6768
     
    9495    int y = 0;
    9596    int t = 0;
    96     int deltaT = 0;
     97    int deltaT;
     98    int oldX;
     99    int oldY;
    97100    int xMin = 0;
    98101    int xMax = 0;
     
    105108
    106109    // got non-NULL vectors?
    107     if (xShifts == NULL || yShifts == NULL) {
     110    if (tShifts == NULL || xShifts == NULL || yShifts == NULL) {
    108111        psErrorMsg(PS_ERRORNAME_DOMAIN "psKernelGenerate",
    109112                   PS_ERR_BAD_PARAMETER_NULL, true,
     
    146149        ps##TYPE *xShiftData = xShifts->data.TYPE; \
    147150        ps##TYPE *yShiftData = yShifts->data.TYPE; \
     151        x = 0; \
     152        y = 0; \
     153        t = 0; \
    148154        for (int lcv = 0; lcv < length; lcv++) { \
    149155            if (relative) { \
    150156                x += xShiftData[lcv]; \
    151157                y += yShiftData[lcv]; \
     158                t += tShiftData[lcv]; \
    152159            } else { \
    153160                x = xShiftData[lcv]; \
    154161                y = yShiftData[lcv]; \
     162                t = tShiftData[lcv]; \
    155163            } \
    156164            if (x < xMin) { \
     
    168176        kernel = result->kernel; \
    169177        \
    170         x = xShiftData[0]; \
    171         y = yShiftData[0]; \
    172         t = tShiftData[0]; \
    173         normalizeTime = 1.0 / (psKernelType)(tShiftData[length-1]-t); \
    174         for (int i = 1; i < length; i++) { \
     178        normalizeTime = 1.0 / (psKernelType)(t); \
     179        x = 0; \
     180        y = 0; \
     181        t = 0; \
     182        for (int i = 0; i < length; i++) { \
    175183            deltaT = t; \
     184            oldX = x; \
     185            oldY = y; \
    176186            if (relative) { \
    177187                t += tShiftData[i]; \
     
    185195            deltaT = t - deltaT; \
    186196            \
    187             kernel[y][x] += deltaT * normalizeTime; \
     197            kernel[oldY][oldX] += deltaT * normalizeTime; \
    188198        } \
     199        break; \
    189200    }
    190201
  • trunk/psLib/test/image/tst_psImageConvolve.c

    r1937 r1940  
    55 *  @author Robert DeSonia, MHPCC
    66 *
    7  *  @version $Revision: 1.2 $ $Name: not supported by cvs2svn $
    8  *  @date $Date: 2004-09-30 21:04:15 $
     7 *  @version $Revision: 1.3 $ $Name: not supported by cvs2svn $
     8 *  @date $Date: 2004-10-01 20:58:32 $
    99 *
    1010 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    2121
    2222static int testKernelAlloc(void);
     23static int testKernelGenerate(void);
    2324
    2425testDescription tests[] = {
    2526                              {testKernelAlloc,731,"psKernelAlloc",0,false},
     27                              {testKernelGenerate,732,"psKernelGenerate",0,false},
    2628                              {NULL}
    2729                          };
     
    110112    return 0;
    111113}
     114
     115static int testKernelGenerate(void)
     116{
     117    int size = 4;
     118    int t[] = { 1, 2, 8, 10 };
     119    int x[] = { 0, 1, 0, -1 };
     120    int y[] = { 2, 1, -1, -2 };
     121    psKernelType sum;
     122
     123    psVector* xVec = psVectorAlloc(size,PS_TYPE_U32);
     124    psVector* yVec = psVectorAlloc(size,PS_TYPE_U32);
     125    psVector* tVec = psVectorAlloc(size,PS_TYPE_U32);
     126
     127    for (int i = 0; i < size; i++) {
     128        xVec->data.U32[i] = x[i];
     129        yVec->data.U32[i] = y[i];
     130        tVec->data.U32[i] = t[i];
     131    }
     132
     133    psKernel* result = psKernelGenerate(tVec, xVec, yVec, false);
     134
     135    if (result == NULL) {
     136        psError(__func__,"psKernelGenerate returned NULL.");
     137        return 1;
     138    }
     139
     140    if (result->xMin != -1 || result->xMax != 1 ||
     141            result->yMin != -2 || result->yMax != 2) {
     142        psError(__func__,"psKernelGenerate result had a range of [%d:%d,%d:%d].  Suppose to be [0:1,1:2].",
     143                result->xMin, result->xMax, result->yMin, result->yMax);
     144        return 2;
     145    }
     146
     147    sum = 0.0;
     148    for (int y = result->yMin; y <= result->yMax; y++) {
     149        for (int x = result->xMin; x <= result->xMax; x++) {
     150            sum += result->kernel[y][x];
     151        }
     152    }
     153    if (fabsf(1.0 - sum) > FLT_EPSILON) {
     154        psError(__func__,"psKernelGenerate result is not normalized (sum=%g).",
     155                sum);
     156
     157        return 3;
     158
     159    }
     160
     161    if (fabsf(result->kernel[2][0] - 1.0/10.0) > FLT_EPSILON ||
     162            fabsf(result->kernel[ 1][ 1] - 6.0/10.0) > FLT_EPSILON ||
     163            fabsf(result->kernel[ 0][ 0] - 1.0/10.0) > FLT_EPSILON ||
     164            fabsf(result->kernel[-1][ 0] - 2.0/10.0) > FLT_EPSILON ||
     165            fabsf(result->kernel[-2][-1] - 0.0/10.0) > FLT_EPSILON) {
     166        psError(__func__,"psKernelGenerate result values, %g,%g;%g,%g, are wrong. Suppose to be 2,6;1,0.",
     167                result->kernel[-1][0], result->kernel[1][1],
     168                result->kernel[2][0], result->kernel[-2][-1]);
     169
     170        return 4;
     171    }
     172
     173    psFree(result);
     174    psFree(xVec);
     175    psFree(yVec);
     176    psFree(tVec);
     177
     178    xVec = psVectorAlloc(size,PS_TYPE_S16);
     179    yVec = psVectorAlloc(size,PS_TYPE_S16);
     180    tVec = psVectorAlloc(size,PS_TYPE_S16);
     181
     182    for (int i = 0; i < size; i++) {
     183        xVec->data.S16[i] = x[i];
     184        yVec->data.S16[i] = y[i];
     185        tVec->data.S16[i] = t[i];
     186    }
     187
     188    result = psKernelGenerate(tVec, xVec, yVec, true);
     189
     190    if (result == NULL) {
     191        psError(__func__,"psKernelGenerate returned NULL.");
     192        return 5;
     193    }
     194
     195    if (result->xMin != 0 || result->xMax != 1 ||
     196            result->yMin != 0 || result->yMax != 3) {
     197        psError(__func__,"psKernelGenerate result had a range of [%d:%d,%d:%d].  Suppose to be [0:1,1:2].",
     198                result->xMin, result->xMax, result->yMin, result->yMax);
     199        return 6;
     200    }
     201
     202    sum = 0.0;
     203    for (int y = result->yMin; y <= result->yMax; y++) {
     204        for (int x = result->xMin; x <= result->xMax; x++) {
     205            sum += result->kernel[y][x];
     206        }
     207    }
     208    if (fabsf(1.0 - sum) > FLT_EPSILON) {
     209        psError(__func__,"psKernelGenerate result is not normalized (sum=%g).",
     210                sum);
     211
     212        return 7;
     213
     214    }
     215
     216    if (fabsf(result->kernel[0][0] - 1.0/21.0) > FLT_EPSILON ||
     217            fabsf(result->kernel[2][0] - 2.0/21.0) > FLT_EPSILON ||
     218            fabsf(result->kernel[3][1] - 8.0/21.0) > FLT_EPSILON ||
     219            fabsf(result->kernel[2][1] - 10.0/21.0) > FLT_EPSILON) {
     220        psError(__func__,"psKernelGenerate result values, %g,%g;%g,%g, are wrong. Suppose to be 2,6;1,0.",
     221                result->kernel[1][0], result->kernel[1][1],
     222                result->kernel[2][0], result->kernel[2][1]);
     223
     224        return 8;
     225    }
     226
     227    psFree(result);
     228    psFree(xVec);
     229    psFree(yVec);
     230    psFree(tVec);
     231
     232    xVec = psVectorAlloc(size,PS_TYPE_F32);
     233    yVec = psVectorAlloc(size,PS_TYPE_F32);
     234    tVec = psVectorAlloc(size,PS_TYPE_F32);
     235
     236    for (int i = 0; i < size; i++) {
     237        xVec->data.F32[i] = x[i]+0.1;
     238        yVec->data.F32[i] = y[i]+0.2;
     239        tVec->data.F32[i] = t[i]+0.3;
     240    }
     241
     242    tVec->n--; // decrease size by one to make vectors unequal in length.
     243    psLogMsg(__func__,PS_LOG_INFO, "Following should be a warning - not automatically tested.");
     244    result = psKernelGenerate(tVec, xVec, yVec, false);
     245    if (result == NULL) {
     246        psError(__func__,"psKernelGenerate returned NULL.");
     247        return 9;
     248    }
     249
     250    // make sure last sample is not used
     251    if (fabsf(result->kernel[2][0] - 1.0/8.0) > FLT_EPSILON ||
     252            fabsf(result->kernel[ 1][ 1] - 6.0/8.0) > FLT_EPSILON ||
     253            fabsf(result->kernel[ 0][ 0] - 1.0/8.0) > FLT_EPSILON) {
     254        psError(__func__,"psKernelGenerate result values wrong for truncated time vector.");
     255
     256        return 10;
     257    }
     258
     259    psFree(result);
     260
     261    psLogMsg(__func__,PS_LOG_INFO, "Following should be a error (time vector NULL).");
     262    result = psKernelGenerate(NULL, xVec, yVec, true);
     263    if (result != NULL) {
     264        psError(__func__,"psKernelGenerate returned a kernel with no time vector.");
     265        return 11;
     266    }
     267
     268    psLogMsg(__func__,PS_LOG_INFO, "Following should be a error (x vector NULL).");
     269    result = psKernelGenerate(tVec, NULL, yVec, true);
     270    if (result != NULL) {
     271        psError(__func__,"psKernelGenerate returned a kernel with no x vector.");
     272        return 11;
     273    }
     274
     275    psLogMsg(__func__,PS_LOG_INFO, "Following should be a error (y vector NULL).");
     276    result = psKernelGenerate(tVec, xVec, NULL, true);
     277    if (result != NULL) {
     278        psError(__func__,"psKernelGenerate returned a kernel with no y vector.");
     279        return 11;
     280    }
     281
     282    psFree(xVec);
     283    psFree(yVec);
     284    psFree(tVec);
     285    psFree(result);
     286
     287    return 0;
     288}
Note: See TracChangeset for help on using the changeset viewer.