|
|
|
|
|
|
|
|
|
|
|
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] |
|
|
|