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
1.4.2