Main Page | Modules | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals

psImage.h

Go to the documentation of this file.
00001 /** @file  psImage.h
00002  *
00003  *  @brief Contains basic image definitions and operations
00004  *
00005  *  This file defines the basic type for an image struct and functions useful
00006  *  in manupulating images.
00007  *
00008  *  @ingroup Image
00009  *
00010  *  @author Robert DeSonia, MHPCC
00011  *  @author Ross Harman, MHPCC
00012  *
00013  *  @version $Revision: 1.80 $ $Name: rel12 $
00014  *  @date $Date: 2006/06/30 02:20:06 $
00015  *
00016  *  Copyright 2004-2005 Maui High Performance Computing Center, University of Hawaii
00017  */
00018 #ifndef PS_IMAGE_H
00019 #define PS_IMAGE_H
00020 
00021 #include <complex.h>
00022 #include <stdio.h>
00023 #include "psType.h"
00024 #include "psArray.h"
00025 #include "psConstants.h"
00026 
00027 /// @addtogroup Image
00028 /// @{
00029 
00030 /** enumeration of options in interpolation
00031  *
00032  */
00033 typedef enum {
00034     PS_INTERPOLATE_FLAT,               ///< 'flat' interpolation (nearest pixel)
00035     PS_INTERPOLATE_BILINEAR,           ///< bi-linear interpolation
00036     PS_INTERPOLATE_LANCZOS2,           ///< Sinc interpolation with 4x4 pixel kernel
00037     PS_INTERPOLATE_LANCZOS3,           ///< Sinc interpolation with 6x6 pixel kernel
00038     PS_INTERPOLATE_LANCZOS4,           ///< Sinc interpolation with 8x8 pixel kernel
00039     PS_INTERPOLATE_BILINEAR_VARIANCE,  ///< Variance version of PS_INTERPOLATE_BILINEAR
00040     PS_INTERPOLATE_LANCZOS2_VARIANCE,  ///< Variance version of PS_INTERPOLATE_LANCZOS2
00041     PS_INTERPOLATE_LANCZOS3_VARIANCE,  ///< Variance version of PS_INTERPOLATE_LANCZOS3
00042     PS_INTERPOLATE_LANCZOS4_VARIANCE   ///< Variance version of PS_INTERPOLATE_LANCZOS4
00043     //    PS_INTERPOLATE_NUM_MODES           ///< enum end-marker; does not coorespond to a interpolation mode
00044 } psImageInterpolateMode;
00045 
00046 /** Basic image data structure.
00047  *
00048  * Struct for maintaining image data of varying types. It also contains
00049  * information about image size, parent images and children images.
00050  *
00051  */
00052 typedef struct psImage
00053 {
00054     const psMathType type;             ///< Image data type and dimension.
00055     const int numCols;                 ///< Number of columns in image
00056     const int numRows;                 ///< Number of rows in image.
00057     int col0;                          ///< Column position relative to parent.
00058     int row0;                          ///< Row position relative to parent.
00059 
00060     union {
00061         psS8**  S8;                    ///< Signed 8-bit integer data.
00062         psS16** S16;                   ///< Signed 16-bit integer data.
00063         psS32** S32;                   ///< Signed 32-bit integer data.
00064         psS64** S64;                   ///< Signed 64-bit integer data.
00065         psU8**  U8;                    ///< Unsigned 8-bit integer data.
00066         psU16** U16;                   ///< Unsigned 16-bit integer data.
00067         psU32** U32;                   ///< Unsigned 32-bit integer data.
00068         psU64** U64;                   ///< Unsigned 64-bit integer data.
00069         psF32** F32;                   ///< Single-precision float data.
00070         psF64** F64;                   ///< Double-precision float data.
00071         psC32** C32;                   ///< Single-precision complex data.
00072         psC64** C64;                   ///< Double-precision complex data.
00073         psPtr*  V;                     ///< Pointer to data.
00074     } data;                            ///< Union for data types.
00075     const struct psImage* parent;      ///< Parent, if a subimage.
00076     psPtr p_rawDataBuffer;             ///< Raw data buffer for Allocating/Freeing Images; private
00077     psArray* children;                 ///< Children of this region.
00078     void *lock;                        ///< Optional lock for thread safety
00079 }
00080 psImage;
00081 
00082 #define P_PSIMAGE_SET_NUMCOLS(img,nc) {*(int*)&img->numCols = nc;}
00083 #define P_PSIMAGE_SET_NUMROWS(img,nr) {*(int*)&img->numRows = nr;}
00084 #define P_PSIMAGE_SET_TYPE(img,t) {*(psMathType*)&img->type = t;}
00085 
00086 /** Create an image of the specified size and type.
00087  *
00088  * Uses psLib memory allocation functions to create an image struct of the
00089  * specified size and type.
00090  *
00091  * @return psImage* : Pointer to psImage.
00092  *
00093  */
00094 psImage* psImageAlloc(
00095     int numCols,                       ///< Number of columns in image.
00096     int numRows,                       ///< Number of rows in image.
00097     psElemType type                    ///< Type of data for image.
00098 )
00099 ;
00100 
00101 /** Checks the type of a particular pointer.
00102  *
00103  *  Uses the appropriate deallocation function in psMemBlock to check the ptr datatype.
00104  *
00105  *  @return bool:       True if the pointer matches a psImage structure, false otherwise.
00106  */
00107 bool psMemCheckImage(
00108     psPtr ptr                          ///< the pointer whose type to check
00109 );
00110 
00111 /** Initializes the image with the given value.
00112  *
00113  *  The input data is cast to match the image datatype.
00114  *
00115  *  @return bool:       True on success, otherwise false.
00116  */
00117 bool psImageInit(
00118     psImage *image,                    ///< the image to be initialized
00119     ...                                ///< Variable argument list for initialization
00120 );
00121 
00122 /** Sets the value of the image at the specified x,y position to value.
00123  *
00124  *  A negative value for the x or y positions means index from the end.
00125  *
00126  *  @return bool:       True on success, otherwise false.
00127  */
00128 bool psImageSet(
00129     psImage *image,                     ///< the image to set
00130     int x,                             ///< x-position
00131     int y,                             ///< y-position
00132     double complex value               ///< specified value to set
00133 );
00134 
00135 /** Returns the value of the image at the specified x,y position.
00136  *
00137  *  A negative value for the x or y positions means index from the end.
00138  *
00139  *  @return complex: The value at the specified x,y position.
00140  */
00141 double complex psImageGet(
00142     const psImage *image,              ///< the image from which to get
00143     int x,                             ///< x-position
00144     int y                              ///< y-position
00145 );
00146 
00147 /** Resize a given image to the given size/type.
00148  *
00149  *  @return psImage* Resized psImage.
00150  */
00151 psImage* psImageRecycle(
00152     psImage* old,                      ///< the psImage to recycle by resizing image buffer
00153     int numCols,                       ///< the desired number of columns in image
00154     int numRows,                       ///< the desired number of rows in image
00155     const psElemType type              ///< the desired datatype of the image
00156 );
00157 
00158 /** Copy an image to a new buffer
00159  *
00160  *  @return True if image copied or false if error
00161  */
00162 bool p_psImageCopyToRawBuffer(
00163     void* buffer,                      ///< the buffer used to copy the image
00164     const psImage* input,              ///< the input image to be copied
00165     psElemType type                    ///< the datatype of the image to be copied
00166 );
00167 
00168 /** Frees all children of a psImage.
00169  *
00170  *  @return int      Number of children freed.
00171  */
00172 int psImageFreeChildren(
00173     psImage* image                     ///< psImage in which all children shall be deallocated
00174 );
00175 
00176 /** get an element of an image as a psF64.
00177  *
00178  *  @return psF64   pixel value at specified location
00179  */
00180 psF64 p_psImageGetElementF64(
00181     psImage* image,                    ///< input image
00182     int col,                           ///< pixel column
00183     int row                            ///< pixel row
00184 );
00185 
00186 /** print image pixel values.
00187  *
00188  *  @return bool    TRUE is successful, otherwise FALSE.
00189  */
00190 bool p_psImagePrint(
00191     int fd,                            ///< Destination file descriptor
00192     psImage *a,                        ///< image to print
00193     char *name                         ///< name of the image (for title)
00194 );
00195 
00196 /** Interpolate image pixel value given floating point coordinates.
00197  *
00198  *  @return complex    Pixel value interpolated from image or unexposedValue if
00199  *                   given x,y doesn't coorespond to a valid image location
00200  */
00201 double complex psImagePixelInterpolate(
00202     const psImage* input,              ///< input image for interpolation
00203     float x,                           ///< column location to derive value of
00204     float y,                           ///< row location ot derive value of
00205     const psImage* mask,               ///< if not NULL, the mask of the input image
00206     psMaskType maskVal,                ///< the mask value
00207     double complex unexposedValue,            ///< return value if x,y location is not in image.
00208     psImageInterpolateMode mode        ///< interpolation mode
00209 );
00210 
00211 #define PIXEL_INTERPOLATE_FCN_PROTOTYPE(SUFFIX, RETURNTYPE) \
00212 inline RETURNTYPE p_psImagePixelInterpolate##SUFFIX( \
00213         const psImage* input,          /**< input image for interpolation */ \
00214         float x,                       /**< column location to derive value of */ \
00215         float y,                       /**< row location ot derive value of */ \
00216         const psImage* mask,           /**< if not NULL, the mask of the input image */ \
00217         psU32 maskVal,                 /**< the mask value */ \
00218         RETURNTYPE unexposedValue      /**< return value if x,y location is not in image. */ \
00219                                                    );
00220 
00221 #define PIXEL_INTERPOLATE_FCNS(MODE) \
00222 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U8,psF64)  \
00223 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U16,psF64) \
00224 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U32,psF64) \
00225 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U64,psF64) \
00226 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S8,psF64)  \
00227 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S16,psF64) \
00228 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S32,psF64) \
00229 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S64,psF64) \
00230 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_F32,psF64) \
00231 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_F64,psF64) \
00232 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_C32,psC64) \
00233 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_C64,psC64)
00234 
00235 #ifndef SWIG
00236 PIXEL_INTERPOLATE_FCNS(FLAT)
00237 PIXEL_INTERPOLATE_FCNS(BILINEAR)
00238 PIXEL_INTERPOLATE_FCNS(BILINEAR_VARIANCE)
00239 #endif // ! SWIG
00240 
00241 #undef PIXEL_INTERPOLATE_FCN_PROTOTYPE
00242 #undef PIXEL_INTERPOLATE_FCNS
00243 
00244 /*****************************************************************************
00245     PS_IMAGE macros:
00246 *****************************************************************************/
00247 #define PS_ASSERT_IMAGE_NON_NULL(NAME, RVAL) PS_ASSERT_GENERAL_IMAGE_NON_NULL(NAME, return RVAL)
00248 #define PS_ASSERT_GENERAL_IMAGE_NON_NULL(NAME, CLEANUP) \
00249 if ((NAME) == NULL || (NAME)->data.V == NULL) { \
00250     psError(PS_ERR_BAD_PARAMETER_NULL, true, \
00251             "Unallowable operation: psImage %s or its data is NULL.", \
00252             #NAME); \
00253     CLEANUP; \
00254 }
00255 
00256 #define PS_ASSERT_IMAGE_NON_EMPTY(NAME, RVAL) PS_ASSERT_GENERAL_IMAGE_NON_EMPTY(NAME, return RVAL)
00257 #define PS_ASSERT_GENERAL_IMAGE_NON_EMPTY(NAME, CLEANUP) \
00258 if ((NAME)->numCols < 1 || (NAME)->numRows < 1) { \
00259     psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
00260             "Unallowable operation: psImage %s has zero rows or columns (%dx%d).", \
00261             #NAME, (NAME)->numCols, (NAME)->numRows); \
00262     CLEANUP; \
00263 }
00264 
00265 #define PS_ASSERT_IMAGE_TYPE(NAME, TYPE, RVAL) \
00266 if ((NAME)->type.type != TYPE) { \
00267     psError(PS_ERR_BAD_PARAMETER_TYPE, true, \
00268             "Unallowable operation: psImage %s has incorrect type.", \
00269             #NAME); \
00270     return(RVAL); \
00271 }
00272 
00273 #define PS_ASSERT_IMAGES_SIZE_EQUAL(NAME1, NAME2, RVAL) \
00274 if (((NAME1)->numCols != (NAME2)->numCols) || \
00275         ((NAME1)->numRows != (NAME2)->numRows)) { \
00276     psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
00277             "Unallowable operation: psImages %s and %s are not the same size.", \
00278             #NAME1, #NAME2); \
00279     return(RVAL); \
00280 }
00281 
00282 #define PS_ASSERT_IMAGE_SIZE(NAME1, NUM_COLS, NUM_ROWS, RVAL) \
00283 if (((NAME1)->numCols != NUM_COLS) || \
00284         ((NAME1)->numRows != NUM_ROWS)) { \
00285     psError(PS_ERR_BAD_PARAMETER_SIZE, true, \
00286             "Unallowable operation: psImages %s is not the correct size.", \
00287             #NAME1); \
00288     return(RVAL); \
00289 }
00290 
00291 #define PS_IMAGE_PRINT_F32(NAME) \
00292 printf("======== printing %s ========\n", #NAME); \
00293 for (int i = 0 ; i < (NAME)->numRows ; i++) { \
00294     for (int j = 0 ; j < (NAME)->numCols ; j++) { \
00295         printf("%.2f ", (NAME)->data.F32[i][j]); \
00296     } \
00297     printf("\n"); \
00298 }\
00299 
00300 #define PS_IMAGE_PRINT_F64(NAME) \
00301 printf("======== printing %s ========\n", #NAME); \
00302 for (int i = 0 ; i < (NAME)->numRows ; i++) { \
00303     for (int j = 0 ; j < (NAME)->numCols ; j++) { \
00304         printf("%.2f ", (NAME)->data.F64[i][j]); \
00305     } \
00306     printf("\n"); \
00307 }\
00308 
00309 /// @}
00310 
00311 #endif // PS_IMAGE_H

Generated on Mon Jul 3 14:13:44 2006 for Pan-STARRS Foundation Library by  doxygen 1.4.4