Exemplo n.º 1
0
am.set_num_tangential_LORs(5)
templ = pet.AcquisitionData('template_sinogram.hs')
am.set_up(templ, image)
#%% simulate some data using forward projection
acquired_data = am.forward(image)
acquisition_array = acquired_data.as_array()

#%% Display bitmaps of a middle sinogram
plt.figure()
imshow(acquisition_array[0, 0, :, :, ], [], 'Forward projection')

#%% close all plots
plt.close('all')

#%% create objective function
obj_fun = pet.make_Poisson_loglikelihood(acquired_data)
# We could set acquisition model but the default (ray-tracing) is in this case ok
# obj_fun.set_acquisition_model(am)
#obj_fun.set_prior(prior)

#%% create OSMAPOSL reconstructor
# This implements the Ordered Subsets Maximum A-Posteriori One Step Late
# Since we are not using a penalty, or prior in this example, it
# defaults to using MLEM, but we will modify it to OSEM
recon = pet.OSMAPOSLReconstructor()
recon.set_objective_function(obj_fun)
recon.set_num_subsets(4)
num_iters = 10
recon.set_num_subiterations(num_iters)
#%%  create initial image
# we could just use a uniform image but here we will create a disk with a different
Exemplo n.º 2
0
def main():

    # output goes to files
    msg_red = pet.MessageRedirector('info.txt', 'warn.txt', 'errr.txt')

    # create acquisition model
    acq_model = pet.AcquisitionModelUsingRayTracingMatrix()

    # PET acquisition data to be read from the file specified by --file option
    print('raw data: %s' % raw_data_file)
    acq_data = pet.AcquisitionData(raw_data_file)

    # Noisy data for testing
    noisy_data = acq_data.clone()
    noisy_data_array = np.random.poisson(acq_data.as_array() / 10)
    noisy_data.fill(noisy_data_array)

    # create filter that zeroes the image outside a cylinder of the same
    # diameter as the image xy-section size
    filter = pet.TruncateToCylinderProcessor()

    # create initial image estimate
    image_size = (111, 111, 31)
    voxel_size = (3, 3, 3.375)  # voxel sizes are in mm
    image = pet.ImageData()
    image.initialise(image_size, voxel_size)
    image.fill(1.0)
    filter.apply(image)

    # create objective function
    obj_fun = pet.make_Poisson_loglikelihood(noisy_data)
    obj_fun.set_acquisition_model(acq_model)
    obj_fun.set_num_subsets(num_subsets)
    obj_fun.set_up(image)

    # create new obj_fun to get sensitivity image for one subset for dePierro MAPEM
    obj_fun2 = pet.make_Poisson_loglikelihood(noisy_data)
    obj_fun2.set_acquisition_model(acq_model)
    obj_fun2.set_num_subsets(1)
    obj_fun2.set_up(image)
    sensitivity_image = obj_fun2.get_subset_sensitivity(0)

    # create new noise-free obj_fun to use for guidance in dePierro MAPEM
    obj_fun3 = pet.make_Poisson_loglikelihood(acq_data)
    obj_fun3.set_acquisition_model(acq_model)
    obj_fun3.set_num_subsets(num_subsets)
    obj_fun3.set_up(image)

    # uniform weights
    weightsUniform = np.ones([sensitivity_image.as_array().size, 27],
                             dtype='float')
    weightsUniform = weightsUniform / 27.0

    # noise free recon with beta = 0 for guidance
    image_noiseFree = my_dePierroMap \
        (image, obj_fun3, 0, filter, num_subsets, num_subiterations, weightsUniform, sensitivity_image)

    # create a Prior for computing Bowsher weights
    myPrior = pr.Prior(sensitivity_image.as_array().shape)
    weightsBowsher = myPrior.BowshserWeights(image_noiseFree.as_array(), 10)
    weightsBowsher = np.float64(weightsBowsher / 10.0)

    # dePierro MAPEM with uniform and Bowsher weights
    beta = 5000.0
    image_dp_b = my_dePierroMap \
        (image, obj_fun, beta, filter, num_subsets, num_subiterations, weightsBowsher, sensitivity_image)

    image_dp_u = my_dePierroMap \
        (image, obj_fun, beta, filter, num_subsets, num_subiterations, weightsUniform, sensitivity_image)

    # show reconstructed images at z = 20
    image_dp_b_array = image_dp_b.as_array()
    image_dp_u_array = image_dp_u.as_array()
    show_2D_array('Noise free image', image_noiseFree.as_array()[20, :, :])
    show_2D_array('DP Bowsher', image_dp_b_array[20, :, :])
    show_2D_array('DP Uniform', image_dp_u_array[20, :, :])
    show_2D_array('Difference DP',
                  image_dp_b_array[20, :, :] - image_dp_u_array[20, :, :])