Source code for ddd_pylib.labels_manip._kill_border_labels
from ._replace_values_operator import ReplaceValuesOperator
from ._list_border_labels_operator import ListBorderValuesOperator
from typing import List, Dict
import pandas as pd
[docs]
class KillBorderLabelsOperator(ReplaceValuesOperator):
"""
Given a list of axes and a border thickness, this operator identifies all unique label
values that touch the borders of the image along those axes and replaces them with 0.
This operator works with tracked labels: if a label is removed at time t, it will also
be removed at all other time points.
"""
def __init__(self):
super().__init__()
self._borderAxes = self.defaultBorderAxes()
self._borderSize = self.defaultBorderSize()
[docs]
@staticmethod
def defaultBorderSize() -> int:
return 1
[docs]
@staticmethod
def defaultBorderAxes() -> List[str]:
return ["Z", "X", "Y"]
[docs]
def setBorderSize(self, size: int):
if size < 1:
raise ValueError("Border size must be at least 1.")
self._borderSize = size
[docs]
def setBorderAxes(self, axes: List[str]):
if not axes:
raise ValueError("Border axes list cannot be empty.")
self._borderAxes = axes
[docs]
def getPrefix(self):
return "KillBorders-"
def _makeKillDict(self, border_values_df: pd.DataFrame) -> Dict[int, int]:
"""
Create a dictionary mapping border label values to 0 (to be removed).
"""
img = self.getMainImage()
d = img.dtype.type
kill_dict = {}
columns_list = [col for col in border_values_df.columns if col.startswith(('+', '-'))]
for col in columns_list:
unique_labels = [d(lbl) for lbl in border_values_df[col].dropna().unique()]
for label in unique_labels:
if label != 0:
kill_dict[label] = 0
return kill_dict
def _run(self):
op = ListBorderValuesOperator()
op.setMainImage(self.getMainImage())
op.setBorderSize(self._borderSize)
op.setBorderAxes(self._borderAxes)
yield from op._run()
self.setValuesDict(self._makeKillDict(op.getResult()))
yield from super()._run()