Source code for wiser.raster.roi

from typing import Any, Dict, List, Optional, Set, Tuple

from .selection import (
    Selection,
    RectangleSelection,
    PolygonSelection,
    MultiPixelSelection,
    selection_from_pyrep,
    SelectionType,
)

from PySide2.QtCore import QRect
from PySide2.QtGui import QColor


[docs] class RegionOfInterest: """ Represents a Region of Interest (abbreviated "ROI") in the data being analyzed. The Region of Interest may specify multiple selections of various types, indicating the actual area comprising the ROI. Various other attributes may be specified as well, such as the color that the ROI is drawn in. """ def __init__(self, name: Optional[str] = None, color: str = "yellow"): self._id: Optional[int] = None self._name: Optional[str] = name self._color: str = color self._description: Optional[str] = None self._selections: List[Selection] = [] self._metadata: Dict[str, Any] = {}
[docs] def get_id(self) -> Optional[int]: return self._id
[docs] def set_id(self, id: int) -> None: self._id = id
def __str__(self): return f"ROI[{self._name}, {self._selections}]"
[docs] def get_name(self): return self._name
[docs] def set_name(self, name): self._name = name
[docs] def get_color(self) -> str: """ Returns the color of the ROI as a string. """ return self._color
[docs] def set_color(self, color: str) -> None: self._color = color
[docs] def get_description(self) -> Optional[str]: return self._description
[docs] def set_description(self, description: Optional[str]) -> None: self._description = description
[docs] def get_selections(self) -> List[Selection]: return list(self._selections)
[docs] def add_selection(self, selection: Selection) -> None: if selection is None: raise ValueError("selection cannot be None") self._selections.append(selection)
[docs] def del_selection(self, sel_index: int) -> None: del self._selections[sel_index]
[docs] def get_metadata(self): return self._metadata
[docs] def get_all_pixels(self) -> Set[Tuple[int, int]]: """ Return a Python set containing the coordinates of all pixels that are a part of this Region of Interest. Each pixel coordinate will only appear once, even if the pixel appears within multiple selections in the ROI. """ all_pixels = set() for sel in self._selections: all_pixels.update(sel.get_all_pixels()) return all_pixels
[docs] def get_bounding_box(self) -> QRect: all_pixels = self.get_all_pixels() xs = [p[0] for p in all_pixels] ys = [p[1] for p in all_pixels] x_min = min(xs) x_max = max(xs) y_min = min(ys) y_max = max(ys) return QRect(x_min, y_min, x_max - x_min + 1, y_max - y_min + 1)
[docs] def pprint(self): print(f"RegionOfInterest[{self._name}, {self._color}, {self._description}") for sel in self._selections: print(f" * {sel}") print("]")
def roi_to_pyrep(roi): data = { "name": roi.get_name(), "color": str(roi.get_color().name()), "metadata": roi.get_metadata(), } # TODO(donnie): Composite/multi-selection ROIs data["selection"] = roi.get_selection().to_pyrep() return data def roi_from_pyrep(data): name = data["name"] color = QColor(data["color"]) metadata = data["metadata"] # TODO(donnie): Composite/multi-selection ROIs sel = selection_from_pyrep(data["selection"]) roi = RegionOfInterest(name, sel, color, **metadata) return roi