def main(): normalized = i3.normalize(ct_series, dfs, obs, workdir=os.path.join(workdir, 'normalization')) tilt_corrected = i3.correct_tilt(normalized, workdir=os.path.join( workdir, 'tilt-correction')) if_corrected = i3.correct_intensity_fluctuation( tilt_corrected, workdir=os.path.join(workdir, 'intensity-fluctuation-correction')) angles, sinograms = i3.build_sinograms(if_corrected, workdir=os.path.join( workdir, 'sinogram')) # take the middle part to calculate the center of rotation sino = [s.data for s in sinograms[900:1100]] sino = np.array(sino) proj = np.swapaxes(sino, 0, 1) rot_center = tomopy.find_center(proj, theta, emission=False, init=1024, tol=0.5) rot_center = rot_center[0] # reconstruct recon = i3.reconstruct(angles, sinograms, workdir=outdir, center=rot_center) return
def test(): normalized = i3.normalize(ct_series, dfs, obs, workdir=workdir) tilt_corrected = i3.correct_tilt(normalized, workdir=workdir) if_corrected = i3.correct_intensity_fluctuation(tilt_corrected, workdir=workdir) angles, sinograms = i3.build_sinograms(if_corrected, workdir=workdir) recon = i3.reconstruct(angles, sinograms, workdir=outdir) return
def main(): normalized = i3.normalize(ct_series, dfs, obs, workdir=os.path.join(workdir, 'normalization')) tilt_corrected = i3.correct_tilt(normalized, workdir=os.path.join(workdir, 'tilt-correction')) if_corrected = i3.correct_intensity_fluctuation(tilt_corrected, workdir=os.path.join(workdir, 'intensity-fluctuation-correction')) angles, sinograms = i3.build_sinograms(if_corrected, workdir=os.path.join(workdir, 'sinogram')) # take the middle part to calculate the center of rotation sino = [s.data for s in sinograms[900:1100]] sino= np.array(sino) proj = np.swapaxes(sino, 0, 1) rot_center = tomopy.find_center(proj, theta, emission=False, init=1024, tol=0.5) rot_center = rot_center[0] # reconstruct recon = i3.reconstruct(angles, sinograms, workdir=outdir, center=rot_center) return
def preprocess(self, workdir=None, outdir=None): workdir = workdir or self.workdir outdir = outdir or self.outdir # get image objs dfs = self.dfs; obs = self.obs ct_series = self.ct_series theta = self.theta # preprocess gamma_filtered = i3.gamma_filter( ct_series, workdir=os.path.join(workdir, 'gamma-filter'), parallel = self.parallel_preprocessing) normalized = i3.normalize(gamma_filtered, dfs, obs, workdir=os.path.join(workdir, 'normalization')) if self.clean_on_the_fly: gamma_filtered.removeAll() if_corrected = i3.correct_intensity_fluctuation(normalized, workdir=os.path.join(workdir, 'intensity-fluctuation-correction')) if self.clean_on_the_fly: normalized.removeAll() return if_corrected
def recon(self, workdir=None, outdir=None, outfilename_template=None, tilt=None, crop_window=None, smooth_projection=None, remove_rings_at_sinograms=None, smooth_recon=None, remove_rings=None, **kwds): """Run CT reconstruction workflow Parameters: * workdir: fast work dir * outdir: output dir. can be at a slower disk * crop_window: (xmin, ymin, xmax, ymax) * remove_rings_at_sinograms: remove ring artifacts by filtering sinograms - if ==False, no filtering - if is True, filtering with default parameters - if is a dictionary, will be used as kwd arguments for filtering component e.g. dict(average_window_size=20, Nsubsets=10, correction_range=(0.9, 1.1)) * smooth_recon: smooth the reconstruction result - if ==False, no smoothing - if is True, smoothing with default parameters - if is a dictionary, will be used as kwd arguments for smoothing component e.g. dict(algorithm='bilateral', sigma_color=0.0005, sigma_spatial=5) * smooth_projection: extra smoothing of projection - if ==False, no smoothing - if is True, smoothing with default parameters - if is a dictionary, will be used as kwd arguments for smoothing component e.g. dict(algorithm='bilateral', sigma_color=0.02, sigma_spatial=5) Default processing chain: * preprocess - gamma filtering - normalization * crop * median-filter (size 3) * (optional) smooth: by default, use bilateral filter * intensity fluctuation correction * tilt correction * create sinograms * (optional) apply ring-artifact-removal filter to sinograms * find center of rotation * reconstruction * (optional) smooth reconstruction """ workdir = workdir or self.workdir; outdir = outdir or self.outdir # preprocess pre = self.preprocess(workdir=workdir, outdir=outdir) # crop if crop_window is None: # auto-cropping cropped = self.autoCrop(pre) else: xmin, ymin, xmax, ymax = crop_window cropped = self.crop( pre, left=xmin, right=xmax, top=ymin, bottom=ymax) if self.clean_intermediate_files == 'on_the_fly': pre.removeAll() # median filter self.r.median_filtered = median_filtered = self.smooth( cropped, outname='median_filtered', algorithm='median', size=3) if smooth_projection: if smooth_projection is True: # default smooth smooth_projection = dict(algorithm='bilateral', sigma_color=0.02, sigma_spatial=5) pre = smoothed = self.smooth(median_filtered, outname='smoothed', **smooth_projection) self.r.smoothed_projection = smoothed else: pre = median_filtered # correct intensity fluctuation if_corrected = i3.correct_intensity_fluctuation( pre, workdir=os.path.join(workdir, 'intensity-fluctuation-correction')) if self.clean_intermediate_files == 'on_the_fly': pre.removeAll() # correct tilt pre = if_corrected if tilt is None: tilt_corrected, tilt = self.correctTilt_loop( pre, workdir=workdir) else: tilt_corrected, tilt = i3.correct_tilt( pre, tilt=tilt, workdir=os.path.join(workdir, 'tilt-correction' ), max_npairs=None, parallel=self.parallel_preprocessing) if self.clean_intermediate_files == 'on_the_fly': pre.removeAll() # self.r.cropped = cropped self.r.if_corrected = if_corrected self.r.tilt_corrected = tilt_corrected # reconstruct outfilename_template = outfilename_template or "recon_%04d.tiff" recon = self.reconstruct( tilt_corrected, workdir=workdir, outdir=outdir, remove_rings_at_sinograms=remove_rings_at_sinograms, outfilename_template=outfilename_template, **kwds) if smooth_recon: if smooth_recon is True: smooth_recon = dict(algorithm='bilateral', sigma_color=0.0005, sigma_spatial=5) from . import smooth recon = self.r.sm_recon = smooth( recon, workdir=os.path.join(self.outdir, 'smoothed'), parallel = self.parallel_preprocessing, filename_template='sm_' + outfilename_template, **smooth_recon) if remove_rings: self.removeRings(recon) # clean up import shutil if self.clean_intermediate_files == 'archive': archive_bg(workdir, outdir) elif self.clean_intermediate_files == 'on_the_fly': shutil.rmtree(workdir) return