# # SPDX-License-Identifier: Apache-2.0 # # See STIR/LICENSE.txt for details import stir import stirextra import matplotlib.pyplot as pylab import os # go to directory with input files os.chdir('../recon_demo') # initialise reconstruction object # we will do this here via a .par file recon = stir.OSMAPOSLReconstruction3DFloat('recon_demo_OSEM.par') # now modify a few settings from in Python for illustration recon.set_num_subsets(2) # set filenames to save subset sensitivities (for illustration purposes) poissonobj = recon.get_objective_function() poissonobj.set_subsensitivity_filenames('sens_subset%d.hv') poissonobj.set_recompute_sensitivity(True) # get initial image target = stir.FloatVoxelsOnCartesianGrid.read_from_file('init.hv') # we will just fill the whole array with 1 here target.fill(1) # run a few iterations and plot intermediate results # Switch 'interactive' mode on for pylab.
#_________________________GUESS_______________________________ '''Negeer voor nu het initial estimate''' ## projection = stir.ProjDataInMemory(stir.ExamInfo(), projdata_info) reconGuess1S = stir.FloatVoxelsOnCartesianGrid(projdata_info, 1, stir.FloatCartesianCoordinate3D(stir.make_FloatCoordinate(0,0,0)), stir.IntCartesianCoordinate3D(stir.make_IntCoordinate(np.shape(originalImageP)[0],np.shape(originalImageP)[1],np.shape(originalImageP)[2] ))) reconGuess2S = stir.FloatVoxelsOnCartesianGrid(projdata_info, 1, stir.FloatCartesianCoordinate3D(stir.make_FloatCoordinate(0,0,0)), stir.IntCartesianCoordinate3D(stir.make_IntCoordinate(np.shape(originalImageP)[0],np.shape(originalImageP)[1],np.shape(originalImageP)[2] ))) MotionModel.setOffset(0.0) reconGuess1S.fill(1) # moet er staan recon1 = stir.OSMAPOSLReconstruction3DFloat(projmatrix, 'config_Proj_1.par') recon1.set_up(reconGuess1S) recon1.reconstruct(reconGuess1S) MotionModel.setOffset(0.0) reconGuess2S.fill(1) # moet er staan recon2 = stir.OSMAPOSLReconstruction3DFloat(projmatrix, 'config_Proj_2.par') recon2.set_up(reconGuess2S) recon2.reconstruct(reconGuess2S) guess1P = stirextra.to_numpy(reconGuess1S) #plt.imshow(guess1P[0,:,:], cmap=plt.cm.Greys_r, interpolation=None, vmin = 0), plt.title('Normal reconstruction, no motion'), plt.show() guess2P = stirextra.to_numpy(reconGuess2S) plt.subplot(1,2,1), plt.imshow(guess1P[0,:,:], cmap=plt.cm.Greys_r, interpolation=None, vmin = 0), plt.title('Recon time frame 1') plt.subplot(1,2,2), plt.imshow(guess2P[0,:,:], cmap=plt.cm.Greys_r, interpolation=None, vmin = 0), plt.title('Recon time frame 2')
#_________________________FIRST RECONSTRUCTION________________________ # Measurement/projections of inital time frame measurement = stir.ProjDataInMemory(stir.ExamInfo(), projdata_info) forwardprojector.forward_project(measurement, phantomS[0]) measurement.write_to_file('sino_1.hs') measurementS = measurement.get_segment_by_sinogram(0) measurementP = stirextra.to_numpy(measurementS) # Image reconstruction using OSMAPOSL reconImageS = stir.FloatVoxelsOnCartesianGrid(projdata_info, 1, stir.FloatCartesianCoordinate3D(stir.make_FloatCoordinate(0,0,0)), stir.IntCartesianCoordinate3D(stir.make_IntCoordinate(np.shape(originalImageP)[0],np.shape(originalImageP)[1],np.shape(originalImageP)[2] ))) reconImageS.fill(1) # moet er staan MotionModel.setOffset(0.0) reconOSMAPOSL = stir.OSMAPOSLReconstruction3DFloat(projmatrix, 'config_Image_1.par') s = reconOSMAPOSL.set_up(reconImageS) reconOSMAPOSL.reconstruct(reconImageS) reconImagePRef = stirextra.to_numpy(reconImageS) # reference time frame #_________________________SECOND RECONSTRUCTION________________________ # Measurement/projections of inital time frame measurement = stir.ProjDataInMemory(stir.ExamInfo(), projdata_info) forwardprojector.forward_project(measurement, phantomS[1]) measurement.write_to_file('sino_2.hs') measurementS = measurement.get_segment_by_sinogram(0) measurementP = stirextra.to_numpy(measurementS) reconImageS = stir.FloatVoxelsOnCartesianGrid(projdata_info, 1, stir.FloatCartesianCoordinate3D(stir.make_FloatCoordinate(0,0,0)),
#Negeer voor nu het initial estimate projection = stir.ProjDataInMemory(stir.ExamInfo(), projdata_info) MotionModel.setOffset(0.0) initialGuessPList = [] for i in range(nFrames): reconGuessS = stir.FloatVoxelsOnCartesianGrid( projdata_info, 1, stir.FloatCartesianCoordinate3D(stir.make_FloatCoordinate(0, 0, 0)), stir.IntCartesianCoordinate3D( stir.make_IntCoordinate( np.shape(originalImageP)[0], np.shape(originalImageP)[1], np.shape(originalImageP)[2]))) reconGuessS.fill(1) # moet er staan recon = stir.OSMAPOSLReconstruction3DFloat( projmatrix, 'config_Proj_{}.par'.format(i + 1)) recon.set_up(reconGuessS) recon.reconstruct(reconGuessS) initialGuessPtmp = stirextra.to_numpy(reconGuessS) initialGuessPList.append(initialGuessPtmp) guessP = np.mean(initialGuessPList, axis=0) plt.imshow(guessP[0, :, :], cmap=plt.cm.Greys_r, interpolation=None, vmin=0, vmax=0.5), plt.title('Initial guess') plt.savefig(figSaveDir + 'Fig{}_TrueShift{}_InitialGuess.png'.format( numFigures, trueShiftAmplitude)) numFigures += 1 plt.close()
stir.FloatCartesianCoordinate3D(stir.make_FloatCoordinate(0, 0, 0)), stir.IntCartesianCoordinate3D(stir.make_IntCoordinate(1, 160, 160))) fillStirSpace(guessS, guessP) slope = 0.0 offSet = 0.0 nFrames = 1 MotionModel = stir.MotionModel(nFrames, slope, offSet) # A motion model is compulsory projmatrix = stir.ProjMatrixByBinUsingRayTracing(MotionModel) projmatrix.set_num_tangential_LORs(nLOR) projmatrix.set_up(projdata_info, originalImageS) recon = stir.OSMAPOSLReconstruction3DFloat( projmatrix, 'config_TEST.par' ) # Uses sinoMeas_1.hs from LinearMotionModel1DProjSpace.py poissonobj = recon.get_objective_function() poissonobj.set_recompute_sensitivity(True) target = guessS recon.set_up(target) # Zonder attenuatie en scatter verandert de sensitiviteit (normalisatiemap) niet per iteratie, hij hangt nu alleen van dingen af als de scanner, dus die hoef je maar ��n keer te berekenen. poissonobj.set_recompute_sensitivity(False) # Je moet er nog steeds wel voor zorgen dat het mapje bestaat! num_subsets = recon.get_num_subsets() num_iterations = recon.get_num_subiterations() for iter in range(1, 5):