"""
This process module includes classes that change image structure such as
frm_no and image width and height.
"""
import pandas as pd
from ..img.image import Image
from ..tbl.proc import MaskFromParam
[docs]class SelectParam(Image):
"""Select image frames based on parameter values.
This class creates a mask column based on explicit param values using
:class:`slitflow.tbl.filter.MaskFromParam` and selects rows using the mask
column.
Args:
reqs[0] (Image): Image for selection.
reqs[1] (Table): Index Table that includes all indices corresponding to
the image. The index table should be split into the same depth as
the image.
param["index"] (list of tuple): List of image index numbers to select.
The tuple should be (index of depth=1, index of depth=2, ...).
If index is None, all indices of the depth is selected.
param["split_depth"] (int): File split depth number.
Returns:
Image: Selected Image.
Raises:
Exception: If the split depths of the image and index table are not the
same.
"""
_temp_index = []
def __init__(self, info_path=None):
super().__init__(info_path)
SelectParam._temp_index = []
[docs] def set_info(self, param={}):
"""Copy info from reqs[0] and add param."""
if self.reqs[0].info.split_depth_req != \
self.reqs[1].info.split_depth_req:
raise Exception("Split depths should have the same value")
self.info.copy_req(0)
self.info.add_param("mask_col", param.get("mask_col", "mask"),
"str", "Mask column name")
self.info.add_param(
"index", param["index"], "list", "Indices to select")
self.info.add_param(
"index_cols", self.info.get_column_name("index"),
"list", "Index column names")
self.info.set_split_depth(param["split_depth"])
[docs] @staticmethod
def process(reqs, param):
"""Select image frames based on parameter values.
Args:
reqs[0] (numpy.ndarray): Image for selection.
reqs[1] (Table): Index Table that includes all indices
corresponding to the image. The index table should be split
into the same depth as the image.
param["index"] (list of tuple): List of tuple of index numbers to
select. The tuple should be (index of depth=1, index of
depth=2, ...). If index is None, all indices of the depth is
selected.
param["index_cols"] (list of str): The index column names.
param["mask_col"] (str, optional): The name of the mask column.
Defaults to "mask".
Returns:
Table: Selected Table.
"""
df_mask = MaskFromParam.process([reqs[1].copy()], param)
img = reqs[0].copy()
to_sel = df_mask[param["mask_col"]].values.astype(bool)
img = img[to_sel, :, :]
# Save the index (multi-process is not available)
SelectParam._temp_index.append(df_mask)
return img
[docs] def set_index(self):
"""Set the index based on the saved temporal index.
The file number should be added to the masked index not to skip the
file number that is not selected.
"""
self.info.index = pd.concat(SelectParam._temp_index)
self.info.set_index_file_no()
mask_col = self.info.get_param_value("mask_col")
self.info.index = self.info.index[self.info.index[mask_col] > 0]
self.info.index = self.info.index.drop(
columns=mask_col).drop_duplicates()