From 95e419f43218219ccbbcf1ed2e53f46520d3bdb9 Mon Sep 17 00:00:00 2001 From: Christopher Rhodes <christopher.rhodes@embl.de> Date: Sat, 3 Feb 2024 16:46:57 +0100 Subject: [PATCH] Removed external build_zmask_meta function --- model_server/extensions/chaeo/zmask.py | 148 ------------------------- 1 file changed, 148 deletions(-) diff --git a/model_server/extensions/chaeo/zmask.py b/model_server/extensions/chaeo/zmask.py index 7e852e6d..557bdddb 100644 --- a/model_server/extensions/chaeo/zmask.py +++ b/model_server/extensions/chaeo/zmask.py @@ -32,62 +32,14 @@ class RoiSet(object): acc_raw: GenericImageDataAccessor, params: RoiSetMetaParams = RoiSetMetaParams(), ): - # # parse filters - # filters = params.filters - # query_str = 'label > 0' # always true - # if filters is not None: - # for k, val in filters.dict(exclude_unset=True).items(): - # assert k in ('area', 'solidity') - # vmin = val['min'] - # vmax = val['max'] - # assert vmin >= 0 - # query_str = query_str + f' & {k} > {vmin} & {k} < {vmax}' - # - # # build dataframe of objects, assign z index to each object - # argmax = acc_raw.data.argmax(axis=3, keepdims=True)[:, :, 0, 0].astype('uint16') - # df = ( - # pd.DataFrame( - # regionprops_table( - # acc_obj_ids, - # intensity_image=argmax, - # properties=('label', 'area', 'intensity_mean', 'solidity', 'bbox', 'centroid') - # ) - # ) - # .rename( - # columns={'bbox-0': 'y0', 'bbox-1': 'x0', 'bbox-2': 'y1', 'bbox-3': 'x1',} - # ) - # ) - # df['zi'] = df['intensity_mean'].round().astype('int') - # df['keeper'] = False - # df.loc[df.query(query_str).index, 'keeper'] = True - # self.df = df - - # remaining zmask_meta write ops - self.acc_obj_ids = acc_obj_ids self.acc_raw = acc_raw - - self._df = self.filter_df( self.make_df(self.acc_raw, self.acc_obj_ids, expand_box_by=params.expand_box_by), params.filters, ) - # self._df = self.make_slices( - # self._df, - # expand_box_by=params.expand_box_by, - # shape=acc_raw.shape - # ) - - # remaining zmask_meta write ops - # self.zmask_meta, _, self.interm = build_zmask_from_object_mask( - # acc_obj_ids, - # acc_raw, - # self.get_df(), - # params=params, - # ) - # temporarily build zmask meta here meta = [] for ob in self.get_df().itertuples(name='LabeledObject'): @@ -206,19 +158,6 @@ class RoiSet(object): def get_object_mask_by_class(self, class_id): return self.object_id_labels == class_id - - - # def loc_mask(self, i): - # # compute contours - # # obmask = (lamap == ob.label) # TODO: on-the-fly - # # contour = find_contours(obmask) # TODO: on-the-fly - # # mask = obmask[ob.y0: ob.y1, ob.x0: ob.x1] - # ob = self.df.loc[i] - # return - # - # def loc_contour(self, i): - # pass - def get_patch_masks(self, **kwargs) -> MonoPatchStack: return get_patch_masks(self, **kwargs) @@ -339,93 +278,6 @@ class RoiSet(object): self.df.to_csv(dfpa, index=False) -def build_zmask_from_object_mask( - obmask: GenericImageDataAccessor, - zstack: GenericImageDataAccessor, - df, - params: RoiSetMetaParams = RoiSetMetaParams(), -): - # """ - # Given a 2D mask of objects, build a 3D mask, where each object's z-position is determined by the index of - # maximum intensity in z. Return this zmask and a list of each object's meta information. - # :param obmask: GenericImageDataAccessor 2D map of objects IDs - # :param zstack: GenericImageDataAccessor monochrome zstack of same Y, X dimension as obmask - # :param params: RoiSetMetaParams - # filters: dictionary of form {attribute: (min, max)}; valid attributes are 'area' and 'solidity' - # mask_type: if 'boxes', zmask is True in each object's complete bounding box; otherwise 'contours' - # expand_box_by: (xy, z) expands bounding box by (xy, z) pixels except where this hits a boundary - # :return: tuple (zmask, meta) - # np.ndarray: - # boolean mask of same size as stack - # List containing one Dict per object, with keys: - # info: object's properties from skimage.measure.regionprops_table, including bounding box (y0, y1, x0, x1) - # slice: named slice (np.s_) of (optionally) expanded bounding box - # relative_bounding_box: bounding box (y0, y1, x0, x1) in relative frame of (optionally) expanded bounding box - # contour: object's contour returned by skimage.measure.find_contours - # mask: mask of object in relative frame of (optionally) expanded bounding box - # pd.DataFrame: objects, including bounding, box information after filtering - # Dict of intermediate image products: - # label_map: np.ndarray (h x w) where each unique object has an integer label - # argmax: np.ndarray (h x w x 1 x 1) z-index of highest intensity in zstack - # """ - filters = params.filters - expand_box_by = params.expand_box_by - # validate inputs - assert zstack.hw == obmask.shape - - lamap = obmask - - argmax = zstack.data.argmax(axis=3, keepdims=True)[:, :, 0, 0].astype('uint16') - - # convert bounding boxes to numpy slice objects - ebxy, ebz = expand_box_by - h, w, c, nz = zstack.shape - - meta = [] - for ob in df.itertuples(name='LabeledObject'): - y0 = max(ob.y0 - ebxy, 0) - y1 = min(ob.y1 + ebxy, h) - x0 = max(ob.x0 - ebxy, 0) - x1 = min(ob.x1 + ebxy, w) - z0 = max(ob.zi - ebz, 0) - z1 = min(ob.zi + ebz, nz) - - # relative bounding box positions - rbb = { # TODO: just put in the DF - 'y0': ob.y0 - y0, - 'y1': ob.y1 - y0, - 'x0': ob.x0 - x0, - 'x1': ob.x1 - x0, - } - - sl = np.s_[y0: y1, x0: x1, :, z0: z1 + 1] # TODO: on-the-fly in RoiSet, given DF - - # compute contours - obmask = (lamap == ob.label) # TODO: on-the-fly - contour = find_contours(obmask) # TODO: on-the-fly - mask = obmask[ob.y0: ob.y1, ob.x0: ob.x1] - - assert rbb['x1'] <= (x1 - x0) - assert rbb['y1'] <= (y1 - y0) - - meta.append({ - 'df_index': ob.Index, - 'info': ob, - # 'slice': sl, - 'relative_bounding_box': rbb, # TODO: put in DF - 'contour': contour, # TODO: delegate to getter - 'mask': mask # TODO: delegate to getter - }) - - # return intermediate image arrays - interm = { - 'label_map': lamap, - 'argmax': argmax, - } - - return meta, df, interm - - def project_stack_from_focal_points( xx: np.ndarray, yy: np.ndarray, -- GitLab