Exemplo n.º 1
0
#
# 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):