from typing import * from pathlib import Path import cv2 import numpy as np from scipy.stats import norm def read_image( path: Union[str, Path], image_size: Union[int, Tuple[int, int], None]=None ) -> np.ndarray: """Read image from file path in RGB format. Args: path (str | Path): Path to image file. image_size (int | tuple[int, int] | None, optional): Resize image. Returns: image (np.ndarray): The image array. Example: >>> read_image("/path/to/image.jpg", 256) """ if isinstance(path, Path): path = str(path) image = cv2.imread(path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) if image_size: if isinstance(image_size, int): image_size = (image_size, image_size) image = cv2.resize(image, image_size, interpolation=cv2.INTER_AREA) return image def standardize( targets: np.ndarray, mean: float, std: float, center_at: float | None = None ) -> np.ndarray: """Standardize the targets to the z-domain.""" targets = np.log(targets) standardized = (targets - mean) / std if center_at: standardized -= (center_at - mean) / std return standardized def normalize_cdf(targets: np.ndarray, threshold: float) -> np.ndarray: return norm.cdf(targets - threshold) def normalize_min_max( targets: np.ndarray | np.float32, threshold: float | np.ndarray, min_val: float | np.ndarray, max_val: float | np.ndarray ) -> np.ndarray: normalized = ((targets - threshold) / (max_val - min_val)) + 0.5 normalized = np.minimum(normalized, 1) normalized = np.maximum(normalized, 0) return normalized def get_boxes(mask: np.ndarray) -> np.ndarray: """Get bounding boxes from masks. Args: masks (np.ndarray): Input mask of shape (H, W). Returns: boxes (np.ndarray): Array of shape (N, 4) containing bounding boxes in xyxy format. """ _, comps = cv2.connectedComponents(mask) labels = comps = np.unique(comps) boxes = [] for label in labels[labels != 0]: y_loc, x_loc = np.where(comps == label) boxes.append((np.min(x_loc), np.min(y_loc), np.max(x_loc), np.ma(y_loc))) boxes = np.stack(boxes) if boxes else np.empty((0, 4)) return boxes