File: backprojectors.h

package info (click to toggle)
ctsim 4.5.2-1.1
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 6,536 kB
  • ctags: 3,720
  • sloc: cpp: 26,768; sh: 3,691; ansic: 1,254; perl: 296; makefile: 263
file content (230 lines) | stat: -rw-r--r-- 7,423 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
/*****************************************************************************
** FILE IDENTIFICATION
**
**	Name:	      backproject.h
**      Purpose:      Backprojection classes
**	Programmer:   Kevin Rosenberg
**	Date Started: June 2000
**
**  This is part of the CTSim program
**  Copyright (c) 1983-2001 Kevin Rosenberg
**
**  $Id: backprojectors.h 10902 2006-03-17 03:48:48Z kevin $
**
**  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
**  published by the Free Software Foundation.
**
**  This program is distributed in the hope that it will be useful,
**  but WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**  GNU General Public License for more details.
**
**  You should have received a copy of the GNU General Public License
**  along with this program; if not, write to the Free Software
**  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;
struct ReconstructionROI;

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_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
  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, const ReconstructionROI* pROI);

  ~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);


 private:
  std::string m_nameBackproject;
  std::string m_nameInterpolation;
  int m_idBackproject;
  int m_idInterpolation;
  Backproject* m_pBackprojectImplem;
  bool m_fail;
  std::string m_failMessage;

  static const char* const s_aszBackprojectName[];
  static const char* const s_aszBackprojectTitle[];
  static const int s_iBackprojectCount;

  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, int interpID, const int interpFactor, 
      const ReconstructionROI* pROI);

    virtual ~Backproject ();

    virtual void BackprojectView (const double* const viewData, const double viewAngle) = 0;
    virtual void PostProcessing (); // call after backprojecting all views

 protected:
    void ScaleImageByRotIncrement ();
    void errorIndexOutsideDetector (int ix, int iy, double theta, double r, double phi, double L, int ni);
    void errorIndexOutsideDetector (int ix, int iy, double theta, double L, int ni);
    const Projections& proj;
    ImageFile& im;
    int interpType;
    ImageFileArray v;
    kint32 nx;
    kint32 ny;
    double detInc;
    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);
    Backproject& operator= (const Backproject& rhs);
};


class BackprojectTrig : public Backproject
{
 public:
  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, const double view_angle);
};


class BackprojectTable : public Backproject
{
 public:
  BackprojectTable (const Projections& proj, ImageFile& im, int interpID, const int interpFactor, const ReconstructionROI* pROI);
  virtual ~BackprojectTable ();

  virtual void BackprojectView (const double* const t, const double view_angle);
  virtual void PostProcessing (); // call after backprojecting all views

 protected:
  Array2d<kfloat64> arrayR;
  Array2d<kfloat64> arrayPhi;
  kfloat64** r;
  kfloat64** phi;
};


class BackprojectDiff : public Backproject
{
 public:
  BackprojectDiff (const Projections& proj, ImageFile& im, int interpID, const int interpFactor, const ReconstructionROI* pROI);
  ~BackprojectDiff ();

  virtual void BackprojectView (const double* const t, const double view_angle);
  virtual void PostProcessing (); // call after backprojecting all views

 protected:
  double start_r;
  double start_phi;
  double im_xinc, im_yinc;
};


class BackprojectIntDiff : public BackprojectDiff
{
 public:
  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, const double view_angle);
};

class BackprojectEquilinear : public BackprojectTable
{
 public:
  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 BackprojectEquiangular : public BackprojectTable
{
 public:
  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