123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- from scipy.io.idl import readsav
- from .io import read_tif_2Dor3D
- from scipy.ndimage.morphology import binary_erosion
- import numpy as np
- def get_area(flags):
- """
- Get the area mask for the flags given
- Raises
- :param flags: FlagsManager object
- :return:
- """
- mask_path = flags.get_existing_area_filepath()
- if mask_path is None:
- raise FileNotFoundError("Could not find area file")
- frame_mask = read_area_file(str(mask_path))
- return frame_mask
- def frame_mask2perim(frame_mask):
- eroded_mask = binary_erosion(frame_mask)
- return frame_mask & (~eroded_mask)
- def read_area_file(fle):
- if fle.endswith(".Area"):
- return AreaMaskIO.read_mask_from_file(fle)
- elif fle.endswith(".area.tif"):
- return TIFMaskIO.read_mask_from_file(fle)
- else:
- raise NotImplementedError
- class BaseMaskIO(object):
- def __init__(self):
- super().__init__()
- @classmethod
- def read_mask_from_file(cls, file):
- pass
- @classmethod
- def write_mask_to_file(cls, frame_data, file):
- pass
- class AreaMaskIO(BaseMaskIO):
- def __init__(self):
- super().__init__()
- @classmethod
- def read_mask_from_file(cls, file):
- """
- Read and returns a boolean mask for VIEW from `file`
- :param str file: path to an AREA file
- :return: boolean 2D mask
- :rtype: numpy.ndarray
- """
- mask_uint8_XY_y_flipped = cls.read_footprint(file)
- mask_XY_y_flipped = mask_uint8_XY_y_flipped > 0
- return mask_XY_y_flipped
- @classmethod
- def read_footprint(cls, file):
- """
- Reads the AREA file in `file` and returns a 2D ndarray of type uint8
- :param str file: path to an AREA file
- :return: uint8 2D array
- :rtype: numpy.ndarray
- """
- mask_uint8_YX = readsav(file).maskframe
- mask_uint8_XY = mask_uint8_YX.swapaxes(0, 1)
- mask_uint8_XY_y_flipped = np.flip(mask_uint8_XY, axis=1)
- return mask_uint8_XY_y_flipped
- @classmethod
- def write_mask_to_file(cls, frame_data, file):
- raise NotImplementedError
- class TIFMaskIO(BaseMaskIO):
- def __init__(self):
- super().__init__()
- @classmethod
- def read_mask_from_file(cls, file):
- frame_mask_float, _ = read_tif_2Dor3D(file)
- frame_mask = (frame_mask_float > 0).any(axis=2)
- return frame_mask
- @classmethod
- def write_mask_to_file(cls, frame_data, file):
- raise NotImplementedError
- def get_area_for_p1(frame_size, flags):
- try:
- area = get_area(flags)
- except FileNotFoundError as fnfe:
- area = np.ones(frame_size, dtype=bool)
- return area
- def get_area_for_bleach_correction(area_mask, LE_BleachCutBorder, LE_BleachExcludeArea):
- if LE_BleachExcludeArea:
- mask_frame = area_mask
- else:
- frame_size = area_mask.shape
- mask_frame = np.zeros(frame_size, dtype=bool)
- x_to_cut = round(frame_size[0] * LE_BleachCutBorder / 100)
- y_to_cut = round(frame_size[1] * LE_BleachCutBorder / 100)
- mask_frame[x_to_cut: frame_size[0] - x_to_cut, y_to_cut: frame_size[1] - y_to_cut] = True
- return mask_frame
|