IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Ignore:
Timestamp:
Nov 5, 2006, 3:58:10 PM (20 years ago)
Author:
magnier
Message:

added psImageInterpolate tests so I could test fixes to this function

Location:
trunk/psLib/src/mathtypes
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/mathtypes/psImage.c

    r9538 r9863  
    99 *  @author Ross Harman, MHPCC
    1010 *
    11  *  @version $Revision: 1.115 $ $Name: not supported by cvs2svn $
    12  *  @date $Date: 2006-10-13 21:13:48 $
     11 *  @version $Revision: 1.116 $ $Name: not supported by cvs2svn $
     12 *  @date $Date: 2006-11-06 01:58:10 $
    1313 *
    1414 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    630630                unexposedValue);                                     \
    631631        break;                                                       \
     632    case PS_INTERPOLATE_BICUBE:                                      \
     633        return p_psImagePixelInterpolateBICUBE_##TYPE(             \
     634                input,                                               \
     635                x,                                                   \
     636                y,                                                   \
     637                mask,                                                \
     638                maskVal,                                             \
     639                unexposedValue);                                     \
     640        break;                                                       \
    632641    default:                                                         \
    633642        psError(PS_ERR_BAD_PARAMETER_VALUE,true,                     \
     
    759768        RETURNTYPE unexposedValue) \
    760769{ \
    761     double floorX = floor((psF64)(x) - 0.5); \
    762     double floorY = floor((psF64)(y) - 0.5); \
     770    int floorX = floor((x) - 0.5); \
     771    int floorY = floor((y) - 0.5); \
    763772    psF64 fracX = x - 0.5 - floorX; \
    764773    psF64 fracY = y - 0.5 - floorY; \
    765     psS32 intFloorX = (psS32) floorX; \
    766     psS32 intFloorY = (psS32) floorY; \
    767774    psS32 lastX = input->numCols - 1; \
    768775    psS32 lastY = input->numRows - 1; \
     
    776783    psBool valid11 = false; \
    777784    \
    778     if (intFloorY >= 0 && intFloorY <= lastY) { \
    779         if (intFloorX >= 0 && intFloorX <= lastX) { \
    780             V00 = input->data.TYPE[intFloorY][intFloorX]; \
     785    if (floorY >= 0 && floorY <= lastY) { \
     786        if (floorX >= 0 && floorX <= lastX) { \
     787            V00 = input->data.TYPE[floorY][floorX]; \
    781788            valid00 = (mask == NULL) || \
    782                       ((mask->data.PS_TYPE_MASK_DATA[intFloorY][intFloorX] & maskVal) == 0); \
     789                      ((mask->data.PS_TYPE_MASK_DATA[floorY][floorX] & maskVal) == 0); \
    783790        } \
    784         if (intFloorX >= -1 && intFloorX < lastX) { \
    785             V10 = input->data.TYPE[intFloorY][intFloorX+1]; \
     791        if (floorX >= -1 && floorX < lastX) { \
     792            V10 = input->data.TYPE[floorY][floorX+1]; \
    786793            valid10 = (mask == NULL) || \
    787                       ((mask->data.PS_TYPE_MASK_DATA[intFloorY][intFloorX+1] & maskVal) == 0); \
     794                      ((mask->data.PS_TYPE_MASK_DATA[floorY][floorX+1] & maskVal) == 0); \
    788795        } \
    789796    } \
    790     if (intFloorY >= -1 && intFloorY < lastY) { \
    791         if (intFloorX >= 0 && intFloorX <= lastX) { \
    792             V01 = input->data.TYPE[intFloorY+1][intFloorX]; \
     797    if (floorY >= -1 && floorY < lastY) { \
     798        if (floorX >= 0 && floorX <= lastX) { \
     799            V01 = input->data.TYPE[floorY+1][floorX]; \
    793800            valid01 = (mask == NULL) || \
    794                       ((mask->data.PS_TYPE_MASK_DATA[intFloorY+1][intFloorX] & maskVal) == 0); \
     801                      ((mask->data.PS_TYPE_MASK_DATA[floorY+1][floorX] & maskVal) == 0); \
    795802        } \
    796         if (intFloorX >= -1 && intFloorX < lastX) { \
    797             V11 = input->data.TYPE[intFloorY+1][intFloorX+1]; \
     803        if (floorX >= -1 && floorX < lastX) { \
     804            V11 = input->data.TYPE[floorY+1][floorX+1]; \
    798805            valid11 = (mask == NULL) || \
    799                       ((mask->data.PS_TYPE_MASK_DATA[intFloorY+1][intFloorX+1] & maskVal) == 0); \
     806                      ((mask->data.PS_TYPE_MASK_DATA[floorY+1][floorX+1] & maskVal) == 0); \
    800807        } \
    801808    } \
     
    844851    return unexposedValue; \
    845852}
     853
     854#define PSIMAGE_PIXEL_INTERPOLATE_BICUBE(TYPE, RETURNTYPE, SUFFIX, FRACFUNC) \
     855inline RETURNTYPE p_psImagePixelInterpolateBICUBE_##SUFFIX( \
     856        const psImage* input, \
     857        float x, \
     858        float y, \
     859        const psImage* mask, \
     860        psU32 maskVal, \
     861        RETURNTYPE unexposedValue) \
     862{ \
     863    int floorX = floor(x); \
     864    int floorY = floor(y); \
     865    psF64 fracX = x - floorX - 0.5; \
     866    psF64 fracY = y - floorY - 0.5; \
     867    psS32 lastX = input->numCols - 1; \
     868    psS32 lastY = input->numRows - 1; \
     869    if (floorX < 1) return unexposedValue; \
     870    if (floorY < 1) return unexposedValue; \
     871    if (floorX >= lastX) return unexposedValue; \
     872    if (floorY >= lastY) return unexposedValue; \
     873    \
     874    /* XXX use care for masked and boundary pixels */ \
     875    psF64 Vmm = input->data.TYPE[floorY-1][floorX-1]; \
     876    psF64 Vom = input->data.TYPE[floorY-1][floorX+0]; \
     877    psF64 Vpm = input->data.TYPE[floorY-1][floorX+1]; \
     878    psF64 Vmo = input->data.TYPE[floorY+0][floorX-1]; \
     879    psF64 Voo = input->data.TYPE[floorY+0][floorX+0]; \
     880    psF64 Vpo = input->data.TYPE[floorY+0][floorX+1]; \
     881    psF64 Vmp = input->data.TYPE[floorY+1][floorX-1]; \
     882    psF64 Vop = input->data.TYPE[floorY+1][floorX+0]; \
     883    psF64 Vpp = input->data.TYPE[floorY+1][floorX+1]; \
     884    \
     885    psF64 Vxm = Vmm + Vmo + Vmp; \
     886    psF64 Vxp = Vpm + Vpo + Vpp; \
     887    psF64 Vym = Vmm + Vom + Vpm; \
     888    psF64 Vyp = Vmp + Vop + Vpp; \
     889    psF64 Vo  = Vym + Vyp + Vmo + Voo + Vpo; \
     890    \
     891    psF64 Z_00 = Vo*(5.0/9.0) - (Vxp + Vxm)/3.0 - (Vyp + Vym)/3.0; \
     892    \
     893    psF64 Z_10 = (Vxp - Vxm)/6.0; \
     894    psF64 Z_01 = (Vyp - Vym)/6.0; \
     895    psF64 Z_20 = (Vxp + Vxm)/2.0 - Vo/3.0; \
     896    psF64 Z_02 = (Vyp + Vym)/2.0 - Vo/3.0; \
     897    psF64 Z_11 = (Vpp + Vmm - Vpm - Vmp)/4.0; \
     898    \
     899    psF64 value = Z_00 + Z_10*fracX + Z_01*fracY + Z_20*fracX*fracX + Z_11*fracX*fracY + Z_02*fracY*fracY; \
     900    return value; \
     901}
     902
     903/*
     904    fprintf (stderr, "fX: %f, fY: %f\n", fracX,fracY); \
     905    fprintf (stderr, "iX: %d, iY: %d\n", floorX,floorY); \
     906    fprintf (stderr, "Vmm: %f, Vom: %f, Vpm: %f\n", Vmm, Vom, Vpm); \
     907    fprintf (stderr, "Vmo: %f, Voo: %f, Vpo: %f\n", Vmo, Voo, Vpo); \
     908    fprintf (stderr, "Vmp: %f, Vop: %f, Vpp: %f\n", Vmp, Vop, Vpp); \
     909    fprintf (stderr, "Vxm: %f, Vxp: %f\n", Vxm, Vxp); \
     910    fprintf (stderr, "Vym: %f, Vyp: %f\n", Vym, Vyp); \
     911    fprintf (stderr, "Vo: %f\n", Vo); \
     912    fprintf (stderr, "Z_00: %f, Z_10: %f, Z_01: %f\n", Z_00, Z_10, Z_01); \
     913    fprintf (stderr, "Z_20: %f, Z_11: %f, Z_02: %f\n", Z_20, Z_11, Z_02); \
     914*/
    846915
    847916PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8,psF64,U8,)
     
    857926PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C32,psC64,C32,)
    858927PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(C64,psC64,C64,)
     928
     929PSIMAGE_PIXEL_INTERPOLATE_BICUBE(U8,psF64,U8,)
     930PSIMAGE_PIXEL_INTERPOLATE_BICUBE(U16,psF64,U16,)
     931PSIMAGE_PIXEL_INTERPOLATE_BICUBE(U32,psF64,U32,)
     932PSIMAGE_PIXEL_INTERPOLATE_BICUBE(U64,psF64,U64,)
     933PSIMAGE_PIXEL_INTERPOLATE_BICUBE(S8,psF64,S8,)
     934PSIMAGE_PIXEL_INTERPOLATE_BICUBE(S16,psF64,S16,)
     935PSIMAGE_PIXEL_INTERPOLATE_BICUBE(S32,psF64,S32,)
     936PSIMAGE_PIXEL_INTERPOLATE_BICUBE(S64,psF64,S64,)
     937PSIMAGE_PIXEL_INTERPOLATE_BICUBE(F32,psF64,F32,)
     938PSIMAGE_PIXEL_INTERPOLATE_BICUBE(F64,psF64,F64,)
     939PSIMAGE_PIXEL_INTERPOLATE_BICUBE(C32,psC64,C32,)
     940PSIMAGE_PIXEL_INTERPOLATE_BICUBE(C64,psC64,C64,)
    859941
    860942// Variance Version
  • trunk/psLib/src/mathtypes/psImage.h

    r7766 r9863  
    1111 *  @author Ross Harman, MHPCC
    1212 *
    13  *  @version $Revision: 1.80 $ $Name: not supported by cvs2svn $
    14  *  @date $Date: 2006-06-30 02:20:06 $
     13 *  @version $Revision: 1.81 $ $Name: not supported by cvs2svn $
     14 *  @date $Date: 2006-11-06 01:58:10 $
    1515 *
    1616 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    3434    PS_INTERPOLATE_FLAT,               ///< 'flat' interpolation (nearest pixel)
    3535    PS_INTERPOLATE_BILINEAR,           ///< bi-linear interpolation
     36    PS_INTERPOLATE_BICUBE,             ///< bi-cubic interpolation with 3x3 region
    3637    PS_INTERPOLATE_LANCZOS2,           ///< Sinc interpolation with 4x4 pixel kernel
    3738    PS_INTERPOLATE_LANCZOS3,           ///< Sinc interpolation with 6x6 pixel kernel
     
    237238PIXEL_INTERPOLATE_FCNS(BILINEAR)
    238239PIXEL_INTERPOLATE_FCNS(BILINEAR_VARIANCE)
     240PIXEL_INTERPOLATE_FCNS(BICUBE)
    239241#endif // ! SWIG
    240242
Note: See TracChangeset for help on using the changeset viewer.