IPP Software Navigation Tools IPP Links Communication Pan-STARRS Links

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

moved image pixel interpolation from the psImageStats.[ch] to psImage.[ch] (logical reclassification)

File:
1 edited

Legend:

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

    r1260 r1261  
    369369    return(0);
    370370}
    371 
    372 /*****************************************************************************
    373 p_psImagePixelInterpolation(image, x, y): this routine takes as input an
    374 image and coordinates (x, y) and produces as output the corresponding pixel
    375 value at the those coordinates.  For fractional corrdinates (x, y), 2-D
    376 linear interpolation is performed on the image.
    377  *****************************************************************************/
    378 psF32 psImagePixelInterpolate(
    379     const psImage *input,
    380     float x,
    381     float y,
    382     psF32 unexposedValue,
    383     psImageInterpolateMode mode)
    384 {
    385 
    386     if (input == NULL) {
    387         psError(__func__,"Image can not be NULL.");
    388         return unexposedValue;
    389     }
    390 
    391     #define PSIMAGE_PIXEL_INTERPOLATE_CASE(TYPE) \
    392 case PS_TYPE_##TYPE: \
    393     switch (mode) { \
    394     case PS_INTERPOLATE_FLAT: \
    395         return p_psImagePixelInterpolateFLAT_##TYPE(input,x,y,unexposedValue); \
    396         break; \
    397     case PS_INTERPOLATE_BILINEAR: \
    398         return p_psImagePixelInterpolateBILINEAR_##TYPE(input,x,y,unexposedValue); \
    399         break; \
    400     default: \
    401         psError(__func__,"Unsupported interpolation mode (#%d)",mode); \
    402     } \
    403     break
    404 
    405     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);
    414         PSIMAGE_PIXEL_INTERPOLATE_CASE(F32);
    415         PSIMAGE_PIXEL_INTERPOLATE_CASE(F64);
    416         PSIMAGE_PIXEL_INTERPOLATE_CASE(C32);
    417         PSIMAGE_PIXEL_INTERPOLATE_CASE(C64);
    418     default:
    419         psError(__func__,"Unsupported image datatype (%d)",input->type.type);
    420     }
    421 
    422     return unexposedValue;
    423 }
    424 
    425 #define PSIMAGE_PIXEL_INTERPOLATE_FLAT(TYPE) \
    426 inline psF64 p_psImagePixelInterpolateFLAT_##TYPE(const psImage *input, \
    427         float x, \
    428         float y, \
    429         psF64 unexposedValue) \
    430 { \
    431     int intX = (int) round((psF64)(x) - 0.5); \
    432     int intY = (int) round((psF64)(y) - 0.5); \
    433     int lastX = input->numCols - 1; \
    434     int lastY = input->numRows - 1; \
    435     \
    436     if ((intX < 0) || \
    437             (intX > lastX) || \
    438             (intY < 0) || \
    439             (intY > lastY)) { \
    440         return unexposedValue; \
    441     } \
    442     \
    443     return input->data.TYPE[intY][intX]; \
    444 }
    445 
    446 #define PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(TYPE) \
    447 inline 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 
    467 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U8)
    468 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U16)
    469 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U32)
    470 PSIMAGE_PIXEL_INTERPOLATE_FLAT(U64)
    471 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S8)
    472 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S16)
    473 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S32)
    474 PSIMAGE_PIXEL_INTERPOLATE_FLAT(S64)
    475 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F32)
    476 PSIMAGE_PIXEL_INTERPOLATE_FLAT(F64)
    477 PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C32)
    478 PSIMAGE_PIXEL_INTERPOLATE_FLAT_COMPLEX(C64)
    479 
    480 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(TYPE) \
    481 inline psF64 p_psImagePixelInterpolateBILINEAR_##TYPE(const psImage *input, \
    482         float x, \
    483         float y, \
    484         psF64 unexposedValue) \
    485 { \
    486     double floorX = floor((psF64)(x) - 0.5); \
    487     double floorY = floor((psF64)(y) - 0.5); \
    488     double fracX = x - 0.5 - floorX; \
    489     double fracY = y - 0.5 - floorY; \
    490     int intFloorX = (int) floorX; \
    491     int intFloorY = (int) floorY; \
    492     int lastX = input->numCols - 1; \
    493     int lastY = input->numRows - 1; \
    494     double rx = 0.0; \
    495     psF64 pixel = 0.0; \
    496     ps##TYPE* currentRow; \
    497     ps##TYPE* nextRow; \
    498     \
    499     if ((intFloorX < 0) || \
    500             (intFloorX > lastX) || \
    501             (intFloorY < 0) || \
    502             (intFloorY > lastY)) { \
    503         return unexposedValue; \
    504     } \
    505     \
    506     currentRow = input->data.TYPE[intFloorY]; \
    507     if (intFloorY == lastY) { \
    508         pixel = currentRow[intFloorX]; \
    509         if (intFloorX < lastX) { \
    510             pixel+= fracY * ((psF64)currentRow[intFloorX+1] - \
    511                              (psF64)currentRow[intFloorX]); \
    512         } \
    513         return(pixel); \
    514     } \
    515     nextRow = input->data.TYPE[intFloorY+1]; \
    516     if (intFloorX == lastX) { \
    517         pixel = currentRow[intFloorX]; \
    518         if (intFloorY < lastY) { \
    519             pixel+= fracX * ((psF64)nextRow[intFloorX] - \
    520                              (psF64)currentRow[intFloorX]); \
    521         } \
    522         return(pixel); \
    523     } \
    524     \
    525     rx = currentRow[intFloorX] + \
    526          fracX * ((psF64)currentRow[intFloorX+1] - \
    527                   (psF64)currentRow[intFloorX]); \
    528     \
    529     pixel = rx + fracY * ((psF64)nextRow[intFloorX] + \
    530                           fracX * ((psF64)nextRow[intFloorX+1] - \
    531                                    (psF64)nextRow[intFloorX]) - rx); \
    532     \
    533     return(pixel); \
    534 }
    535 
    536 #define PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(TYPE) \
    537 inline 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 
    592 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U8)
    593 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U16)
    594 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U32)
    595 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(U64)
    596 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S8)
    597 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S16)
    598 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S32)
    599 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(S64)
    600 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F32)
    601 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR(F64)
    602 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C32)
    603 PSIMAGE_PIXEL_INTERPOLATE_BILINEAR_COMPLEX(C64)
    604 
Note: See TracChangeset for help on using the changeset viewer.