Skip to content
Snippets Groups Projects
Commit 75dca594 authored by Christopher Randolph Rhodes's avatar Christopher Randolph Rhodes
Browse files

Test cover use .data_xy and .data_xyz properties

parent d29a9d6b
No related branches found
No related tags found
2 merge requests!65Release 2024.10.01,!57RoiSet facilitates object detection models
This commit is part of merge request !57. Comments created here will be created in the context of that merge request.
......@@ -64,14 +64,14 @@ class GenericImageDataAccessor(ABC):
@property
def data_xy(self) -> np.ndarray:
if not self.nc == 1 and self.nz == 1:
if not self.chroma == 1 and self.nz == 1:
raise InvalidDataShape('Can only return XY array from accessors with a single channel and single z-level')
else:
return self.data[:, :, 0, 0]
@property
def data_xyz(self) -> np.ndarray:
if not self.nc == 1:
if not self.chroma == 1:
raise InvalidDataShape('Can only return XYZ array from accessors with a single channel')
else:
return self.data[:, :, 0, :]
......
......@@ -71,7 +71,7 @@ def get_label_ids(acc_seg_mask: GenericImageDataAccessor, allow_3d=False, connec
"""
if allow_3d and connect_3d:
nda_la = label(
acc_seg_mask.data[:, :, 0, :],
acc_seg_mask.data_xyz,
connectivity=3,
).astype('uint16')
return InMemoryDataAccessor(np.expand_dims(nda_la, 2))
......@@ -80,7 +80,7 @@ def get_label_ids(acc_seg_mask: GenericImageDataAccessor, allow_3d=False, connec
la_3d = np.zeros((*acc_seg_mask.hw, 1, acc_seg_mask.nz), dtype='uint16')
for zi in range(0, acc_seg_mask.nz):
la_2d = label(
acc_seg_mask.data[:, :, 0, zi],
acc_seg_mask.data_xyz[:, :, zi],
connectivity=2,
).astype('uint16')
la_2d[la_2d > 0] = la_2d[la_2d > 0] + nla
......@@ -90,7 +90,7 @@ def get_label_ids(acc_seg_mask: GenericImageDataAccessor, allow_3d=False, connec
else:
return InMemoryDataAccessor(
label(
acc_seg_mask.data[:, :, 0, :].max(axis=-1),
acc_seg_mask.data_xyz.max(axis=-1),
connectivity=1,
).astype('uint16')
)
......@@ -152,7 +152,7 @@ def make_df_from_object_ids(acc_raw, acc_obj_ids, expand_box_by) -> pd.DataFrame
if acc_obj_ids.nz == 1: # deproject objects' z-coordinates from argmax of raw image
df = pd.DataFrame(regionprops_table(
acc_obj_ids.data[:, :, 0, 0],
acc_obj_ids.data_xy,
intensity_image=acc_raw.data.argmax(axis=3, keepdims=True)[:, :, 0, 0].astype('uint16'),
properties=('label', 'area', 'intensity_mean', 'bbox')
)).rename(columns={'bbox-0': 'y0', 'bbox-1': 'x0', 'bbox-2': 'y1', 'bbox-3': 'x1'})
......@@ -160,7 +160,7 @@ def make_df_from_object_ids(acc_raw, acc_obj_ids, expand_box_by) -> pd.DataFrame
else: # objects' z-coordinates come from arg of max count in object identities map
df = pd.DataFrame(regionprops_table(
acc_obj_ids.data[:, :, 0, :],
acc_obj_ids.data_xyz,
properties=('label', 'area', 'bbox')
)).rename(columns={
'bbox-0': 'y0', 'bbox-1': 'x0', 'bbox-2': 'z0', 'bbox-3': 'y1', 'bbox-4': 'x1', 'bbox-5': 'z1'
......@@ -171,7 +171,7 @@ def make_df_from_object_ids(acc_raw, acc_obj_ids, expand_box_by) -> pd.DataFrame
def _make_binary_mask(r):
acc = InMemoryDataAccessor(acc_obj_ids.data == r.label)
cropped = acc.get_mono(0, mip=True).crop_hw((r.y0, r.x0, (r.y1 - r.y0), (r.x1 - r.x0))).data[:, :, 0, 0]
cropped = acc.get_mono(0, mip=True).crop_hw((r.y0, r.x0, (r.y1 - r.y0), (r.x1 - r.x0))).data_xy
return cropped
df['binary_mask'] = df.apply(
......@@ -581,7 +581,7 @@ class RoiSet(object):
if white_channel:
assert white_channel < raw.chroma
stack = raw.data[:, :, [white_channel, white_channel, white_channel], :]
stack = raw.data[:, :, [white_channel, white_channel, white_channel], :] # TODO: remove direct data access
else:
stack = np.zeros([*raw.shape[0:2], 3, raw.shape[3]], dtype=raw.dtype)
......@@ -593,7 +593,7 @@ class RoiSet(object):
stack[:, :, ii, :] = safe_add(
stack[:, :, ii, :], # either black or grayscale channel
rgb_overlay_weights[ii],
raw.data[:, :, ci, :]
raw.get_mono(ci).data_xyz
)
else:
if white_channel is not None: # interpret as just a single channel
......@@ -608,9 +608,9 @@ class RoiSet(object):
annotate_rgb = True
break
if annotate_rgb: # make RGB patches anyway to include annotation color
stack = raw.data[:, :, [white_channel, white_channel, white_channel], :]
stack = raw.data[:, :, [white_channel, white_channel, white_channel], :] # TODO: remove direct data access
else: # make monochrome patches
stack = raw.data[:, :, [white_channel], :]
stack = raw.data[:, :, [white_channel], :] # TODO: remove direct data access
elif kwargs.get('channels'):
stack = raw.get_channels(kwargs['channels']).data
else:
......@@ -778,7 +778,6 @@ class RoiSet(object):
pad_to = 1
def _poly_from_mask(roi):
# mask = generate_file_accessor(roi.mask_path).data[:, :, 0, 0]
mask = roi.binary_mask
# label and fill holes
......@@ -847,7 +846,7 @@ class RoiSet(object):
try:
ma_acc = generate_file_accessor(where / 'tight_patch_masks' / fname)
assert ma_acc.chroma == 1 and ma_acc.nz == 1
mask_data = ma_acc.data[:, :, 0, 0] / np.iinfo(ma_acc.data.dtype).max
mask_data = ma_acc.data_xy / np.iinfo(ma_acc.data.dtype).max
return mask_data
except Exception as e:
raise DeserializeRoiSet(e)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment