# -*- coding: utf-8 -*- #Author: Lart Pang (https://github.com/lartpang) import os import cv2 import numpy as np def minmax(data_array: np.ndarray, up_bound: float = None) -> np.ndarray: """ :: data_array = (data_array / up_bound) if min_value != max_value: data_array = (data_array - min_value) / (max_value - min_value) :param data_array: :param up_bound: if is not None, data_array will devided by it before the minmax ops. :return: """ if up_bound is not None: data_array = data_array / up_bound max_value = data_array.max() min_value = data_array.min() if max_value != min_value: data_array = (data_array - min_value) / (max_value - min_value) return data_array def clip_to_normalize(data_array: np.ndarray, clip_range: tuple = None) -> np.ndarray: clip_range = sorted(clip_range) if len(clip_range) == 3: clip_min, clip_mid, clip_max = clip_range assert 0 <= clip_min < clip_mid < clip_max <= 1, clip_range lower_array = data_array[data_array < clip_mid] higher_array = data_array[data_array > clip_mid] if lower_array.size > 0: lower_array = np.clip(lower_array, a_min=clip_min, a_max=1) max_lower = lower_array.max() lower_array = minmax(lower_array) * max_lower data_array[data_array < clip_mid] = lower_array if higher_array.size > 0: higher_array = np.clip(higher_array, a_min=0, a_max=clip_max) min_lower = higher_array.min() higher_array = minmax(higher_array) * (1 - min_lower) + min_lower data_array[data_array > clip_mid] = higher_array elif len(clip_range) == 2: clip_min, clip_max = clip_range assert 0 <= clip_min < clip_max <= 1, clip_range if clip_min != 0 and clip_max != 1: data_array = np.clip(data_array, a_min=clip_min, a_max=clip_max) data_array = minmax(data_array) elif clip_range is None: data_array = minmax(data_array) else: raise NotImplementedError return data_array def save_array_as_image(data_array: np.ndarray, save_name: str, save_dir: str, to_minmax: bool = False): """ save the ndarray as a image Args: data_array: np.float32 the max value is less than or equal to 1 save_name: with special suffix save_dir: the dirname of the image path to_minmax: minmax the array """ if not os.path.exists(save_dir): os.makedirs(save_dir) save_path = os.path.join(save_dir, save_name) if data_array.dtype != np.uint8: if data_array.max() > 1: raise Exception("the range of data_array has smoe errors") data_array = (data_array * 255).astype(np.uint8) if to_minmax: data_array = minmax(data_array, up_bound=255) data_array = (data_array * 255).astype(np.uint8) cv2.imwrite(save_path, data_array) def resize(image_array: np.ndarray, height, width, interpolation=cv2.INTER_LINEAR): h, w = image_array.shape[:2] if h == height and w == width: return image_array resized_image_array = cv2.resize(image_array, dsize=(width, height), interpolation=interpolation) return resized_image_array def ms_resize(img, scales, base_h=None, base_w=None, interpolation=cv2.INTER_LINEAR): assert isinstance(scales, (list, tuple)) if base_h is None: base_h = img.shape[0] if base_w is None: base_w = img.shape[1] return [resize(img, height=int(base_h * s), width=int(base_w * s), interpolation=interpolation) for s in scales]