def _adjust_hist_limits(tomo, theta, ind, mask, emission): # Make an initial reconstruction to adjust histogram limits. rec = recon(tomo, theta, emission=emission, algorithm='gridrec') # Apply circular mask. if mask is True: rec = circ_mask(rec, axis=0) # Adjust histogram boundaries according to reconstruction. return _adjust_hist_min(rec.min()), _adjust_hist_max(rec.max())
def _find_center_cost( center, tomo, theta, ind, hmin, hmax, mask, ratio, emission): """ Cost function used for the ``find_center`` routine. """ logger.info('trying center: %s', center) center = np.array(center, dtype='float32') rec = recon( tomo[:, ind:ind + 1, :], theta, center, emission=emission, algorithm='gridrec') if mask is True: rec = circ_mask(rec, axis=0) hist, e = np.histogram(rec, bins=64, range=[hmin, hmax]) hist = hist.astype('float32') / rec.size + 1e-12 return -np.dot(hist, np.log2(hist))
def _find_center_cost(center, tomo, theta, ind, hmin, hmax, mask, ratio, emission): """ Cost function used for the ``find_center`` routine. """ logger.info('trying center: %s', center) center = np.array(center, dtype='float32') rec = recon(tomo[:, ind:ind + 1, :], theta, center, emission=emission, algorithm='gridrec') if mask is True: rec = circ_mask(rec, axis=0) hist, e = np.histogram(rec, bins=64, range=[hmin, hmax]) hist = hist.astype('float32') / rec.size + 1e-12 return -np.dot(hist, np.log2(hist))
def write_center( tomo, theta, dpath='tmp/center', cen_range=None, ind=None, emission=True, mask=False, ratio=1.): """ Save images reconstructed with a range of rotation centers. Helps finding the rotation center manually by visual inspection of images reconstructed with a set of different centers.The output images are put into a specified folder and are named by the center position corresponding to the image. Parameters ---------- tomo : ndarray 3D tomographic data. theta : array Projection angles in radian. dpath : str, optional Folder name to save output images. cen_range : list, optional [start, end, step] Range of center values. ind : int, optional Index of the slice to be used for reconstruction. emission : bool, optional Determines whether data is emission or transmission type. mask : bool, optional If ``True``, apply a circular mask to the reconstructed image to limit the analysis into a circular region. ratio : float, optional The ratio of the radius of the circular mask to the edge of the reconstructed image. """ tomo = dtype.as_float32(tomo) theta = dtype.as_float32(theta) dx, dy, dz = tomo.shape if ind is None: ind = dy / 2 if cen_range is None: center = np.arange(dz / 2 - 5, dz / 2 + 5, 0.5) else: center = np.arange(cen_range[0], cen_range[1], cen_range[2] / 2.) stack = np.zeros((dx, len(center), dz)) for m in range(center.size): stack[:, m, :] = tomo[:, ind, :] # Reconstruct the same slice with a range of centers. rec = recon( stack, theta, center=center, emission=emission, algorithm='gridrec') # Apply circular mask. if mask is True: rec = circ_mask(rec, axis=0) # Save images to a temporary folder. for m in range(len(center)): if m % 2 == 0: # 2 slices same bec of gridrec. fname = os.path.join( dpath, str('{:.2f}'.format(center[m]) + '.tiff')) write_tiff(rec[m:m + 1], fname=fname, overwrite=True)
def write_center(tomo, theta, dpath='tmp/center', cen_range=None, ind=None, emission=True, mask=False, ratio=1.): """ Save images reconstructed with a range of rotation centers. Helps finding the rotation center manually by visual inspection of images reconstructed with a set of different centers.The output images are put into a specified folder and are named by the center position corresponding to the image. Parameters ---------- tomo : ndarray 3D tomographic data. theta : array Projection angles in radian. dpath : str, optional Folder name to save output images. cen_range : list, optional [start, end, step] Range of center values. ind : int, optional Index of the slice to be used for reconstruction. emission : bool, optional Determines whether data is emission or transmission type. mask : bool, optional If ``True``, apply a circular mask to the reconstructed image to limit the analysis into a circular region. ratio : float, optional The ratio of the radius of the circular mask to the edge of the reconstructed image. """ tomo = dtype.as_float32(tomo) theta = dtype.as_float32(theta) dx, dy, dz = tomo.shape if ind is None: ind = dy / 2 if cen_range is None: center = np.arange(dz / 2 - 5, dz / 2 + 5, 0.5) else: center = np.arange(cen_range[0], cen_range[1], cen_range[2] / 2.) stack = np.zeros((dx, len(center), dz)) for m in range(center.size): stack[:, m, :] = tomo[:, ind, :] # Reconstruct the same slice with a range of centers. rec = recon(stack, theta, center=center, emission=emission, algorithm='gridrec') # Apply circular mask. if mask is True: rec = circ_mask(rec, axis=0) # Save images to a temporary folder. for m in range(len(center)): if m % 2 == 0: # 2 slices same bec of gridrec. fname = os.path.join(dpath, str('{:.2f}'.format(center[m]) + '.tiff')) write_tiff(rec[m:m + 1], fname=fname, overwrite=True)