Source code for panoptes.utils.images.focus

import numpy as np


[docs]def focus_metric(data, merit_function='vollath_F4', **kwargs): """Compute the focus metric. Computes a focus metric on the given data using a supplied merit function. The merit function can be passed either as the name of the function (must be defined in this module) or as a callable object. Additional keyword arguments for the merit function can be passed as keyword arguments to this function. Args: data (numpy array) -- 2D array to calculate the focus metric for. merit_function (str/callable) -- Name of merit function (if in panoptes.utils.images) or a callable object. Returns: scalar: result of calling merit function on data """ if isinstance(merit_function, str): try: merit_function = globals()[merit_function] except KeyError: raise KeyError(f'Focus merit function {merit_function} not found.') return merit_function(data, **kwargs)
[docs]def vollath_F4(data, axis=None): """Compute F4 focus metric Computes the F_4 focus metric as defined by Vollath (1998) for the given 2D numpy array. The metric can be computed in the y axis, x axis, or the mean of the two (default). Arguments: data (numpy array) -- 2D array to calculate F4 on. axis (str, optional, default None) -- Which axis to calculate F4 in. Can be 'Y'/'y', 'X'/'x' or None, which will calculate the F4 value for both axes and return the mean. Returns: float64: Calculated F4 value for y, x axis or both """ # This calculation is prone to integer overflow if data is an integer type # so convert to float64 before doing anything else. data = data.astype(np.float64) def _vollath_F4_y(): A1 = (data[1:] * data[:-1]).mean() A2 = (data[2:] * data[:-2]).mean() return A1 - A2 def _vollath_F4_x(): A1 = (data[:, 1:] * data[:, :-1]).mean() A2 = (data[:, 2:] * data[:, :-2]).mean() return A1 - A2 if str(axis).lower() == 'y': return _vollath_F4_y() elif str(axis).lower() == 'x': return _vollath_F4_x() elif not axis: return (_vollath_F4_y() + _vollath_F4_x()) / 2 else: raise ValueError(f"axis must be one of 'Y', 'y', 'X', 'x' or None, got {axis}!")