** Date Started: June 2000
**
** This is part of the CTSim program
-** Copyright (C) 1983-2000 Kevin Rosenberg
+** Copyright (c) 1983-2001 Kevin Rosenberg
**
-** $Id: backprojectors.h,v 1.6 2000/07/07 15:30:59 kevin Exp $
+** $Id: backprojectors.h,v 1.25 2001/03/11 15:27:30 kevin Exp $
**
** This program is free software; you can redistribute it and/or modify
** it under the terms of the GNU General Public License (version 2) as
******************************************************************************/
+#ifndef __BACKPROJECTORS_H
+#define __BACKPROJECTORS_H
+
#undef HAVE_BSPLINE_INTERP
+#include "imagefile.h"
+
+
class Backproject;
+class ImageFile;
+class Projections;
+struct ReconstructionROI;
class Backprojector
{
public:
- typedef enum {
- BPROJ_INVALID,
- BPROJ_TRIG,
- BPROJ_TABLE,
- BPROJ_DIFF,
- BPROJ_DIFF2,
- BPROJ_IDIFF2,
- BPROJ_IDIFF3
-} BackprojectID;
-
- typedef enum {
- INTERP_INVALID,
- INTERP_NEAREST, // Nearest neighbor
+ static const int BPROJ_INVALID;
+ static const int BPROJ_TRIG;
+ static const int BPROJ_TABLE;
+ static const int BPROJ_DIFF;
+ static const int BPROJ_IDIFF;
+
+ static const int INTERP_INVALID;
+ static const int INTERP_NEAREST;
+ static const int INTERP_LINEAR;
+ static const int INTERP_CUBIC;
+ static const int INTERP_FREQ_PREINTERPOLATION;
#if HAVE_BSPLINE_INTERP
- I_BSPLINE,
- I_1BSPLINE, // 1st order B-Spline
- I_2BSPLINE,
- I_3BSPLINE,
+ static const int INTERP_BSPLINE;
+ static const int INTERP_1BSPLINE;
+ static const int INTERP_2BSPLINE;
+ static const int INTERP_3BSPLINE;
#endif
- INTERP_LINEAR // Linear interpolation
- } InterpolationID;
-
- static const char BPROJ_TRIG_STR[]= "trig";
- static const char BPROJ_TABLE_STR[]= "table";
- static const char BPROJ_DIFF_STR[]= "diff";
- static const char BPROJ_DIFF2_STR[]= "diff2";
- static const char BPROJ_IDIFF2_STR[]= "idiff2";
- static const char BPROJ_IDIFF3_STR[]= "idiff3";
-
- static const char INTERP_NEAREST_STR[]= "nearest";
- static const char INTERP_LINEAR_STR[]= "linear";
- static const char INTERP_BSPLINE_STR[]= "bspline";
+ Backprojector (const Projections& proj, ImageFile& im, const char* const backprojName,
+ const char* const interpName, const int interpFactor, const ReconstructionROI* pROI);
- Backprojector (const Projections& proj, ImageFile& im, const char* const backprojName, const char* const interpName);
-
- ~Backprojector (void);
+ ~Backprojector ();
void BackprojectView (const double* const viewData, const double viewAngle);
+ void PostProcessing();
+
+ bool fail() const {return m_fail;}
+ const std::string& failMessage() const {return m_failMessage;}
+
+ static const int getBackprojectCount() {return s_iBackprojectCount;}
+ static const char* const* getBackprojectNameArray() {return s_aszBackprojectName;}
+ static const char* const* getBackprojectTitleArray() {return s_aszBackprojectTitle;}
+ static int convertBackprojectNameToID (const char* const bprojName);
+ static const char* convertBackprojectIDToName (const int bprojID);
+ static const char* convertBackprojectIDToTitle (const int bprojID);
+
+ static const int getInterpCount() {return s_iInterpCount;}
+ static const char* const * getInterpNameArray() {return s_aszInterpName;}
+ static const char* const * getInterpTitleArray() {return s_aszInterpTitle;}
+ static int convertInterpNameToID (const char* const interpName);
+ static const char* convertInterpIDToName (const int interpID);
+ static const char* convertInterpIDToTitle (const int interpID);
- bool fail(void) const {return m_fail;}
- const string& failMessage(void) const {return m_failMessage;}
private:
- string m_nameBackproject;
- string m_nameInterpolation;
- BackprojectID m_idBackproject;
- InterpolationID m_idInterpolation;
+ std::string m_nameBackproject;
+ std::string m_nameInterpolation;
+ int m_idBackproject;
+ int m_idInterpolation;
Backproject* m_pBackprojectImplem;
bool m_fail;
- string m_failMessage;
+ std::string m_failMessage;
- static const InterpolationID convertInterpolationNameToID (const char* const interpName);
- static const char* convertInterpolationIDToName (const InterpolationID interpID);
- static const BackprojectID convertBackprojectNameToID (const char* const bprojName);
- static const char* convertBackprojectIDToName (const BackprojectID bprojID);
+ static const char* const s_aszBackprojectName[];
+ static const char* const s_aszBackprojectTitle[];
+ static const int s_iBackprojectCount;
- bool initBackprojector (const Projections& proj, ImageFile& im, const char* const backprojName, const char* const interpName);
+ static const char* const s_aszInterpName[];
+ static const char* const s_aszInterpTitle[];
+ static const int s_iInterpCount;
+
+ bool initBackprojector (const Projections& proj, ImageFile& im, const char* const backprojName,
+ const char* const interpName, const int interpFactor, const ReconstructionROI* pROI);
};
class Backproject
{
public:
- Backproject (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType);
+ Backproject (const Projections& proj, ImageFile& im, int interpID, const int interpFactor,
+ const ReconstructionROI* pROI);
virtual ~Backproject ();
- virtual void BackprojectView (const double* const viewData, const double viewAngle) {};
+ virtual void BackprojectView (const double* const viewData, const double viewAngle) = 0;
+ virtual void PostProcessing (); // call after backprojecting all views
protected:
- void ScaleImageByRotIncrement (void);
+ void ScaleImageByRotIncrement ();
void Backproject::errorIndexOutsideDetector (int ix, int iy, double theta, double r, double phi, double L, int ni);
void Backproject::errorIndexOutsideDetector (int ix, int iy, double theta, double L, int ni);
-
- Backprojector::InterpolationID interpType;
const Projections& proj;
ImageFile& im;
+ int interpType;
ImageFileArray v;
- kuint32 nx;
- kuint32 ny;
+ kint32 nx;
+ kint32 ny;
double detInc;
- double rotInc;
+ double rotScale;
int iDetCenter; // index refering to L=0 projection
int nDet;
double xMin, xMax, yMin, yMax; // Retangular coords of phantom
double xInc, yInc; // size of cells
+ int m_interpFactor;
+ double m_dFocalLength;
+ double m_dSourceDetectorLength;
+ bool m_bPostProcessingDone;
private:
Backproject (const Backproject& rhs);
class BackprojectTrig : public Backproject
{
public:
- BackprojectTrig (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType)
- : Backproject::Backproject (proj, im, interpType)
+ BackprojectTrig (const Projections& proj, ImageFile& im, int interpID, const int interpFactor, const ReconstructionROI* pROI)
+ : Backproject (proj, im, interpID, interpFactor, pROI)
{}
- void BackprojectView (const double* const t, double view_angle);
+ void BackprojectView (const double* const t, const double view_angle);
};
class BackprojectTable : public Backproject
{
public:
- BackprojectTable (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType);
- ~BackprojectTable ();
+ BackprojectTable (const Projections& proj, ImageFile& im, int interpID, const int interpFactor, const ReconstructionROI* pROI);
+ virtual ~BackprojectTable ();
- void BackprojectView (const double* const t, double view_angle);
+ virtual void BackprojectView (const double* const t, const double view_angle);
+ virtual void PostProcessing (); // call after backprojecting all views
- private:
+ protected:
Array2d<kfloat64> arrayR;
Array2d<kfloat64> arrayPhi;
kfloat64** r;
class BackprojectDiff : public Backproject
{
public:
- BackprojectDiff (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType);
+ BackprojectDiff (const Projections& proj, ImageFile& im, int interpID, const int interpFactor, const ReconstructionROI* pROI);
~BackprojectDiff ();
- void BackprojectView (const double* const t, double view_angle);
+ virtual void BackprojectView (const double* const t, const double view_angle);
+ virtual void PostProcessing (); // call after backprojecting all views
protected:
double start_r;
double im_xinc, im_yinc;
};
-class BackprojectDiff2 : public BackprojectDiff
+
+class BackprojectIntDiff : public BackprojectDiff
{
public:
- BackprojectDiff2 (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType)
- : BackprojectDiff::BackprojectDiff (proj, im, interpType)
+ BackprojectIntDiff (const Projections& proj, ImageFile& im, int interpID, const int interpFactor, const ReconstructionROI* pROI)
+ : BackprojectDiff (proj, im, interpID, interpFactor, pROI)
{}
-
- void BackprojectView (const double* const t, double view_angle);
+
+ void BackprojectView (const double* const t, const double view_angle);
};
-class BackprojectIntDiff2 : public BackprojectDiff
+class BackprojectEquilinear : public BackprojectTable
{
public:
- BackprojectIntDiff2 (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType)
- : BackprojectDiff::BackprojectDiff (proj, im, interpType)
- {}
-
- void BackprojectView (const double* const t, double view_angle);
-};
+ BackprojectEquilinear (const Projections& proj, ImageFile& im, int interpID, const int interpFactor, const ReconstructionROI* pROI)
+ : BackprojectTable (proj, im, interpID, interpFactor, pROI)
+ {}
+ void BackprojectView (const double* const t, const double view_angle);
+
+ virtual ~BackprojectEquilinear()
+ {}
+};
-class BackprojectIntDiff3 : public BackprojectDiff
+class BackprojectEquiangular : public BackprojectTable
{
public:
- BackprojectIntDiff3 (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType)
- : BackprojectDiff::BackprojectDiff (proj, im, interpType)
- {}
-
- void BackprojectView (const double* const t, double view_angle);
+ BackprojectEquiangular (const Projections& proj, ImageFile& im, int interpID, const int interpFactor, const ReconstructionROI* pROI)
+ : BackprojectTable (proj, im, interpID, interpFactor, pROI)
+ {}
+
+ void BackprojectView (const double* const t, const double view_angle);
+
+ virtual ~BackprojectEquiangular()
+ {}
};
+#endif