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.73 $ $Name: rel9_0 $
00014  *  @date $Date: 2005/11/16 23:06:21 $
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->numCols = nr
00084                 #define P_PSIMAGE_SET_TYPE(img,t) *(psMathType*)&img->type = t
00085 
00086                         /** Basic image region structure.
00087                          *
00088                          * Struct for specifying a rectangular area in an image.
00089                          *
00090                          */
00091                         typedef struct
00092                         {
00093                             float x0;                         ///< the first column of the region.
00094                             float x1;                         ///< the last column of the region.
00095                             float y0;                         ///< the first row of the region.
00096                             float y1;                         ///< the last row of the region.
00097                         }
00098                         psRegion;
00099 
00100 /** Create an image of the specified size and type.
00101  *
00102  * Uses psLib memory allocation functions to create an image struct of the
00103  * specified size and type.
00104  *
00105  * @return psImage* : Pointer to psImage.
00106  *
00107  */
00108 psImage* psImageAlloc(
00109     int numCols,                       ///< Number of rows in image.
00110     int numRows,                       ///< Number of columns in image.
00111     psElemType type                    ///< Type of data for image.
00112 )
00113 ;
00114 
00115 /** Checks the type of a particular pointer.
00116  *
00117  *  Uses the appropriate deallocation function in psMemBlock to check the ptr datatype.
00118  *
00119  *  @return bool:       True if the pointer matches a psImage structure, false otherwise.
00120  */
00121 bool psMemCheckImage(
00122     psPtr ptr                          ///< the pointer whose type to check
00123 );
00124 
00125 
00126 /** Create a psRegion with the specified attributes.
00127  *
00128  *  @return psRegion : a cooresponding psRegion.
00129  */
00130 psRegion psRegionSet(
00131     float x0,                          ///< the first column of the region.
00132     float x1,                          ///< the last column of the region + 1.
00133     float y0,                          ///< the first row of the region.
00134     float y1                           ///< the last row of the region + 1.
00135 );
00136 
00137 /** Create a psRegion with the attribute values given as a string.
00138  *
00139  *  Create a psRegion with the attribute values given as a string.  The format
00140  *  shall be of the standard IRAF form '[x0:x1,y0:y1]'
00141  *
00142  *  @return psRegion:  A new psRegion struct, or NULL is not successful.
00143  */
00144 psRegion psRegionFromString(
00145     const char* region                 ///< image rectangular region in the form '[x0:x1,y0:y1]'
00146 );
00147 
00148 /** Create a string of the standard IRAF form '[x0:x1,y0:y1]' from a psRegion.
00149  *
00150  *  @return psString:  A new string representing the psRegion as text, or NULL
00151  *                  is not successful.
00152  */
00153 psString psRegionToString(
00154     const psRegion region              ///< the psRegion to convert to a string
00155 );
00156 
00157 /** Sets an actual region based on image parameters.
00158  *
00159  *  An image region defined with negative upper limits may be rationalized for the bounds of a
00160  *  specific image with psRegionForImage.  The output of this function is a region with negative
00161  *  upper limits replaced by their corrected value appropriate to the given image.  In addition,
00162  *  the lower and upper limits are foced to lie within the bounds of the image.  If the lower-
00163  *  limit coordinates are lewss than the lower bound of the image, they are limited to the lower
00164  *  bound of the image.  Conversely, if the upper-limit coordinates are greater than the upper
00165  *  bound of the image, they are truncated to define only valid pixels.  If the lower-limit
00166  *  coordinates are greater than the upper bounds of the image, or the upper-limit coordinates
00167  *  are less than the lower bounds of the image, the coordinates should saturate on those limits.
00168  *
00169  *  @return psRegion:       A region with negative upper limits replaced by the corrected
00170  */
00171 psRegion psRegionForImage(
00172     psImage *image,                    ///< the image for which the region is to be set
00173     psRegion in                        ///< the image region limits
00174 );
00175 
00176 /** Defines a region corresponding to the square with center at coordinate x,y
00177  *  and with coderadius.  The width of the square is 2radius + 1.
00178  *
00179  *  @return psRegion:       the newly defined psRegion.
00180  */
00181 psRegion psRegionForSquare(
00182     double x,                           ///< x coordinate at square-center
00183     double y,                           ///< y coordinate at square-center
00184     double radius                       ///< radius of square
00185 );
00186 
00187 /** Initializes the image with the given value.
00188  *
00189  *  The input data is cast to match the image datatype.
00190  *
00191  *  @return bool:       True on success, otherwise false.
00192  */
00193 bool psImageInit(
00194     psImage *image,                    ///< the image to be initialized
00195     ...                                ///< Variable argument list for initialization
00196 );
00197 
00198 /** Sets the value of the image at the specified x,y position to value.
00199  *
00200  *  A negative value for the x or y positions means index from the end.
00201  *
00202  *  @return bool:       True on success, otherwise false.
00203  */
00204 bool psImageSet(
00205     const psImage *image,              ///< the image to set
00206     int x,                             ///< x-position
00207     int y,                             ///< y-position
00208     complex value                      ///< specified value to set
00209 );
00210 
00211 /** Returns the value of the image at the specified x,y position.
00212  *
00213  *  A negative value for the x or y positions means index from the end.
00214  *
00215  *  @return complex:        The value at the specified x,y position.
00216  */
00217 complex psImageGet(
00218     const psImage *image,              ///< the image from which to get
00219     int x,                             ///< x-position
00220     int y                              ///< y-position
00221 );
00222 
00223 /** Resize a given image to the given size/type.
00224  *
00225  *  @return psImage* Resized psImage.
00226  */
00227 psImage* psImageRecycle(
00228     psImage* old,                      ///< the psImage to recycle by resizing image buffer
00229     int numCols,                       ///< the desired number of columns in image
00230     int numRows,                       ///< the desired number of rows in image
00231     const psElemType type              ///< the desired datatype of the image
00232 );
00233 
00234 /** Copy an image to a new buffer
00235  *
00236  *  @return True if image copied or false if error
00237  */
00238 bool p_psImageCopyToRawBuffer(
00239     void* buffer,                      ///< the buffer used to copy the image
00240     const psImage* input,              ///< the input image to be copied
00241     psElemType type                    ///< the datatype of the image to be copied
00242 );
00243 
00244 /** Frees all children of a psImage.
00245  *
00246  *  @return int      Number of children freed.
00247  */
00248 int psImageFreeChildren(
00249     psImage* image                     ///< psImage in which all children shall be deallocated
00250 );
00251 
00252 /** get an element of an image as a psF64.
00253  *
00254  *  @return psF64   pixel value at specified location
00255  */
00256 psF64 p_psImageGetElementF64(
00257     psImage* image,                    ///< input image
00258     int col,                           ///< pixel column
00259     int row                            ///< pixel row
00260 );
00261 
00262 /** print image pixel values.
00263  *
00264  *  @return bool    TRUE is successful, otherwise FALSE.
00265  */
00266 bool p_psImagePrint(
00267     int fd,                            ///< Destination file descriptor
00268     psImage *a,                        ///< image to print
00269     char *name                         ///< name of the image (for title)
00270 );
00271 
00272 /** Interpolate image pixel value given floating point coordinates.
00273  *
00274  *  @return psF32    Pixel value interpolated from image or unexposedValue if
00275  *                   given x,y doesn't coorespond to a valid image location
00276  */
00277 complex psImagePixelInterpolate(
00278     const psImage* input,              ///< input image for interpolation
00279     float x,                           ///< column location to derive value of
00280     float y,                           ///< row location ot derive value of
00281     const psImage* mask,               ///< if not NULL, the mask of the input image
00282     psMaskType maskVal,                ///< the mask value
00283     complex unexposedValue,            ///< return value if x,y location is not in image.
00284     psImageInterpolateMode mode        ///< interpolation mode
00285 );
00286 
00287 #define PIXEL_INTERPOLATE_FCN_PROTOTYPE(SUFFIX, RETURNTYPE) \
00288 inline RETURNTYPE p_psImagePixelInterpolate##SUFFIX( \
00289         const psImage* input,          /**< input image for interpolation */ \
00290         float x,                       /**< column location to derive value of */ \
00291         float y,                       /**< row location ot derive value of */ \
00292         const psImage* mask,           /**< if not NULL, the mask of the input image */ \
00293         psU32 maskVal,                 /**< the mask value */ \
00294         RETURNTYPE unexposedValue      /**< return value if x,y location is not in image. */ \
00295                                                    );
00296 
00297 #define PIXEL_INTERPOLATE_FCNS(MODE) \
00298 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U8,psF64)  \
00299 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U16,psF64) \
00300 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U32,psF64) \
00301 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_U64,psF64) \
00302 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S8,psF64)  \
00303 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S16,psF64) \
00304 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S32,psF64) \
00305 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_S64,psF64) \
00306 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_F32,psF64) \
00307 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_F64,psF64) \
00308 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_C32,psC64) \
00309 PIXEL_INTERPOLATE_FCN_PROTOTYPE(MODE##_C64,psC64)
00310 
00311 #ifndef SWIG
00312 PIXEL_INTERPOLATE_FCNS(FLAT)
00313 PIXEL_INTERPOLATE_FCNS(BILINEAR)
00314 PIXEL_INTERPOLATE_FCNS(BILINEAR_VARIANCE)
00315 #endif // ! SWIG
00316 
00317 #undef PIXEL_INTERPOLATE_FCN_PROTOTYPE
00318 #undef PIXEL_INTERPOLATE_FCNS
00319 
00320 /// @}
00321 
00322 #endif // PS_IMAGE_H

Generated on Tue Dec 6 17:18:42 2005 for Pan-STARRS Foundation Library by  doxygen 1.4.2