IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 9863


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
Files:
1 added
4 edited

Legend:

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

    r9730 r9863  
    1010 *  @author Ross Harman, MHPCC
    1111 *
    12  *  @version $Revision: 1.29 $ $Name: not supported by cvs2svn $
    13  *  @date $Date: 2006-10-24 22:52:55 $
     12 *  @version $Revision: 1.30 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2006-11-06 01:58:09 $
    1414 *
    1515 *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
     
    636636        break; \
    637637    } \
     638    /* XXX output(i,j) = input(i+0.5-dx,j+0.5-dy) */ \
    638639    for (psS32 row=0;row<outRows;row++) { \
    639640        ps##TYPE* outRow = out->data.TYPE[row]; \
    640         float y = dy+(float)row; \
     641        float y = row + 0.5 - dy; \
    641642        for (psS32 col=0;col<outCols;col++) { \
     643            float x = col + 0.5 - dx; \
    642644            outRow[col] = p_psImagePixelInterpolate##MODE##_##TYPE( \
    643                           input,dx+(float)col,y,NULL,0,exposed); \
     645                          input,x,y,NULL,0,exposed); \
    644646        } \
    645647    } \
     
    678680        PSIMAGE_SHIFT_ARBITRARY_CASE(BILINEAR);
    679681        PSIMAGE_SHIFT_ARBITRARY_CASE(BILINEAR_VARIANCE);
     682        PSIMAGE_SHIFT_ARBITRARY_CASE(BICUBE);
    680683    default:
    681684        psError(PS_ERR_BAD_PARAMETER_VALUE, true,
  • 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
  • trunk/psLib/test/mathtypes/Makefile.am

    r8958 r9863  
     1
    12AM_CPPFLAGS = \
    23        $(SRCINC) \
     
    45        -I$(top_srcdir)/test/pstap/src \
    56        $(PSLIB_CFLAGS)
     7
    68AM_LDFLAGS = \
    79        $(top_builddir)/src/libpslib.la  \
     
    1113
    1214TEST_PROGS = \
    13         tap_psVector
     15        tap_psVector \
     16        tap_psImageInterpolate
    1417
    1518if BUILD_TESTS
Note: See TracChangeset for help on using the changeset viewer.