print("2 -> Calculate the center-of-rotation...")
sinogram = corr.flat_field_correction(data[0:num_proj, mid_slice, left:right],
                                      flat_field[mid_slice, left:right],
                                      dark_field[mid_slice, left:right])
center = calc.find_center_vo(sinogram)
print("Center-of-rotation = {0}".format(center))
for i in range(num_tomo):
    folder_name = "tomo_" + ("0000" + str(i))[-5:]
    thetas = np.deg2rad(angles[i * num_proj:(i + 1) * num_proj])
    for slice_idx in range(start_slice, stop_slice + 1, step_slice):
        sinogram = corr.flat_field_correction(
            data[i * num_proj:(i + 1) * num_proj, slice_idx, left:right],
            flat_field[slice_idx, left:right], dark_field[slice_idx,
                                                          left:right])
        sinogram = remo.remove_zinger(sinogram, 0.05, 1)
        sinogram = remo.remove_all_stripe(sinogram, 3.0, 51, 17)
        sinogram = filt.fresnel_filter(sinogram, 100)
        # img_rec = reco.dfi_reconstruction(sinogram, center, angles=thetas, apply_log=True)
        # img_rec = reco.gridrec_reconstruction(sinogram, center, angles=thetas, apply_log=True)
        img_rec = reco.fbp_reconstruction(sinogram,
                                          center,
                                          angles=thetas,
                                          apply_log=True)
        file_name = "rec_slice_" + ("0000" + str(slice_idx))[-5:] + ".tif"
        losa.save_image(output_base + "/" + folder_name + "/" + file_name,
                        img_rec)
    print("Done tomograph {0}".format(i))

time_stop = timeit.default_timer()
print("All done!!! Total time cost: {}".format(time_stop - time_start))
Example #2
0
center = calc.find_center_vo(sino_center)
print("Center of rotation {}".format(center))

fluct_correct = False  # Using double-wedge filter to correct the
# fluctuation of phase sinograms
artifact_rem = False  # Remove ring artifacts
t0 = timeit.default_timer()
for i in np.arange(start_slice, stop_slice + 1, step):
    name = ("0000" + str(i))[-5:]
    sino_phase = phase_hdf[:, i, :]
    if fluct_correct:
        sino_phase = filt.double_wedge_filter(sino_phase, center)
    sino_trans = trans_hdf[:, i, :]
    sino_dark = dark_hdf[:, i, :]
    if artifact_rem:
        sino_phase = rem.remove_all_stripe(sino_phase, 2.0, 51, 17)
        sino_trans = rem.remove_all_stripe(sino_trans, 2.0, 51, 17)
        sino_dark = rem.remove_all_stripe(sino_dark, 2.0, 51, 17)
    # Change to CPU methods (DFI or gridrec) if GPU not available
    rec_phase = reco.fbp_reconstruction(sino_phase,
                                        center,
                                        apply_log=False,
                                        filter_name="hann")
    rec_trans = reco.fbp_reconstruction(sino_trans,
                                        center,
                                        apply_log=True,
                                        filter_name="hann")
    rec_dark = reco.fbp_reconstruction(sino_dark,
                                       center,
                                       apply_log=True,
                                       filter_name="hann")
Example #3
0
t0 = timeit.default_timer()
print(
    "2 -> Calculate the center-of-rotation, the overlap-side and overlap-area used for stitching"
)
(center0, overlap, side, _) = calc.find_center_360(sino_360, 100)
print(
    "Center-of-rotation: {0}. Side: {1} (0->'left', 1->'right'). Overlap: {2}".
    format(center0, side, overlap))
t1 = timeit.default_timer()
print("Time cost {}".format(t1 - t0))

# Remove artifacts. They also can be passed to flat_field_correction method above as parameters.
# Remove zingers
sino_360 = remo.remove_zinger(sino_360, 0.08)
# Remove ring artifacts
sino_360 = remo.remove_all_stripe(sino_360, 3, 51, 17)

# 1st way: Convert the 360-degree sinogram to the 180-degree sinogram.
sino_180, center1 = conv.convert_sinogram_360_to_180(sino_360, center0)
losa.save_image(output_base + "/reconstruction/sino_180.tif", sino_180)
## Denoising
sino_180 = filt.fresnel_filter(sino_180, 250, 1, apply_log=True)
# Perform reconstruction
img_rec = reco.dfi_reconstruction(sino_180, center1, apply_log=True)
## Using fbp with GPU for faster reconstruction
# img_rec = reco.fbp_reconstruction(sino_180, center1, apply_log=True, gpu=True)
losa.save_image(output_base + "/reconstruction/recon_image_1.tif", img_rec)

# 2nd way: Extending the 360-degree sinogram (by weighting and padding).
(sino_ext, center2) = conv.extend_sinogram(sino_360, center0)
losa.save_image(output_base + "/reconstruction/sino_360_extened.tif", sino_ext)
Example #4
0
rec_image = reco.fbp_reconstruction(sinogram, center, apply_log=False)
losa.save_image(output_base + "/recon_fbp.tif", rec_image)

# Convert to X-ray image
sinogram = sim.convert_to_Xray_image(sinogram)
# Add noise
sinogram = sim.add_noise(sinogram, noise_ratio=0.1)
# Add stripe artifacts
sinogram = sim.add_stripe_artifact(sinogram, 2, size // 4, strength_ratio=0.3,
                                   stripe_type="partial")
sinogram = sim.add_stripe_artifact(sinogram, 1, size // 3, strength_ratio=0.3,
                                   stripe_type="full")
sinogram = sim.add_stripe_artifact(sinogram, 2, size // 2 + size // 3,
                                   strength_ratio=0.7, stripe_type="dead")
sinogram = sim.add_stripe_artifact(sinogram, 1, size // 2 - size // 4,
                                   strength_ratio=0.2,
                                   stripe_type="fluctuating")
losa.save_image(output_base + "/sinogram_with_artifacts.tif", sinogram)
# Reconstruct
rec_image = reco.dfi_reconstruction(sinogram, center)
losa.save_image(output_base + "/recon_with_artifacs.tif", rec_image)

# Remove stripe artifacts
sinogram = rem.remove_all_stripe(sinogram, 2.0, 9, 5)
# Denoise
sinogram = filt.fresnel_filter(sinogram, 50)
losa.save_image(output_base + "/sinogram_after_artifact_removed.tif", sinogram)
# Reconstruct
rec_image = reco.dfi_reconstruction(sinogram, center)
losa.save_image(output_base + "/recon_after_artifacs_removed.tif", rec_image)
Example #5
0
 def test_remove_all_stripe(self):
     mat = np.random.rand(self.size, self.size)
     mat[:, self.b:self.e] = 6.0
     mat_corr = remo.remove_all_stripe(mat, 1.5, 5, 3)
     num = np.abs(np.mean(mat_corr[:, self.b:self.e]) - 6.0)
     self.assertTrue(num > self.eps)