-/* NAME
- * Projections::reconstruct Reconstruct Image from Projections
- *
- * SYNOPSIS
- * im = proj.reconstruct (im, filt_type, filt_param, interp_type)
- * IMAGE *im Output image
- * int filt_type Type of convolution filter to use
- * double filt_param Filter specific parameter
- * Currently, used only with Hamming filters
- * int interp_type Type of interpolation method to use
- *
- * ALGORITHM
- *
- * Calculate one-dimensional filter in spatial domain
- * Allocate & clear (zero) the 2d output image array
- * For each projection view
- * Convolve raysum array with filter
- * Backproject raysums and add (summate) to image array
- * end
- */
-
-bool
-Projections::reconstruct (ImageFile& im, const char* const filterName, double filt_param, const char* const filterMethodName, const int zeropad, const char* filterGenerationName, const char* const interpName, int interpFactor, const char* const backprojectName, const int trace) const
-{
- double detInc = m_detInc;
- int n_filteredProj = m_nDet * interpFactor;
- double filteredProj [n_filteredProj]; // filtered projections
-
-#ifdef HAVE_BSPLINE_INTERP
- int spline_order = 0, zoom_factor = 0;
- if (interp_type == I_BSPLINE) {
- zoom_factor = interpFactor;
- spline_order = 3;
- zoom_factor = 3;
- n_filteredProj = (m_nDet - 1) * (zoom_factor + 1) + 1;
- }
-#endif
-
- double filterBW = 1. / detInc;
- ProcessSignal processSignal (filterName, filterMethodName, filterBW, m_detInc, m_nDet, filt_param, "spatial", filterGenerationName, zeropad, interpFactor, trace, m_geometry);
-
- if (processSignal.fail()) {
- sys_error (ERR_SEVERE, "%s [Projections::reconstruct]", processSignal.failMessage().c_str());
- return false;
- }
-
- if (trace)
- cout << "Reconstruct: filter="<<filterName<< ", interp="<<interpName<<", backproject="<<backprojectName<<endl;
-
-#if HAVE_SGP
- int nVecFilter = processSignal.getNFilterPoints();
- double plot_xaxis [nVecFilter]; // array for plotting
-
- if (trace > Trace::TRACE_CONSOLE && nVecFilter > 0) {
- int i;
- double f;
- double filterInc = processSignal.getFilterIncrement();
- for (i = 0, f = processSignal.getFilterMin(); i < nVecFilter; i++, f += filterInc)
- plot_xaxis[i] = f;
-
- if (processSignal.getFilter()) {
- SGPDriver sgpDriver ("Filter Function");
- SGP sgp (sgpDriver);
- EZPlot ezplot (sgp);
-
- ezplot.ezset ("title Filter Response");
- ezplot.addCurve (plot_xaxis, processSignal.getFilter(), nVecFilter);
- ezplot.plot();
- cio_put_str ("Press any key to continue");
- cio_kb_getc ();
- }
- }
- if (trace >= Trace::TRACE_CONSOLE) {
- printf ("nview=%d, ndet=%d, det_start=%.4f, detInc=%.4f\n", m_nView, m_nDet, m_detStart, m_detInc);
- }
-#endif //HAVE_SGP
-
- Backprojector bj (*this, im, backprojectName, interpName, interpFactor);
- if (bj.fail()) {
- sys_error (ERR_SEVERE, "%s [Projections::reconstruct]", bj.failMessage().c_str());
- return false;
- }
-
- for (int iview = 0; iview < m_nView; iview++) {
- if (trace >= Trace::TRACE_CONSOLE)
- printf ("Reconstructing view %d (last = %d)\n", iview, m_nView - 1);
-
- const DetectorArray& darray = getDetectorArray (iview);
- const DetectorValue* detval = darray.detValues();
-
- processSignal.filterSignal (detval, filteredProj, iview);
-
-#ifdef HAVE_BSPLINE_INTERP
- if (interp_type == I_BSPLINE)
- bspline (m_nDet, zoom_factor, spline_order, filteredProj, filteredProj);
-
-#ifdef HAVE_SGP
- if (trace >= Trace::TRACE_PLOT && interp_type == I_BSPLINE) {
- bspline (m_nDet, zoom_factor, spline_order, filteredProj, filteredProj);
- ezplot_1d (filteredProj, n_filteredProj);
- }
-#endif
-#endif
-
- bj.BackprojectView (filteredProj, darray.viewAngle());
-
-#ifdef HAVE_SGP
- if (trace >= Trace::TRACE_PLOT) {
- SGPDriver sgpDriverProj ("Projection");
- SGP sgpProj (sgpDriverProj);
- EZPlot ezplotProj (sgpProj);
-
- ezplotProj.ezset ("clear");
- ezplotProj.ezset ("title Filtered Projection");
- ezplotProj.ezset ("xticks major 5.");
- ezplotProj.ezset ("xlabel ");
- ezplotProj.ezset ("ylabel ");
- ezplotProj.ezset ("yporigin .5.");
- ezplotProj.ezset ("ylength .5.");
- ezplotProj.ezset ("box.");
- ezplotProj.ezset ("grid.");
- ezplotProj.addCurve (plot_xaxis, detval, m_nDet);
- ezplotProj.plot();
- ezplotProj.ezset ("clear");
- ezplotProj.ezset ("xticks major 5.");
- ezplotProj.ezset ("xlabel ");
- ezplotProj.ezset ("ylabel ");
- ezplotProj.ezset ("ylength .5.");
- ezplotProj.ezset ("box");
- ezplotProj.ezset ("grid");
- ezplotProj.addCurve (plot_xaxis, filteredProj, n_filteredProj);
- ezplotProj.plot();
-
- cout << "Do you want to exit with current pic (y/n)? " << flush;
- char str[256];
- fgets(str, sizeof(str), stdin);
- if (tolower(str[0]) == 'y') {
- break;
- }
- }
-#endif //HAVE_SGP
- }
-
- return true;
-}
-