00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "HxImageSignature.h"
00012
00013 #ifndef HxImageData_h
00014 #define HxImageData_h
00015
00016 #include "HxValueType.h"
00017 #include "HxValue.h"
00018 #include "HxValueList.h"
00019 #include "HxPoint.h"
00020 #include "HxPointInt.h"
00021 #include "HxPointList.h"
00022 #include "HxSizes.h"
00023 #include "HxIncludedSigs.h"
00024 #include "HxByte.h"
00025 #include "HxString.h"
00026 #include "HxBorderType.h"
00027
00028
00029 #include "HxMatrix.h"
00030 #include "HxGeoIntType.h"
00031 #include "HxTagList.h"
00032
00033 #include "HxRcObject.h"
00034
00035 #undef min
00036 #undef max
00037
00038
00039
00040
00041
00042 class HxObjectObserver;
00043
00053 class HxImageData : public HxRcObject {
00054 public:
00055
00057
00059 HxImageData();
00060
00062 HxImageData(const HxImageData&);
00063
00065 virtual ~HxImageData();
00067
00069
00070 int ident() const;
00071 HxString name() const;
00072 void name(HxString s);
00073
00074 virtual int dimensionality() const = 0;
00075 virtual int dimensionSize(int i) const = 0;
00076 virtual HxSizes sizes() const = 0;
00077
00078 virtual int numberOfPixels() const = 0;
00079
00080 virtual int pixelDimensionality() const = 0;
00081 virtual HxValueType pixelType() const = 0;
00082 virtual int pixelPrecision() const = 0;
00083
00084 virtual HxImageSignature signature() const = 0;
00086
00088
00090 virtual void import(
00091 HxByte* data,
00092 HxTagList& tags = HxMakeTagList(),
00093 HxString importOp = "importPix") const;
00094 virtual void import(
00095 short* data,
00096 HxTagList& tags = HxMakeTagList(),
00097 HxString importOp = "importPix") const;
00098 virtual void import(
00099 int* data,
00100 HxTagList& tags = HxMakeTagList(),
00101 HxString importOp = "importPix") const;
00102 virtual void import(
00103 float* data,
00104 HxTagList& tags = HxMakeTagList(),
00105 HxString importOp = "importPix") const;
00106 virtual void import(
00107 double* data,
00108 HxTagList& tags = HxMakeTagList(),
00109 HxString importOp = "importPix") const;
00110 virtual void exportOp(
00111 HxByte* data, HxTagList& tags,
00112 HxString exportOp = "exportPix") const;
00113 virtual void exportOp(
00114 short* data, HxTagList& tags,
00115 HxString exportOp = "exportPix") const;
00116 virtual void exportOp(
00117 int* data, HxTagList& tags,
00118 HxString exportOp = "exportPix") const;
00119 virtual void exportOp(
00120 float* data, HxTagList& tags,
00121 HxString exportOp = "exportPix") const;
00122 virtual void exportOp(
00123 double* data, HxTagList& tags,
00124 HxString exportOp = "exportPix") const;
00125 virtual void inout(
00126 HxString inOutOp, HxTagList& tags) const;
00127 virtual void inout(
00128 void* data, HxString dataType,
00129 HxString inOutOp,
00130 HxTagList& tags) const;
00132
00134
00136 virtual void set(const HxValue val);
00137 virtual void set(const HxImageData* arg);
00138 virtual void set(int* pixels);
00139 virtual void set(HxByte* pixels);
00140 virtual void set(double* pixels) = 0;
00141
00142 void setPartImage(const HxImageData* src);
00143 void setPartImage(
00144 const HxImageData* src,
00145 HxTagList& tags);
00146 void setPartImage(
00147 const HxImageData* src,
00148 HxPointInt srcBegin,
00149 HxPointInt srcEnd, HxPointInt dstBegin);
00150 void setBorder(HxTagList& tags);
00151 void setBorder(
00152 HxSizes borderSize, HxTagList& tags,
00153 HxBorderType borderType = HXBORDERMIRROR);
00154 void setBorder(
00155 HxBorderType borderType,
00156 HxSizes borderSize,
00157 HxTagList& tags);
00158 void setBorder(
00159 HxSizes borderSize, HxValue val);
00160 void mirrorBorder(HxSizes borderSize);
00161 void propagateBorder(HxSizes borderSize);
00162
00164
00166
00168 virtual void unaryPixOp(
00169 HxImageData* src,
00170 HxString upoName, HxTagList& tags);
00171
00173 virtual void binaryPixOp(
00174 const HxImageData* arg1,
00175 const HxImageData* arg2,
00176 HxString bpoName, HxTagList& tags);
00177
00179 virtual void multiPixOp(
00180 HxImageData** args,
00181 const int nArgs,
00182 HxString mpoName, HxTagList& tags);
00183
00185 static void MNPixOp(
00186 HxImageData** results,
00187 const int resultCnt,
00188 HxImageData** args,
00189 const int argCnt,
00190 HxString mpoName, HxTagList& tags);
00191
00193 virtual void generalizedConvolution(
00194 const HxImageData* srcImg,
00195 const HxImageData* kerImg,
00196 HxString genMul, HxString genAdd,
00197 HxString kerName, HxTagList& tags);
00198
00202 virtual void generalizedConvolutionK1d(
00203 const HxImageData* srcImg,
00204 int dimension, const HxImageData* kerImg,
00205 HxString genMul, HxString genAdd,
00206 HxString kerName, HxTagList& tags);
00207
00209 virtual void neighbourhoodOp(
00210 const HxImageData* src, HxString ngbName,
00211 HxTagList& tags) = 0;
00212
00214 virtual void neighbourhoodOp(
00215 const HxImageData* src,
00216 const HxImageData* kernel,
00217 HxString ngbName, HxTagList& tags) = 0;
00218
00220 virtual void recursiveNeighOp(
00221 const HxImageData* srcImg,
00222 const HxImageData* kerData,
00223 HxString genMul, HxString genAdd,
00224 HxTagList& tags);
00225
00234 virtual void rgbOp(HxString rgbName, HxTagList& tags);
00236
00238
00240 virtual void geometricOp2d(const HxImageData* arg,
00241 HxMatrix func, HxGeoIntType gi,
00242 HxVec3Double translate,
00243 HxValue background) = 0;
00244 virtual void restrict(
00245 const HxImageData* arg, HxPoint begin);
00246 virtual void extend(
00247 const HxImageData* arg, HxPoint begin);
00248 virtual HxImageData* projectDomain(int dimension, int coordinate) =0;
00249 virtual void inverseProjectDomain(int dimension,
00250 int coordinate,
00251 const HxImageData* arg) = 0;
00253
00255
00257 virtual void getValues(
00258 HxPointListConstIter first,
00259 HxPointListConstIter last,
00260 HxValueListBackInserter) = 0;
00261 virtual HxValue sampleIdentMask(const HxImageData* mask,
00262 HxPoint p, HxSizes size, int label,
00263 HxString sFunc) = 0;
00264 virtual void sampleIdentMask(const HxImageData* mask,
00265 HxPoint p, HxSizes size, int label,
00266 HxString sFunc,
00267 HxValueListBackInserter res) = 0;
00268 virtual HxValue sampleWeightMask(const HxImageData* mask,
00269 HxPoint p, HxString sFunc) = 0;
00271
00273
00275 virtual void setAt(int x, int y, int z,
00276 const HxValue v) = 0;
00277 virtual HxValue getAt(int x, int y, int z) const = 0;
00278
00279 virtual HxRcObject* clone() const;
00280
00281 virtual void setPpmPixels(const HxByte* pixels);
00282 virtual void getPpmPixels(HxByte* pixels);
00283
00284
00285 virtual void getRgbPixels2d(int* pixels, HxString dispF,
00286 int bufWidth, int bufHeight,
00287 int VX, int VY, int VW, int VH,
00288 double SX, double SY, double scaleX,
00289 double scaleY, HxGeoIntType gi) const {}
00290
00291 virtual void getDoublePixels(double* pixels) = 0;
00292
00293 virtual STD_OSTREAM& printInfo(STD_OSTREAM &os,
00294 int doData = 0) const = 0;
00295
00296 static void setObjectObserver(const HxObjectObserver&);
00297
00298 static bool probeMNpo(
00299 const HxImageSignature resultsSig,
00300 const HxImageSignature argsSig,
00301 HxString mpoName, HxTagList& tags);
00303
00304
00306
00307 virtual void convertColor(
00308 HxVec3Double scale1,
00309 HxVec3Double gamma1,
00310 HxUpoVec3Double step1,
00311 HxUpoVec3Double step2,
00312 HxUpoVec3Double step3,
00313 HxVec3Double gamma2,
00314 HxVec3Double scale2) = 0;
00315
00316
00317 virtual HxImageData* projectRange(int dimension);
00318 virtual void inverseProjectRange(
00319 int dimension, const HxImageData* arg);
00320
00321 virtual void transpose(const HxImageData* src) = 0;
00323
00324
00325 void weight(double w);
00326 HxScalarDouble weight() const;
00327
00328 protected:
00329
00330 int checkEqualImageSig(HxString func,
00331 const HxImageData* arg);
00332 int checkEqualImageSizes(HxString func,
00333 const HxImageData* arg);
00334 int checkEqualImageSigAndSizes(HxString func,
00335 const HxImageData* arg);
00336 int checkLargerImageSigAndSizes(HxString func,
00337 const HxImageData* arg);
00338 int checkProperKernelSigAndSizes(HxString func,
00339 const HxImageData* kernel,
00340 int reqDim, int reqScalar,
00341 int appliedDim = 0);
00342
00343 int checkEqualImageSizesDim(HxString func,
00344 const HxImageData* arg, int dimension);
00345 int checkImageDimension(HxString func,
00346 int dim, int coord);
00347 int checkPixelDimension(HxString func, int dim);
00348 bool checkBorderSize(
00349 HxString funcName,
00350 HxSizes borderSize) const;
00351 HxSizes getProjectDomainSizes(int dimension) const;
00352
00353 private:
00354
00355 static int _nr;
00356 int _ident;
00357 HxString _name;
00358 double _weight;
00359
00360 static const HxObjectObserver* _objectObserver;
00361 };
00362
00363
00364
00365 #endif