#include <HxImageTem2d.h>
Inheritance diagram for HxImageTem2d::
Public Methods | |
HxImageTem2d (int width=1, int height=1) | |
HxImageTem2d (size_t *sizes) | |
HxImageTem2d (const HxImageTem2d &) | |
virtual | ~HxImageTem2d () |
int | width () const |
int | height () const |
virtual DataPtrType | dataPtrClone () const |
virtual void | geometricOp2d (HxImageData *arg, HxMatrix func, HxGeoIntType gi, HxVec3Double translate, HxValue background) |
Geometric operation on 2D images. More... | |
virtual HxImageData * | projectDomain (int dimension, int coordinate) |
virtual void | inverseProjectDomain (int dimension, int coordinate, HxImageData *arg) |
virtual void | getValues (HxPointListConstIter first, HxPointListConstIter last, HxValueListBackInserter) |
virtual void | getRgbPixels2d (int *pixels, HxString dispF, int bufWidth, int bufHeight, int VX, int VY, int VW, int VH, double SX, double SY, double scaleX, double scaleY, HxGeoIntType gi) const |
|
Geometric operation on 2D images.
Reimplemented from HxImageData.
00085 { 00086 DataPtrType objPtr = dataPtrClone(); 00087 HxImageTem<ImageSigT>* argTem = (HxImageTem<ImageSigT>*) arg; 00088 DataPtrType argPtr = argTem->dataPtrClone(); 00089 int maxArgX = (gi == LINEAR) ? arg->dimensionSize(1) - 2 : arg->dimensionSize(1) - 1; 00090 int maxArgY = (gi == LINEAR) ? arg->dimensionSize(2) - 2 : arg->dimensionSize(2) - 1; 00091 ArithType pixVal; 00092 int x, y; 00093 for (y=0; y<height(); y++) { 00094 for (x=0; x<width(); x++) { 00095 HxVec3Double vObj(x, y, 1); 00096 HxVec3Double vArg = func * (vObj + translate); 00097 double argXf = vArg.x() / vArg.z(); // homogeneous coordinates 00098 double argYf = vArg.y() / vArg.z(); 00099 int argX = int(argXf); // truncate 00100 int argY = int(argYf); 00101 if ((argX < 0) || (argX > maxArgX) 00102 || (argY < 0) || (argY > maxArgY)) 00103 pixVal = ArithType(background); // outside image 00104 else { 00105 DataPtrType aPtr = argPtr; 00106 if (gi == LINEAR) { 00107 ArithType alpha = HxScalarDouble(argXf - argX); 00108 ArithType beta = HxScalarDouble(argYf - argY); 00109 aPtr.incXYZ(argX, argY); 00110 ArithType v1 = aPtr.read(); 00111 aPtr.incX(); 00112 ArithType v2 = aPtr.read(); 00113 aPtr.incXYZ(-1, 1); 00114 ArithType v3 = aPtr.read(); 00115 aPtr.incX(); 00116 ArithType v4 = aPtr.read(); 00117 pixVal = v1 + alpha*(v2-v1) + beta*(v3-v1) 00118 + alpha*beta*(v1-v2-v3+v4); 00119 } 00120 else { // gi == NEAREST 00121 aPtr.incXYZ(int(argXf + 0.5), int(argYf + 0.5)); 00122 pixVal = aPtr.read(); 00123 } 00124 } 00125 objPtr.write(pixVal); 00126 objPtr.incX(); 00127 } 00128 } 00129 } |