X-Git-Url: http://git.kpe.io/?p=ctsim.git;a=blobdiff_plain;f=libctsim%2Fprojections.cpp;h=7d3e814967394d885dd3b494ea0c626f351157df;hp=b54186447141fafa9f21b672dd120820c32bb20d;hb=08a5cd04c3994d5ea24713b9b000791bd2e406fe;hpb=53c732778ed19ac5231bb17c7e5bd4d2201d9456 diff --git a/libctsim/projections.cpp b/libctsim/projections.cpp index b541864..7d3e814 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.9 2000/07/03 11:02:06 kevin Exp $ +** $Id: projections.cpp,v 1.18 2000/07/29 19:50:08 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 @@ -208,7 +208,6 @@ Projections::headerRead (fnetorderstream& fs) if (! fs) return false; - off_t testPos; fs.readInt16 (_hsize); fs.readInt16 (_signature); fs.readInt32 (_nView); @@ -366,7 +365,7 @@ Projections::detarrayRead (fnetorderstream& fs, DetectorArray& darray, const int darray.setViewAngle (view_angle); // darray.setNDet ( nDet); - for (int i = 0; i < nDet; i++) { + for (unsigned int i = 0; i < nDet; i++) { kfloat32 detval; fs.readFloat32 (detval); detval_ptr[i] = detval; @@ -412,7 +411,7 @@ Projections::detarrayWrite (fnetorderstream& fs, const DetectorArray& darray, co fs.writeFloat64 (view_angle); fs.writeInt32 (nDet); - for (int i = 0; i < nDet; i++) { + for (unsigned int i = 0; i < nDet; i++) { kfloat32 detval = detval_ptr[i]; fs.writeFloat32 (detval); } @@ -487,17 +486,16 @@ Projections::printScanInfo (void) const */ bool -Projections::reconstruct (ImageFile& im, const char* const filterName, double filt_param, const char* const filterMethodName, const char* const interpName, int interp_param, const char* const backprojectName, const int trace) +Projections::reconstruct (ImageFile& im, const char* const filterName, double filt_param, const char* const filterMethodName, const int zeropad, const char* const interpName, int interpFactor, const char* const backprojectName, const int trace) const { - int nview = m_nView; double detInc = m_detInc; - int n_filteredProj = m_nDet; + 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 = interp_param; + zoom_factor = interpFactor; spline_order = 3; zoom_factor = 3; n_filteredProj = (m_nDet - 1) * (zoom_factor + 1) + 1; @@ -505,7 +503,9 @@ Projections::reconstruct (ImageFile& im, const char* const filterName, double fi #endif double filterBW = 1. / detInc; - SignalFilter filter (filterName, filterMethodName, filterBW, m_detInc, m_nDet, filt_param, "spatial", 0); + SignalFilter filter (filterName, filterMethodName, filterBW, m_detInc, m_nDet, filt_param, "spatial", zeropad, interpFactor); + filter.setTraceLevel(trace); + if (filter.fail()) { sys_error (ERR_SEVERE, "%s [Projections::reconstruct]", filter.failMessage().c_str()); return false; @@ -515,28 +515,34 @@ Projections::reconstruct (ImageFile& im, const char* const filterName, double fi cout << "Reconstruct: filter="<= TRACE_TEXT) { 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); + Backprojector bj (*this, im, backprojectName, interpName, interpFactor); if (bj.fail()) { sys_error (ERR_SEVERE, "%s [Projections::reconstruct]", bj.failMessage().c_str()); return false; @@ -546,37 +552,12 @@ Projections::reconstruct (ImageFile& im, const char* const filterName, double fi if (trace >= TRACE_TEXT) printf ("Reconstructing view %d (last = %d)\n", iview, m_nView - 1); - DetectorArray& darray = getDetectorArray (iview); - DetectorValue* detval = darray.detValues(); + const DetectorArray& darray = getDetectorArray (iview); + const DetectorValue* detval = darray.detValues(); filter.filterSignal (detval, filteredProj); - // for (int j = 0; j < m_nDet; j++) - // filteredProj[j] = filter.convolve (detval, detInc, j, m_nDet); -#ifdef HAVE_SGP - if (trace >= TRACE_PLOT) { - ezset ("clear."); - ezset ("xticks major 5."); - ezset ("xlabel "); - ezset ("ylabel "); - ezset ("xlength .5."); - ezset ("box."); - ezset ("grid."); - ezset ("ufinish yes."); - ezplot (detval, plot_xaxis, m_nDet); - ezset ("clear."); - ezset ("xticks major 5."); - ezset ("xlabel "); - ezset ("ylabel "); - ezset ("ustart yes."); - ezset ("xporigin .5."); - ezset ("xlength .5."); - ezset ("box"); - ezset ("grid"); - gid = ezplot (filteredProj, plot_xaxis, m_nDet); - } -#endif //HAVE_SGP #ifdef HAVE_BSPLINE_INTERP if (interp_type == I_BSPLINE) @@ -594,10 +575,34 @@ Projections::reconstruct (ImageFile& im, const char* const filterName, double fi #ifdef HAVE_SGP if (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]; - printf ("Do you want to exit with current pic (y/n) -- "); fgets(str, sizeof(str), stdin); - sgp2_close (sgp2_get_active_win()); if (tolower(str[0]) == 'y') { break; }