Skip to content

nabu.estimation.tilt

source module nabu.estimation.tilt

Classes

source class CameraTilt(vert_fft_width=False, horz_fft_width=False, verbose=False, logger=None, data_type=np.float32, extra_options=None)

Bases : CenterOfRotation

Alignment basic functions.

Parameters

  • vert_fft_width : boolean, optional If True, restrict the vertical size to a power of 2:

    new_v_dim = 2 ** math.floor(math.log2(v_dim))
    
  • horz_fft_width : boolean, optional If True, restrict the horizontal size to a power of 2:

    new_h_dim = 2 ** math.floor(math.log2(h_dim))
    
  • verbose : boolean, optional When True it will produce verbose output, including plots.

  • data_type : numpy.<span class="mkapi-tooltip" title="numpy._core.float32">float32</span> Computation data type.

Methods

  • compute_angle Find the camera tilt, given two opposite images.

source method CameraTilt.compute_angle(img_1: np.ndarray, img_2: np.ndarray, method='1d-correlation', roi_yxhw=None, median_filt_shape=None, padding_mode=None, peak_fit_radius=1, high_pass=None, low_pass=None)

Find the camera tilt, given two opposite images.

This method finds the tilt between the camera pixel columns and the rotation axis, by performing a 1-dimensional correlation between two opposite images.

The output of this function, allows to compute motor movements for aligning the camera tilt.

Parameters

  • img_1 : numpy.ndarray First image

  • img_2 : numpy.ndarray Second image, it needs to have been flipped already (e.g. using numpy.fliplr).

  • method : str Tilt angle computation method. Default is "1d-correlation" (traditional). All options are: - "1d-correlation": fastest, but works best for small tilts - "fft-polar": slower, but works well on all ranges of tilts

  • roi_yxhw : (2, ) or (4, ) numpy.ndarray, tuple, or array, optional 4 elements vector containing: vertical and horizontal coordinates of first pixel, plus height and width of the Region of Interest (RoI). Or a 2 elements vector containing: plus height and width of the centered Region of Interest (RoI). Default is None -> deactivated.

  • median_filt_shape : (2, ) numpy.ndarray, tuple, or array, optional Shape of the median filter window. Default is None -> deactivated.

  • padding_mode : str in numpy.pad's mode list, optional Padding mode, which determines the type of convolution. If None or 'wrap' are passed, this resorts to the traditional circular convolution. If 'edge' or 'constant' are passed, it results in a linear convolution. Default is the circular convolution. All options are: None | 'constant' | 'edge' | 'linear_ramp' | 'maximum' | 'mean' | 'median' | 'minimum' | 'reflect' | 'symmetric' |'wrap'

  • peak_fit_radius : int, optional Radius size around the max correlation pixel, for sub-pixel fitting. Minimum and default value is 1.

  • low_pass : float or sequence of two floats Low-pass filter properties, as described in nabu.misc.fourier_filters

  • high_pass : float or sequence of two floats High-pass filter properties, as described in nabu.misc.fourier_filters

Raises

  • ValueError In case images are not 2-dimensional or have different sizes.

Returns

  • cor_offset_pix : float Estimated center of rotation position from the center of the RoI in pixels.

  • tilt_deg : float Estimated camera tilt angle in degrees.

Examples

The following code computes the center of rotation position for two given images in a tomography scan, where the second image is taken at 180 degrees from the first.

radio1 = data[0, :, :]
radio2 = np.fliplr(data[1, :, :])
tilt_calc = CameraTilt()
cor_offset, camera_tilt = tilt_calc.compute_angle(radio1, radio2)

Or for noisy images:

cor_offset, camera_tilt = tilt_calc.compute_angle(radio1, radio2, median_filt_shape=(3, 3))