** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: backprojectors.h,v 1.2 2000/06/13 16:20:31 kevin Exp $
-** $Log: backprojectors.h,v $
-** Revision 1.2 2000/06/13 16:20:31 kevin
-** finished c++ conversions
-**
-** Revision 1.1 2000/06/10 23:00:17 kevin
-** *** empty log message ***
-**
+** $Id: backprojectors.h,v 1.6 2000/07/07 15:30:59 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
** Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
******************************************************************************/
+
+#undef HAVE_BSPLINE_INTERP
+
+class Backproject;
+
+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
+#if HAVE_BSPLINE_INTERP
+ I_BSPLINE,
+ I_1BSPLINE, // 1st order B-Spline
+ I_2BSPLINE,
+ I_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);
+
+ ~Backprojector (void);
+
+ void BackprojectView (const double* const viewData, const double viewAngle);
+
+ 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;
+ Backproject* m_pBackprojectImplem;
+ bool m_fail;
+ 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);
+
+ bool initBackprojector (const Projections& proj, ImageFile& im, const char* const backprojName, const char* const interpName);
+};
+
+
class Backproject
{
public:
- Backproject (const RAYSUM* rs, ImageFile& im, InterpolationType interpType);
+ Backproject (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType);
virtual ~Backproject ();
- virtual void BackprojectView (const double* const t, const double view_angle) {};
+ virtual void BackprojectView (const double* const viewData, const double viewAngle) {};
protected:
void ScaleImageByRotIncrement (void);
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);
- InterpolationType interpType;
- const RAYSUM* rs;
+ Backprojector::InterpolationID interpType;
+ const Projections& proj;
ImageFile& im;
ImageFileArray v;
kuint32 nx;
class BackprojectTrig : public Backproject
{
public:
- BackprojectTrig (const RAYSUM* rs, ImageFile& im, InterpolationType interpType)
- : Backproject::Backproject (rs, im, interpType)
+ BackprojectTrig (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType)
+ : Backproject::Backproject (proj, im, interpType)
{}
void BackprojectView (const double* const t, double view_angle);
class BackprojectTable : public Backproject
{
public:
- BackprojectTable (const RAYSUM* rs, ImageFile& im, InterpolationType interpType);
+ BackprojectTable (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType);
~BackprojectTable ();
void BackprojectView (const double* const t, double view_angle);
class BackprojectDiff : public Backproject
{
public:
- BackprojectDiff (const RAYSUM* rs, ImageFile& im, InterpolationType interpType);
+ BackprojectDiff (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType);
~BackprojectDiff ();
void BackprojectView (const double* const t, double view_angle);
class BackprojectDiff2 : public BackprojectDiff
{
public:
- BackprojectDiff2 (const RAYSUM* rs, ImageFile& im, InterpolationType interpType)
- : BackprojectDiff::BackprojectDiff (rs, im, interpType)
+ BackprojectDiff2 (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType)
+ : BackprojectDiff::BackprojectDiff (proj, im, interpType)
{}
void BackprojectView (const double* const t, double view_angle);
class BackprojectIntDiff2 : public BackprojectDiff
{
public:
- BackprojectIntDiff2 (const RAYSUM* rs, ImageFile& im, InterpolationType interpType)
- : BackprojectDiff::BackprojectDiff (rs, im, interpType)
+ BackprojectIntDiff2 (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType)
+ : BackprojectDiff::BackprojectDiff (proj, im, interpType)
+ {}
+
+ void BackprojectView (const double* const t, double view_angle);
+};
+
+
+class BackprojectIntDiff3 : public BackprojectDiff
+{
+ public:
+ BackprojectIntDiff3 (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType)
+ : BackprojectDiff::BackprojectDiff (proj, im, interpType)
{}
void BackprojectView (const double* const t, double view_angle);
};
-Backproject* selectBackprojector (BackprojType type, const RAYSUM*, ImageFile& im, InterpolationType interpType);