** This is part of the CTSim program
** Copyright (C) 1983-2000 Kevin Rosenberg
**
-** $Id: backprojectors.h,v 1.3 2000/06/17 20:12:14 kevin Exp $
-** $Log: backprojectors.h,v $
-** Revision 1.3 2000/06/17 20:12:14 kevin
-** Converted Scanner and Projections to C++
-**
-** 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.14 2000/08/31 08:38:58 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
******************************************************************************/
+
+#ifndef __BACKPROJECTORS_H
+#define __BACKPROJECTORS_H
+
+#undef HAVE_BSPLINE_INTERP
+
+#include "imagefile.h"
+
+
+class Backproject;
+class ImageFile;
+class Projections;
+
+class Backprojector
+{
+ public:
+ static const int BPROJ_INVALID;
+ static const int BPROJ_TRIG;
+ static const int BPROJ_TABLE;
+ static const int BPROJ_DIFF;
+ static const int BPROJ_DIFF2;
+ static const int BPROJ_IDIFF2;
+ static const int BPROJ_IDIFF3;
+
+ static const int INTERP_INVALID;
+ static const int INTERP_NEAREST;
+ static const int INTERP_LINEAR;
+ static const int INTERP_FREQ_PREINTERPOLATION;
+#if HAVE_BSPLINE_INTERP
+ static const int INTERP_BSPLINE;
+ static const int INTERP_1BSPLINE;
+ static const int INTERP_2BSPLINE;
+ static const int INTERP_3BSPLINE;
+#endif
+
+ Backprojector (const Projections& proj, ImageFile& im, const char* const backprojName, const char* const interpName, const int interpFactor);
+
+ ~Backprojector ();
+
+ void BackprojectView (const double* const viewData, const double viewAngle);
+
+ bool fail() const {return m_fail;}
+ const string& failMessage() const {return m_failMessage;}
+
+ static const int getBackprojectCount() {return s_iBackprojectCount;}
+ static const char** getBackprojectNameArray() {return s_aszBackprojectName;}
+ static const char** 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** getInterpNameArray() {return s_aszInterpName;}
+ static const char** 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);
+
+
+ private:
+ string m_nameBackproject;
+ string m_nameInterpolation;
+ int m_idBackproject;
+ int m_idInterpolation;
+ Backproject* m_pBackprojectImplem;
+ bool m_fail;
+ string m_failMessage;
+
+ static const char* s_aszBackprojectName[];
+ static const char* s_aszBackprojectTitle[];
+ static const int s_iBackprojectCount;
+
+ static const char* s_aszInterpName[];
+ static const char* 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);
+};
+
+
class Backproject
{
public:
- Backproject (const Projections& proj, ImageFile& im, InterpolationType interpType);
+ Backproject (const Projections& proj, ImageFile& im, int interpID, const int interpFactor);
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 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);
- InterpolationType interpType;
const Projections& proj;
ImageFile& im;
+ int interpType;
ImageFileArray v;
- kuint32 nx;
- kuint32 ny;
+ kint32 nx;
+ kint32 ny;
double detInc;
double rotInc;
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;
private:
Backproject (const Backproject& rhs);
class BackprojectTrig : public Backproject
{
public:
- BackprojectTrig (const Projections& proj, ImageFile& im, InterpolationType interpType)
- : Backproject::Backproject (proj, im, interpType)
+ BackprojectTrig (const Projections& proj, ImageFile& im, int interpID, const int interpFactor)
+ : Backproject::Backproject (proj, im, interpID, interpFactor)
{}
void BackprojectView (const double* const t, double view_angle);
class BackprojectTable : public Backproject
{
public:
- BackprojectTable (const Projections& proj, ImageFile& im, InterpolationType interpType);
+ BackprojectTable (const Projections& proj, ImageFile& im, int interpID, const int interpFactor);
~BackprojectTable ();
void BackprojectView (const double* const t, double view_angle);
- private:
+ protected:
Array2d<kfloat64> arrayR;
Array2d<kfloat64> arrayPhi;
kfloat64** r;
class BackprojectDiff : public Backproject
{
public:
- BackprojectDiff (const Projections& proj, ImageFile& im, InterpolationType interpType);
+ BackprojectDiff (const Projections& proj, ImageFile& im, int interpID, const int interpFactor);
~BackprojectDiff ();
void BackprojectView (const double* const t, double view_angle);
class BackprojectDiff2 : public BackprojectDiff
{
public:
- BackprojectDiff2 (const Projections& proj, ImageFile& im, InterpolationType interpType)
- : BackprojectDiff::BackprojectDiff (proj, im, interpType)
+ BackprojectDiff2 (const Projections& proj, ImageFile& im, int interpID, const int interpFactor)
+ : BackprojectDiff::BackprojectDiff (proj, im, interpID, interpFactor)
{}
void BackprojectView (const double* const t, double view_angle);
class BackprojectIntDiff2 : public BackprojectDiff
{
public:
- BackprojectIntDiff2 (const Projections& proj, ImageFile& im, InterpolationType interpType)
- : BackprojectDiff::BackprojectDiff (proj, im, interpType)
+ BackprojectIntDiff2 (const Projections& proj, ImageFile& im, int interpID, const int interpFactor)
+ : BackprojectDiff::BackprojectDiff (proj, im, interpID, interpFactor)
{}
void BackprojectView (const double* const t, double view_angle);
};
-Backproject* selectBackprojector (BackprojType type, const Projections& proj, ImageFile& im, InterpolationType interpType);
+class BackprojectIntDiff3 : public BackprojectDiff
+{
+ public:
+ BackprojectIntDiff3 (const Projections& proj, ImageFile& im, int interpID, const int interpFactor)
+ : BackprojectDiff::BackprojectDiff (proj, im, interpID, interpFactor)
+ {}
+
+ void BackprojectView (const double* const t, double view_angle);
+};
+
+class BackprojectEquilinear : public BackprojectTable
+{
+ public:
+ BackprojectEquilinear (const Projections& proj, ImageFile& im, int interpID, const int interpFactor)
+ : BackprojectTable::BackprojectTable (proj, im, interpID, interpFactor)
+ {}
+
+ void BackprojectView (const double* const t, double view_angle);
+};
+
+class BackprojectEquiangular : public BackprojectTable
+{
+ public:
+ BackprojectEquiangular (const Projections& proj, ImageFile& im, int interpID, const int interpFactor)
+ : BackprojectTable::BackprojectTable (proj, im, interpID, interpFactor)
+ {}
+
+ void BackprojectView (const double* const t, double view_angle);
+};
+
+
+#endif