MSRNet / utils /ops /array_ops.py
linaa98's picture
Update utils/ops/array_ops.py
f0915d5 verified
# -*- 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]