X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsim%2Fprojections.cpp;h=fb24e0d897bf065d9d348a5b09f827eacf1b8b8d;hp=be8e82941f9a47b30fe1946905fa9fba96bc7f0c;hb=bfcc769cf8019eabc8c65c07257c8dbee4b4c977;hpb=a05f3cb550877e94aa118cc04b361c0c8fdb3dc3 diff --git a/libctsim/projections.cpp b/libctsim/projections.cpp index be8e829..fb24e0d 100644 --- a/libctsim/projections.cpp +++ b/libctsim/projections.cpp @@ -8,7 +8,7 @@ ** This is part of the CTSim program ** Copyright (C) 1983-2000 Kevin Rosenberg ** -** $Id: projections.cpp,v 1.24 2000/08/31 08:38:58 kevin Exp $ +** $Id: projections.cpp,v 1.25 2000/09/02 05:10:39 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 @@ -66,6 +66,7 @@ Projections::~Projections (void) void Projections::init (const int nView, const int nDet) { + m_label.setLabelType (Array2dFileLabel::L_HISTORY); m_nView = nView; m_nDet = nDet; newProjData (); @@ -74,6 +75,7 @@ Projections::init (const int nView, const int nDet) void Projections::initFromScanner (const Scanner& scanner) { + m_label.setLabelType (Array2dFileLabel::L_HISTORY); deleteProjData(); init (scanner.nView(), scanner.nDet()); @@ -452,11 +454,10 @@ Projections::detarrayWrite (fnetorderstream& fs, const DetectorArray& darray, co } /* NAME - * prt_projections Print projections data + * printProjectionData Print projections data * * SYNOPSIS - * prt_projections (proj) - * Projections& proj Projection data to be printed + * printProjectionData () */ void @@ -498,149 +499,3 @@ Projections::printScanInfo (ostringstream& os) const -/* 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, m_focalLength); - - if (processSignal.fail()) { - sys_error (ERR_SEVERE, "%s [Projections::reconstruct]", processSignal.failMessage().c_str()); - return false; - } - - if (trace) - cout << "Reconstruct: filter="<= 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) - cout <<"Reconstructing view " << iview << "(last = " << m_nView - 1 << ")\n"; - - const DetectorArray& darray = getDetectorArray (iview); - const DetectorValue* detval = darray.detValues(); - - processSignal.filterSignal (detval, filteredProj); - -#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; -} -