Source code for stimupy.utils.masks

import numpy as np

__all__ = [
    "avg_target_values",
    "avg_img_values",
    "all_img_values",
    "img_values",
]


[docs] def avg_target_values(stim, mask_key="target_mask", f_average=np.median): """Average pixel value in each target region of stimulus Parameters ---------- stim : dict[str: Any] stimulus-dict with at least "img" and "mask" containing the stimulus image and integer-mask, respectively. mask_key : str string with mask-key name f_average: function, default=numpy.median How to average/summarise the pixels in each target region Returns ------- list[float] each entry in the list is the average value of pixels in target region, index in the list is the integer index in the mask See Also -------- avg_img_values """ return avg_img_values(image=stim["img"], mask=stim[mask_key], f_average=f_average)
[docs] def avg_img_values(image, mask, f_average=np.median): """Average values of pixels in image, per target region in integer mask Values are calculated as means or medians, depending on the mode. Parameters ---------- image : 2D numpy array 2D numpy array containing pixel values of the image mask : 2D numpy array 2D numpy array of same size as image. Each target patch has an integer value. Each pixel inside this patch has this integer value. Patches do not need to be continuous. f_average: function, default=numpy.median How to average/summarise the pixels in each target region Returns ------- list[float] each entry in the list is the average value of pixels in target region, index in the list is the integer index in the mask See Also -------- all_img_values """ masked_outputs = all_img_values(image, mask) values = [f_average(o[np.isfinite(o)]) for o in masked_outputs] return values
[docs] def all_img_values(img, mask): """Isolate all image values/pixels, per target region specified in integer mask Parameters ---------- img : numpy.ndarray Image-array of pixel values to be masked mask : numpy.ndarray Array of same size as img. Each region-of-interest in mask is represented by an integer index. Each pixel inside this patch has this integer value. Patches do not need to be contiguous. Returns ------- list[numpy.arrays] Each image/element of the list is a numpy.ndarray representing an image. There is one image for each target patch in the integer mask. In each image all values are set to NaN except the ones corresponding to the target values of the respective target patch. See Also -------- img_values """ idc = np.unique(mask.astype(int)) imgs = [img_values(img, mask == idx) for idx in idc] return imgs
[docs] def img_values(img, mask): """Isolate only image pixels specified by a binary mask Parameters ---------- img : numpy.ndarray Image-array of pixel values to be masked mask : numpy.ndarray Array of same size as img. All non-zero pixels/values are treated as ones in a binary bit mask. Returns ------- numpy.ndarray numpy.ndarray of same size as img. All bits corresponding to zero bits in the mask are set to NaN. """ return np.where(mask, img, np.nan)