ab15930d600eb6ca695f3adb2e407b0cf736977a
[ctsim.git] / include / backprojectors.h
1 /*****************************************************************************
2 ** FILE IDENTIFICATION
3 **
4 **      Name:         backproject.h
5 **      Purpose:      Backprojection classes
6 **      Programmer:   Kevin Rosenberg
7 **      Date Started: June 2000
8 **
9 **  This is part of the CTSim program
10 **  Copyright (C) 1983-2000 Kevin Rosenberg
11 **
12 **  $Id: backprojectors.h,v 1.8 2000/07/11 10:32:44 kevin Exp $
13 **
14 **  This program is free software; you can redistribute it and/or modify
15 **  it under the terms of the GNU General Public License (version 2) as
16 **  published by the Free Software Foundation.
17 **
18 **  This program is distributed in the hope that it will be useful,
19 **  but WITHOUT ANY WARRANTY; without even the implied warranty of
20 **  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21 **  GNU General Public License for more details.
22 **
23 **  You should have received a copy of the GNU General Public License
24 **  along with this program; if not, write to the Free Software
25 **  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
26 ******************************************************************************/
27
28
29 #undef HAVE_BSPLINE_INTERP
30
31 class Backproject;
32
33 class Backprojector
34 {
35  public:
36   typedef  enum {
37     BPROJ_INVALID,
38     BPROJ_TRIG,
39     BPROJ_TABLE,
40     BPROJ_DIFF,
41     BPROJ_DIFF2,
42     BPROJ_IDIFF2,
43     BPROJ_IDIFF3
44 } BackprojectID;
45
46   typedef enum {
47     INTERP_INVALID,
48     INTERP_NEAREST,      // Nearest neighbor
49 #if HAVE_BSPLINE_INTERP
50     I_BSPLINE,
51     I_1BSPLINE,      // 1st order B-Spline 
52     I_2BSPLINE,
53     I_3BSPLINE,
54 #endif
55     INTERP_LINEAR,        // Linear interpolation 
56     INTERP_FREQ_PREINTERPOLATION,
57   } InterpolationID;
58
59   static const char BPROJ_TRIG_STR[]=     "trig";
60   static const char BPROJ_TABLE_STR[]=    "table";
61   static const char BPROJ_DIFF_STR[]=     "diff";
62   static const char BPROJ_DIFF2_STR[]=    "diff2";
63   static const char BPROJ_IDIFF2_STR[]=   "idiff2";
64   static const char BPROJ_IDIFF3_STR[]=   "idiff3";
65  
66   static const char INTERP_NEAREST_STR[]=  "nearest";
67   static const char INTERP_LINEAR_STR[]=   "linear";
68   static const char INTERP_BSPLINE_STR[]=  "bspline";
69   static const char INTERP_FREQ_PREINTERPOLATION_STR[]= "freq_preinterpolation";
70
71   Backprojector (const Projections& proj, ImageFile& im, const char* const backprojName, const char* const interpName, const int interpFactor);
72
73   ~Backprojector (void);
74                  
75   void BackprojectView (const double* const viewData, const double viewAngle);
76
77   bool fail(void) const {return m_fail;}
78   const string& failMessage(void) const {return m_failMessage;}
79
80  private:
81   string m_nameBackproject;
82   string m_nameInterpolation;
83   BackprojectID m_idBackproject;
84   InterpolationID m_idInterpolation;
85   Backproject* m_pBackprojectImplem;
86   bool m_fail;
87   string m_failMessage;
88
89   static const InterpolationID convertInterpolationNameToID (const char* const interpName);
90   static const char* convertInterpolationIDToName (const InterpolationID interpID);
91   static const BackprojectID convertBackprojectNameToID (const char* const bprojName);
92   static const char* convertBackprojectIDToName (const BackprojectID bprojID);
93
94   bool initBackprojector (const Projections& proj, ImageFile& im, const char* const backprojName, const char* const interpName, const int interpFactor);
95 };
96
97
98 class Backproject
99 {
100  public:
101     Backproject (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType, const int interpFactor);
102
103     virtual ~Backproject ();
104
105     virtual void BackprojectView (const double* const viewData, const double viewAngle) {};
106
107  protected:
108     void ScaleImageByRotIncrement (void);
109     void Backproject::errorIndexOutsideDetector (int ix, int iy, double theta, double r, double phi, double L, int ni);
110     void Backproject::errorIndexOutsideDetector (int ix, int iy, double theta, double L, int ni);
111
112     Backprojector::InterpolationID interpType;
113     const Projections& proj;
114     ImageFile& im;
115     ImageFileArray v;
116     kuint32 nx;
117     kuint32 ny;
118     double detInc;
119     double rotInc;
120     int iDetCenter;             // index refering to L=0 projection 
121     int nDet;
122     double xMin, xMax, yMin, yMax;     // Retangular coords of phantom
123     double xInc, yInc;  // size of cells
124     int m_interpFactor;
125
126  private:
127     Backproject (const Backproject& rhs);
128     Backproject& operator= (const Backproject& rhs);
129 };
130
131
132 class BackprojectTrig : public Backproject
133 {
134  public:
135   BackprojectTrig (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType, const int interpFactor)
136       : Backproject::Backproject (proj, im, interpType, interpFactor)
137       {}
138
139   void BackprojectView (const double* const t, double view_angle);
140 };
141
142
143 class BackprojectTable : public Backproject
144 {
145  public:
146   BackprojectTable (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType, const int interpFactor);
147   ~BackprojectTable ();
148
149   void BackprojectView (const double* const t, double view_angle);
150
151  private:
152   Array2d<kfloat64> arrayR;
153   Array2d<kfloat64> arrayPhi;
154   kfloat64** r;
155   kfloat64** phi;
156 };
157
158
159 class BackprojectDiff : public Backproject
160 {
161  public:
162   BackprojectDiff (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType, const int interpFactor);
163   ~BackprojectDiff ();
164
165   void BackprojectView (const double* const t, double view_angle);
166
167  protected:
168   double start_r;
169   double start_phi;
170   double im_xinc, im_yinc;
171 };
172
173 class BackprojectDiff2 : public BackprojectDiff
174 {
175  public:
176   BackprojectDiff2 (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType, const int interpFactor)
177     :  BackprojectDiff::BackprojectDiff (proj, im, interpType, interpFactor)
178     {}
179
180   void BackprojectView (const double* const t, double view_angle);
181 };
182
183 class BackprojectIntDiff2 : public BackprojectDiff
184 {
185  public:
186   BackprojectIntDiff2 (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType, const int interpFactor)
187     :  BackprojectDiff::BackprojectDiff (proj, im, interpType, interpFactor)
188     {}
189   
190   void BackprojectView (const double* const t, double view_angle);
191 };
192
193
194 class BackprojectIntDiff3 : public BackprojectDiff
195 {
196  public:
197   BackprojectIntDiff3 (const Projections& proj, ImageFile& im, Backprojector::InterpolationID interpType, const int interpFactor)
198     :  BackprojectDiff::BackprojectDiff (proj, im, interpType, interpFactor)
199     {}
200   
201   void BackprojectView (const double* const t, double view_angle);
202 };
203
204