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
Example #2
0
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')
Example #3
0
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
Example #5
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)