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
00071 int ident() const;
00073 HxString name() const;
00075 void name(HxString s);
00076
00078 virtual int dimensionality() const = 0;
00080 virtual int dimensionSize(int i) const = 0;
00082 virtual HxSizes sizes() const = 0;
00083
00085 virtual int numberOfPixels() const = 0;
00086
00088 virtual int pixelDimensionality() const = 0;
00090 virtual HxValueType pixelType() const = 0;
00092 virtual int pixelPrecision() const = 0;
00093
00095 virtual HxImageSignature signature() const = 0;
00097
00099
00102 virtual void import(
00103 HxByte* data,
00104 HxTagList& tags = HxMakeTagList(),
00105 HxString importOp = "importPix");
00107 virtual void import(
00108 short* data,
00109 HxTagList& tags = HxMakeTagList(),
00110 HxString importOp = "importPix");
00112 virtual void import(
00113 int* data,
00114 HxTagList& tags = HxMakeTagList(),
00115 HxString importOp = "importPix");
00117 virtual void import(
00118 float* data,
00119 HxTagList& tags = HxMakeTagList(),
00120 HxString importOp = "importPix");
00122 virtual void import(
00123 double* data,
00124 HxTagList& tags = HxMakeTagList(),
00125 HxString importOp = "importPix");
00127 virtual void exportOp(
00128 HxByte* data, HxTagList& tags,
00129 HxString exportOp = "exportPix");
00131 virtual void exportOp(
00132 short* data, HxTagList& tags,
00133 HxString exportOp = "exportPix");
00135 virtual void exportOp(
00136 int* data, HxTagList& tags,
00137 HxString exportOp = "exportPix");
00139 virtual void exportOp(
00140 float* data, HxTagList& tags,
00141 HxString exportOp = "exportPix");
00143 virtual void exportOp(
00144 double* data, HxTagList& tags,
00145 HxString exportOp = "exportPix");
00147 virtual void inout(
00148 void* data, HxString dataType,
00149 HxString inOutOp,
00150 HxTagList& tags);
00151
00153 virtual void inout(
00154 HxString inOutOp, HxTagList& tags);
00155
00157 virtual void exportExtra(
00158 HxString exportOp,
00159 HxImageData* extraIm,
00160 HxTagList& tags);
00162
00164
00166 virtual void set(const HxValue val);
00167 virtual void set(HxImageData* arg);
00168 virtual void set(int* pixels);
00169 virtual void set(HxByte* pixels);
00170 virtual void set(double* pixels) = 0;
00171
00172 void setPartImage(HxImageData* src);
00173
00175 void setPartImage(
00176 HxImageData* src,
00177 HxTagList& tags);
00178 void setPartImage(
00179 HxImageData* src,
00180 HxPointInt srcBegin,
00181 HxPointInt srcEnd, HxPointInt dstBegin);
00182
00184 void setBorder(HxTagList& tags);
00185
00186 void setBorder(
00187 HxSizes borderSize, HxTagList& tags,
00188 HxBorderType borderType = HXBORDERMIRROR);
00189 void setBorder(
00190 HxBorderType borderType,
00191 HxSizes borderSize,
00192 HxTagList& tags);
00193 void setBorder(
00194 HxSizes borderSize, HxValue val);
00195 void mirrorBorder(HxSizes borderSize);
00196 void propagateBorder(HxSizes borderSize);
00197
00199
00201
00203 virtual void unaryPixOp(
00204 HxImageData* src,
00205 HxString upoName, HxTagList& tags);
00206
00208 virtual void binaryPixOp(
00209 HxImageData* arg1,
00210 HxImageData* arg2,
00211 HxString bpoName, HxTagList& tags);
00212
00214 virtual void multiPixOp(
00215 HxImageData** args,
00216 int nArgs,
00217 HxString mpoName, HxTagList& tags);
00218
00220 static void MNPixOp(
00221 HxImageData** results,
00222 int resultCnt,
00223 HxImageData** args,
00224 int argCnt,
00225 HxString mpoName, HxTagList& tags);
00226
00228 virtual void generalizedConvolution(
00229 HxImageData* srcImg,
00230 HxImageData* kerImg,
00231 HxString genMul, HxString genAdd,
00232 HxString kerName, HxTagList& tags);
00233
00237 virtual void generalizedConvolutionK1d(
00238 HxImageData* srcImg,
00239 int dimension, HxImageData* kerImg,
00240 HxString genMul, HxString genAdd,
00241 HxString kerName, HxTagList& tags);
00242
00246 virtual void genConvSeparated(
00247 HxImageData* srcImg, int dimension,
00248 HxImageData* kerImg1, HxImageData* kerImg2,
00249 HxString genMul, HxString genAdd,
00250 HxString kerName, HxTagList& tags);
00251
00255 virtual void genConv2dSep(
00256 HxImageData* srcImg,
00257 HxImageData* kerImg1, HxImageData* kerImg2,
00258 HxString genMul, HxString genAdd,
00259 HxString kerName, HxTagList& tags);
00260
00264 virtual void genConv3dSep(
00265 HxImageData* srcImg, HxImageData* kerImg1,
00266 HxImageData* kerImg2, HxImageData* kerImg3,
00267 HxString genMul, HxString genAdd,
00268 HxString kerName, HxTagList& tags);
00269
00271 virtual void recGenConv(
00272 HxImageData* srcImg,
00273 HxImageData* kerImg,
00274 HxString genMul, HxString genAdd,
00275 HxTagList& tags);
00276
00279 virtual void recGenConv2dSep(
00280 HxImageData* srcImg,
00281 HxImageData* kerImg1,
00282 HxImageData* kerImg2,
00283 HxString genMul, HxString genAdd,
00284 HxTagList& tags);
00285
00287 virtual void neighbourhoodOp(
00288 HxImageData* src, HxString ngbName,
00289 HxTagList& tags);
00290
00292 virtual void neighbourhoodOpExtra(
00293 HxImageData* src, HxImageData* extraIm,
00294 HxString ngbName, HxTagList& tags);
00295
00297 virtual void neighbourhoodOpExtra2(
00298 HxImageData* src,
00299 HxImageData* extraIm, HxImageData* extraIm2,
00300 HxString ngbName, HxTagList& tags);
00301
00303 virtual void neighbourhoodOp(
00304 HxImageData* src,
00305 HxImageData* kernel,
00306 HxString ngbName, HxTagList& tags);
00307
00309 virtual void queueBasedOp(
00310 HxImageData* srcImg,
00311 HxImageData* kerImg,
00312 HxString genOp,
00313 HxTagList& tags);
00314
00316 virtual void diyOp(
00317 HxImageData* src,
00318 HxString diyName, HxTagList& tags);
00319
00321 virtual void rgbOp(HxString rgbName, HxTagList& tags);
00323
00325
00328 virtual void geometricOp2d(HxImageData* arg,
00329 HxMatrix func, HxGeoIntType gi,
00330 HxVec3Double translate,
00331 HxValue background) = 0;
00332 virtual void restrict(
00333 HxImageData* arg, HxPoint begin);
00334 virtual void extend(
00335 HxImageData* arg, HxPoint begin);
00336 virtual HxImageData* projectDomain(int dimension, int coordinate) =0;
00337 virtual void inverseProjectDomain(int dimension,
00338 int coordinate,
00339 HxImageData* arg) = 0;
00341
00343
00345 virtual void getValues(
00346 HxPointListConstIter first,
00347 HxPointListConstIter last,
00348 HxValueListBackInserter) = 0;
00350
00352
00354 virtual void setAt(int x, int y, int z,
00355 const HxValue v) = 0;
00356 virtual HxValue getAt(int x, int y, int z) const = 0;
00357
00358 virtual HxRcObject* clone();
00359
00360 virtual void setPpmPixels(const HxByte* pixels);
00361 virtual void getPpmPixels(HxByte* pixels);
00362
00363
00364 virtual void getRgbPixels2d(int* pixels, HxString dispF,
00365 int bufWidth, int bufHeight,
00366 int VX, int VY, int VW, int VH,
00367 double SX, double SY, double scaleX,
00368 double scaleY, HxGeoIntType gi) const {}
00369
00370 virtual void getDoublePixels(double* pixels) = 0;
00371
00372 virtual STD_OSTREAM& printInfo(STD_OSTREAM &os,
00373 int doData = 0) const = 0;
00374
00375 static void setObjectObserver(const HxObjectObserver&);
00376
00377 static bool probeMNpo(
00378 const HxImageSignature resultsSig,
00379 const HxImageSignature argsSig,
00380 HxString mpoName, HxTagList& tags);
00382
00383
00385
00387 virtual HxImageData* projectRange(int dimension);
00388 virtual void inverseProjectRange(
00389 int dimension, HxImageData* arg);
00391
00392
00393 void weight(double w);
00394 HxScalarDouble weight() const;
00395
00396 protected:
00397
00398 int checkEqualImageSig(HxString func,
00399 HxImageData* arg);
00400 int checkEqualImageSizes(HxString func,
00401 HxImageData* arg);
00402 int checkEqualImageSigAndSizes(HxString func,
00403 HxImageData* arg);
00404 int checkLargerImageSigAndSizes(HxString func,
00405 HxImageData* arg);
00406 int checkProperKernelSigAndSizes(HxString func,
00407 HxImageData* kernel,
00408 int reqDim, int reqScalar,
00409 int appliedDim = 0);
00410
00411 int checkEqualImageSizesDim(HxString func,
00412 HxImageData* arg, int dimension);
00413 int checkImageDimension(HxString func,
00414 int dim, int coord);
00415 int checkPixelDimension(HxString func, int dim);
00416 bool checkBorderSize(
00417 HxString funcName,
00418 HxSizes borderSize) const;
00419 HxSizes getProjectDomainSizes(int dimension) const;
00420
00421 private:
00422
00423 static int _nr;
00424 int _ident;
00425 HxString _name;
00426 double _weight;
00427
00428 static const HxObjectObserver* _objectObserver;
00429 };
00430
00431
00432
00433 #endif