def normaliser_sim(projData3D, flatSIM, sigma_flats=0.05, flux_intensity=30000): """ projData3D - 3D projection data (noiseless) [DetectorsDimV, Proj_angles, DetectorsDimH] maxthickness - a value in pixels which controls the width of stripes sigma_flats - a noise level (Gaussian) in flats, do not set too high to avoid outliers flux_intensity - controls the level of Posson noise applied to projection data """ [DetectorsDimV, Proj_angles, DetectorsDimH] = np.shape(projData3D) [flatsnum, DetectorsDimV_f, DetectorsDimH_f] = np.shape(flatSIM) if (DetectorsDimV != DetectorsDimV_f): raise ( "The size of the vertical detector for data and the flat field is different " ) if (DetectorsDimH != DetectorsDimH_f): raise ( "The size of the horizontal detector for data and the flat field is different " ) # add noise to the stack of flat images artifacts_add = ArtifactsClass(flatSIM) flat_all_noise = artifacts_add.noise(sigma=sigma_flats, noisetype='Gaussian') flat_average_noise = np.average(flat_all_noise, 0) # calculate average of all flats nonzeroInd = np.where(flat_average_noise != 0) # nonzero data zeroInd = np.where(flat_average_noise == 0) # zero data projData3D_norm = np.zeros(np.shape(projData3D), dtype='float32') for x in range(0, Proj_angles): proj2D = projData3D[:, x, :] norm_proj = np.zeros(np.shape(proj2D)) randflatind = random.randint(0, flatsnum - 1) # generate random flat number proj_flat = flatSIM[randflatind, :, :] * proj2D artifacts_add = ArtifactsClass(proj_flat) # adding Poisson noise proj_flat_noisy = artifacts_add.noise(sigma=flux_intensity, noisetype='Poisson') norm_proj[nonzeroInd] = proj_flat_noisy[ nonzeroInd] / flat_average_noise[nonzeroInd] norm_proj[zeroInd] = 1e-13 projData3D_norm[:, x, :] = np.float32(norm_proj) return projData3D_norm
sliceSel = 150 plt.figure() plt.subplot(131) plt.imshow(projData3D_analyt[:, sliceSel, :], vmin=0, vmax=intens_max) plt.title('2D Projection (analytical)') plt.subplot(132) plt.imshow(projData3D_analyt[sliceSel, :, :], vmin=0, vmax=intens_max) plt.title('Sinogram view') plt.subplot(133) plt.imshow(projData3D_analyt[:, :, sliceSel], vmin=0, vmax=intens_max) plt.title('Tangentogram view') plt.show() #%% print("Adding noise to projection data") from tomophantom.supp.artifacts import ArtifactsClass artifacts_add = ArtifactsClass(projData3D_analyt) projData3D_analyt_noisy = artifacts_add.noise(sigma=15000, noisetype='Poisson') intens_max = 70 sliceSel = 150 plt.figure() plt.subplot(131) plt.imshow(projData3D_analyt_noisy[:, sliceSel, :], vmin=0, vmax=intens_max) plt.title('2D noisy Projection (analytical)') plt.subplot(132) plt.imshow(projData3D_analyt_noisy[sliceSel, :, :], vmin=0, vmax=intens_max) plt.title('Noisy sinogram view') plt.subplot(133) plt.imshow(projData3D_analyt_noisy[:, :, sliceSel], vmin=0, vmax=intens_max) plt.title('Noisy tangentogram view')
angles_rad = angles*(np.pi/180.0) P = int(np.sqrt(2)*N_size) #detectors sino_an = TomoP2D.ModelSino(model, N_size, P, angles, path_library2D) plt.figure(2) plt.rcParams.update({'font.size': 21}) plt.imshow(sino_an, cmap="gray") plt.colorbar(ticks=[0, 150, 250], orientation='vertical') plt.title('{}''{}'.format('Analytical sinogram of model no.',model)) #%% # Adding artifacts and noise from tomophantom.supp.artifacts import ArtifactsClass # adding noise artifacts_add = ArtifactsClass(sino_an) #noisy_sino = artifacts_add.noise(sigma=0.1,noisetype='Gaussian')nonnegativity noisy_sino = artifacts_add.noise(sigma=8000,noisetype='Poisson') plt.figure() plt.rcParams.update({'font.size': 21}) plt.imshow(noisy_sino,cmap="gray") plt.colorbar(ticks=[0, 150, 250], orientation='vertical') plt.title('{}''{}'.format('Analytical noisy sinogram',model)) print ("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") print ("%%%%%%%%%%%%%%Reconstructing with FBP method %%%%%%%%%%%%%%%") print ("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%") from tomobar.methodsDIR import RecToolsDIR RectoolsDIR = RecToolsDIR(DetectorsDimH = P, # DetectorsDimH # detector dimension (horizontal) DetectorsDimV = None, # DetectorsDimV # detector dimension (vertical) for 3D case only
P = int(np.sqrt(2) * N_size) #detectors sino_an = TomoP2D.ModelSino(model, N_size, P, angles, path_library2D) plt.figure(2) plt.rcParams.update({'font.size': 21}) plt.imshow(sino_an, cmap="gray") plt.colorbar(ticks=[0, 150, 250], orientation='vertical') plt.title('{}' '{}'.format('Analytical sinogram of model no.', model)) #%% # Adding artifacts and noise from tomophantom.supp.artifacts import ArtifactsClass # adding noise artifacts_add = ArtifactsClass(sino_an) #noisy_sino = artifacts_add.noise(sigma=0.1,noisetype='Gaussian') noisy_sino = artifacts_add.noise(sigma=10000, noisetype='Poisson') # adding object shifts (misalignment) artifacts_add = ArtifactsClass(noisy_sino) noisy_sino_misalign = artifacts_add.shifts(maxamplitude=10) # adding zingers artifacts_add = ArtifactsClass(noisy_sino) noisy_zing = artifacts_add.zingers(percentage=0.25, modulus=10) #adding stripes artifacts_add = ArtifactsClass(noisy_zing) noisy_zing_stripe = artifacts_add.stripes(percentage=1, maxthickness=1) noisy_zing_stripe[noisy_zing_stripe < 0] = 0
from ccpi.filters.regularisers import ROF_TV, FGP_TV, SB_TV, LLT_ROF, TGV, NDF, Diff4th #%% print ("Building 3D phantom using TomoPhantom software") tic=timeit.default_timer() model = 16 # select a model number from the library N_size = 128 # Define phantom dimensions using a scalar value (cubic phantom) path = os.path.dirname(tomophantom.__file__) path_library3D = os.path.join(path, "Phantom3DLibrary.dat") #This will generate a N_size x N_size x N_size phantom (3D) phantom_tm = TomoP3D.Model(model, N_size, path_library3D) toc=timeit.default_timer() Run_time = toc - tic print("Phantom has been built in {} seconds".format(Run_time)) # adding normally distributed noise artifacts_add = ArtifactsClass(phantom_tm) phantom_noise = artifacts_add.noise(sigma=0.1,noisetype='Gaussian') sliceSel = int(0.5*N_size) #plt.gray() plt.figure() plt.subplot(131) plt.imshow(phantom_noise[sliceSel,:,:],vmin=0, vmax=1.4) plt.title('3D Phantom, axial view') plt.subplot(132) plt.imshow(phantom_noise[:,sliceSel,:],vmin=0, vmax=1.4) plt.title('3D Phantom, coronal view') plt.subplot(133) plt.imshow(phantom_noise[:,:,sliceSel],vmin=0, vmax=1.4)