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))
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")
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)
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)
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)