IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

Changeset 1260


Ignore:
Timestamp:
Jul 22, 2004, 10:02:57 AM (22 years ago)
Author:
desonia
Message:

Added psImageResample and complex support for pixel interpolation routines.

Location:
trunk/psLib/src
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/psLib/src/astronomy/psTime.d

    r1231 r1260  
    1 psTime.o psTime.d : psTime.c psTime.h ../collections/psType.h ../sysUtils/psError.h
     1psTime.o psTime.d : psTime.c psTime.h ../collections/psType.h ../sysUtils/psError.h \
     2  ../sysUtils/psMemory.h
  • trunk/psLib/src/image/psImageManip.c

    r1250 r1260  
    1010 *  @author Ross Harman, MHPCC
    1111 *
    12  *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
    13  *  @date $Date: 2004-07-21 23:39:10 $
     12 *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2004-07-22 20:02:56 $
    1414 *
    1515 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    404404    if (in == NULL) {
    405405        psError(__func__,"Input image is NULL.");
     406        psFree(out);
    406407        return NULL;
    407408    }
     
    409410    if (scale < 1) {
    410411        psError(__func__,"The scale must be positive.");
     412        psFree(out);
    411413        return NULL;
    412414    }
     
    414416    if (stats == NULL) {
    415417        psError(__func__,"The stats input can not be NULL.");
     418        psFree(out);
    416419        return NULL;
    417420    }
     
    419422    if (getSpecifiedStatValue(stats,&statVal) == false) {
    420423        psError(__func__,"The stat options didn't specify a single supported statistic type.");
     424        psFree(out);
    421425        return NULL;
    422426    }
     
    484488    return out;
    485489}
     490psImage* psImageResample(psImage* out, const psImage* in, int scale, psImageInterpolateMode mode)
     491{
     492    int outRows;
     493    int outCols;
     494    float invScale;
     495
     496    if (in == NULL) {
     497        psError(__func__,"Input image can not be NULL.");
     498        psFree(out);
     499        return NULL;
     500    }
     501
     502    // create an output image of the same size and type
     503    outRows = in->numRows*scale;
     504    outCols = in->numCols*scale;
     505    invScale = 1.0f / (float)scale;
     506
     507
     508    #define PSIMAGE_RESAMPLE_CASE(TYPE) \
     509case PS_TYPE_##TYPE: { \
     510        out = psImageRecycle(out,outCols, outRows, PS_TYPE_##TYPE); \
     511        for (int row=0;row<outRows;row++) { \
     512            ps##TYPE* rowData = out->data.TYPE[row]; \
     513            float inRow = (float)row * invScale; \
     514            for (int col=0;col<outCols;col++) { \
     515                rowData[col] = psImagePixelInterpolate(in,inRow,(float)col*invScale,0,mode); \
     516            } \
     517        }  \
     518        break; \
     519    }
     520
     521    switch(in->type.type) {
     522        PSIMAGE_RESAMPLE_CASE(U8)
     523        PSIMAGE_RESAMPLE_CASE(U16)
     524        PSIMAGE_RESAMPLE_CASE(U32)
     525        PSIMAGE_RESAMPLE_CASE(U64)
     526        PSIMAGE_RESAMPLE_CASE(S8)
     527        PSIMAGE_RESAMPLE_CASE(S16)
     528        PSIMAGE_RESAMPLE_CASE(S32)
     529        PSIMAGE_RESAMPLE_CASE(S64)
     530        PSIMAGE_RESAMPLE_CASE(F32)
     531        PSIMAGE_RESAMPLE_CASE(F64)
     532        PSIMAGE_RESAMPLE_CASE(C32)
     533        PSIMAGE_RESAMPLE_CASE(C64)
     534    default:
     535        psError(__func__,"Unsupported type (%d)",in->type.type);
     536        psFree(out);
     537        return NULL;
     538    }
     539
     540    return out;
     541}
    486542
    487543psImage* psImageRoll(psImage* out, const psImage* in, int dx, int dy)
     
    493549    if (in == NULL) {
    494550        psError(__func__,"Input image can not be NULL.");
     551        psFree(out);
    495552        return NULL;
    496553    }
     
    793850            PSIMAGE_ROTATE_ARBITRARY_LOOP(F64,MODE); \
    794851            break; \
     852        case PS_TYPE_C32: \
     853            PSIMAGE_ROTATE_ARBITRARY_LOOP(C32,MODE); \
     854            break; \
     855        case PS_TYPE_C64: \
     856            PSIMAGE_ROTATE_ARBITRARY_LOOP(C64,MODE); \
     857            break; \
    795858        default: \
    796859            psError(__func__,"Image type (%d) not supported",type); \
  • trunk/psLib/src/image/psImageManip.h

    r1250 r1260  
    1010 *  @author Ross Harman, MHPCC
    1111 *
    12  *  @version $Revision: 1.4 $ $Name: not supported by cvs2svn $
    13  *  @date $Date: 2004-07-21 23:39:10 $
     12 *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2004-07-22 20:02:56 $
    1414 *
    1515 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    105105);
    106106
     107psImage* psImageResample(
     108    psImage* out,                   ///< an psImage to recycle.  If NULL, a new image is created
     109    const psImage* in,              ///< input image
     110    int scale,
     111    psImageInterpolateMode mode
     112);
     113
    107114psImage* psImageRotate(
    108115    psImage* out,                   ///< an psImage to recycle.  If NULL, a new image is created
  • trunk/psLib/src/image/psImageStats.c

    r1251 r1260  
    400400    default: \
    401401        psError(__func__,"Unsupported interpolation mode (#%d)",mode); \
    402         return unexposedValue; \
    403402    } \
    404403    break
    405404
    406405    switch (input->type.type) {
     406        PSIMAGE_PIXEL_INTERPOLATE_CASE(U8);
     407        PSIMAGE_PIXEL_INTERPOLATE_CASE(U16);
     408        PSIMAGE_PIXEL_INTERPOLATE_CASE(U32);
     409        PSIMAGE_PIXEL_INTERPOLATE_CASE(U64);
     410        PSIMAGE_PIXEL_INTERPOLATE_CASE(S8);
     411        PSIMAGE_PIXEL_INTERPOLATE_CASE(S16);
     412        PSIMAGE_PIXEL_INTERPOLATE_CASE(S32);
     413        PSIMAGE_PIXEL_INTERPOLATE_CASE(S64);
    407414        PSIMAGE_PIXEL_INTERPOLATE_CASE(F32);
     415        PSIMAGE_PIXEL_INTERPOLATE_CASE(F64);
     416        PSIMAGE_PIXEL_INTERPOLATE_CASE(C32);
     417        PSIMAGE_PIXEL_INTERPOLATE_CASE(C64);
    408418    default:
    409419        psError(__func__,"Unsupported image datatype (%d)",input->type.type);
     
    434444}
    435445
     446#define PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(TYPE) \
     447inline psC64 p_psImagePixelInterpolateFLAT_##TYPE(const psImage *input, \
     448        float x, \
     449        float y, \
     450        psC64 unexposedValue) \
     451{ \
     452    int intX = (int) round((psF64)(x) - 0.5); \
     453    int intY = (int) round((psF64)(y) - 0.5); \
     454    int lastX = input->numCols - 1; \
     455    int lastY = input->numRows - 1; \
     456    \
     457    if ((intX < 0) || \
     458            (intX > lastX) || \
     459            (intY < 0) || \
     460            (intY > lastY)) { \
     461        return unexposedValue; \
     462    } \
     463    \
     464    return input->data.TYPE[intY][intX]; \
     465}
     466
    436467PSIMAGE_PIXEL_INTERPOLATE_FLAT(U8)
    437468PSIMAGE_PIXEL_INTERPOLATE_FLAT(U16)
     
    444475PSIMAGE_PIXEL_INTERPOLATE_FLAT(F32)
    445476PSIMAGE_PIXEL_INTERPOLATE_FLAT(F64)
     477PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C32)
     478PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C64)
    446479
    447480#define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(TYPE) \
     
    501534}
    502535
     536#define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(TYPE) \
     537inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE(const psImage *input, \
     538        float x, \
     539        float y, \
     540        psC64 unexposedValue) \
     541{ \
     542    double floorX = floor((psF64)(x) - 0.5); \
     543    double floorY = floor((psF64)(y) - 0.5); \
     544    double fracX = x - 0.5 - floorX; \
     545    double fracY = y - 0.5 - floorY; \
     546    int intFloorX = (int) floorX; \
     547    int intFloorY = (int) floorY; \
     548    int lastX = input->numCols - 1; \
     549    int lastY = input->numRows - 1; \
     550    double rx = 0.0; \
     551    psC64 pixel = 0.0; \
     552    ps##TYPE* currentRow; \
     553    ps##TYPE* nextRow; \
     554    \
     555    if ((intFloorX < 0) || \
     556            (intFloorX > lastX) || \
     557            (intFloorY < 0) || \
     558            (intFloorY > lastY)) { \
     559        return unexposedValue; \
     560    } \
     561    \
     562    currentRow = input->data.TYPE[intFloorY]; \
     563    if (intFloorY == lastY) { \
     564        pixel = currentRow[intFloorX]; \
     565        if (intFloorX < lastX) { \
     566            pixel+= fracY * (currentRow[intFloorX+1] - \
     567                             currentRow[intFloorX]); \
     568        } \
     569        return(pixel); \
     570    } \
     571    nextRow = input->data.TYPE[intFloorY+1]; \
     572    if (intFloorX == lastX) { \
     573        pixel = currentRow[intFloorX]; \
     574        if (intFloorY < lastY) { \
     575            pixel+= fracX * (nextRow[intFloorX] - \
     576                             currentRow[intFloorX]); \
     577        } \
     578        return(pixel); \
     579    } \
     580    \
     581    rx = currentRow[intFloorX] + \
     582         fracX * (currentRow[intFloorX+1] - \
     583                  currentRow[intFloorX]); \
     584    \
     585    pixel = rx + fracY * ((psF64)nextRow[intFloorX] + \
     586                          fracX * (nextRow[intFloorX+1] - \
     587                                   nextRow[intFloorX]) - rx); \
     588    \
     589    return(pixel); \
     590}
     591
    503592PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8)
    504593PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16)
     
    511600PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32)
    512601PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64)
    513 
     602PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C32)
     603PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C64)
     604
  • trunk/psLib/src/image/psImageStats.h

    r1251 r1260  
    1010 *  @author George Gusciora, MHPCC
    1111 *
    12  *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
    13  *  @date $Date: 2004-07-21 23:39:48 $
     12 *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2004-07-22 20:02:57 $
    1414 *
    1515 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    7676        float y, \
    7777        psF64 unexposedValue \
    78                                                      ); \
     78                                                     );
     79
     80#define p_psImagePixelInterpolateComplexFcns(TYPE) \
     81inline psC64 p_psImagePixelInterpolateFLAT_##TYPE( \
     82        const psImage *input, \
     83        float x, \
     84        float y, \
     85        psC64 unexposedValue \
     86                                                 ); \
     87inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE( \
     88        const psImage *input, \
     89        float x, \
     90        float y, \
     91        psC64 unexposedValue \
     92                                                     );
    7993
    8094p_psImagePixelInterpolateFcns(U8)
     
    88102p_psImagePixelInterpolateFcns(F32)
    89103p_psImagePixelInterpolateFcns(F64)
     104p_psImagePixelInterpolateComplexFcns(C32)
     105p_psImagePixelInterpolateComplexFcns(C64)
    90106
    91107#endif
  • trunk/psLib/src/imageops/psImageStats.c

    r1251 r1260  
    400400    default: \
    401401        psError(__func__,"Unsupported interpolation mode (#%d)",mode); \
    402         return unexposedValue; \
    403402    } \
    404403    break
    405404
    406405    switch (input->type.type) {
     406        PSIMAGE_PIXEL_INTERPOLATE_CASE(U8);
     407        PSIMAGE_PIXEL_INTERPOLATE_CASE(U16);
     408        PSIMAGE_PIXEL_INTERPOLATE_CASE(U32);
     409        PSIMAGE_PIXEL_INTERPOLATE_CASE(U64);
     410        PSIMAGE_PIXEL_INTERPOLATE_CASE(S8);
     411        PSIMAGE_PIXEL_INTERPOLATE_CASE(S16);
     412        PSIMAGE_PIXEL_INTERPOLATE_CASE(S32);
     413        PSIMAGE_PIXEL_INTERPOLATE_CASE(S64);
    407414        PSIMAGE_PIXEL_INTERPOLATE_CASE(F32);
     415        PSIMAGE_PIXEL_INTERPOLATE_CASE(F64);
     416        PSIMAGE_PIXEL_INTERPOLATE_CASE(C32);
     417        PSIMAGE_PIXEL_INTERPOLATE_CASE(C64);
    408418    default:
    409419        psError(__func__,"Unsupported image datatype (%d)",input->type.type);
     
    434444}
    435445
     446#define PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(TYPE) \
     447inline psC64 p_psImagePixelInterpolateFLAT_##TYPE(const psImage *input, \
     448        float x, \
     449        float y, \
     450        psC64 unexposedValue) \
     451{ \
     452    int intX = (int) round((psF64)(x) - 0.5); \
     453    int intY = (int) round((psF64)(y) - 0.5); \
     454    int lastX = input->numCols - 1; \
     455    int lastY = input->numRows - 1; \
     456    \
     457    if ((intX < 0) || \
     458            (intX > lastX) || \
     459            (intY < 0) || \
     460            (intY > lastY)) { \
     461        return unexposedValue; \
     462    } \
     463    \
     464    return input->data.TYPE[intY][intX]; \
     465}
     466
    436467PSIMAGE_PIXEL_INTERPOLATE_FLAT(U8)
    437468PSIMAGE_PIXEL_INTERPOLATE_FLAT(U16)
     
    444475PSIMAGE_PIXEL_INTERPOLATE_FLAT(F32)
    445476PSIMAGE_PIXEL_INTERPOLATE_FLAT(F64)
     477PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C32)
     478PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C64)
    446479
    447480#define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(TYPE) \
     
    501534}
    502535
     536#define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(TYPE) \
     537inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE(const psImage *input, \
     538        float x, \
     539        float y, \
     540        psC64 unexposedValue) \
     541{ \
     542    double floorX = floor((psF64)(x) - 0.5); \
     543    double floorY = floor((psF64)(y) - 0.5); \
     544    double fracX = x - 0.5 - floorX; \
     545    double fracY = y - 0.5 - floorY; \
     546    int intFloorX = (int) floorX; \
     547    int intFloorY = (int) floorY; \
     548    int lastX = input->numCols - 1; \
     549    int lastY = input->numRows - 1; \
     550    double rx = 0.0; \
     551    psC64 pixel = 0.0; \
     552    ps##TYPE* currentRow; \
     553    ps##TYPE* nextRow; \
     554    \
     555    if ((intFloorX < 0) || \
     556            (intFloorX > lastX) || \
     557            (intFloorY < 0) || \
     558            (intFloorY > lastY)) { \
     559        return unexposedValue; \
     560    } \
     561    \
     562    currentRow = input->data.TYPE[intFloorY]; \
     563    if (intFloorY == lastY) { \
     564        pixel = currentRow[intFloorX]; \
     565        if (intFloorX < lastX) { \
     566            pixel+= fracY * (currentRow[intFloorX+1] - \
     567                             currentRow[intFloorX]); \
     568        } \
     569        return(pixel); \
     570    } \
     571    nextRow = input->data.TYPE[intFloorY+1]; \
     572    if (intFloorX == lastX) { \
     573        pixel = currentRow[intFloorX]; \
     574        if (intFloorY < lastY) { \
     575            pixel+= fracX * (nextRow[intFloorX] - \
     576                             currentRow[intFloorX]); \
     577        } \
     578        return(pixel); \
     579    } \
     580    \
     581    rx = currentRow[intFloorX] + \
     582         fracX * (currentRow[intFloorX+1] - \
     583                  currentRow[intFloorX]); \
     584    \
     585    pixel = rx + fracY * ((psF64)nextRow[intFloorX] + \
     586                          fracX * (nextRow[intFloorX+1] - \
     587                                   nextRow[intFloorX]) - rx); \
     588    \
     589    return(pixel); \
     590}
     591
    503592PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8)
    504593PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16)
     
    511600PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32)
    512601PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64)
    513 
     602PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C32)
     603PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C64)
     604
  • trunk/psLib/src/imageops/psImageStats.h

    r1251 r1260  
    1010 *  @author George Gusciora, MHPCC
    1111 *
    12  *  @version $Revision: 1.5 $ $Name: not supported by cvs2svn $
    13  *  @date $Date: 2004-07-21 23:39:48 $
     12 *  @version $Revision: 1.6 $ $Name: not supported by cvs2svn $
     13 *  @date $Date: 2004-07-22 20:02:57 $
    1414 *
    1515 *  Copyright 2004 Maui High Performance Computing Center, University of Hawaii
     
    7676        float y, \
    7777        psF64 unexposedValue \
    78                                                      ); \
     78                                                     );
     79
     80#define p_psImagePixelInterpolateComplexFcns(TYPE) \
     81inline psC64 p_psImagePixelInterpolateFLAT_##TYPE( \
     82        const psImage *input, \
     83        float x, \
     84        float y, \
     85        psC64 unexposedValue \
     86                                                 ); \
     87inline psC64 p_psImagePixelInterpolateBILINEAR_##TYPE( \
     88        const psImage *input, \
     89        float x, \
     90        float y, \
     91        psC64 unexposedValue \
     92                                                     );
    7993
    8094p_psImagePixelInterpolateFcns(U8)
     
    88102p_psImagePixelInterpolateFcns(F32)
    89103p_psImagePixelInterpolateFcns(F64)
     104p_psImagePixelInterpolateComplexFcns(C32)
     105p_psImagePixelInterpolateComplexFcns(C64)
    90106
    91107#endif
Note: See TracChangeset for help on using the changeset viewer.