File size: 1,347 Bytes
dd06d6b |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import numpy as np
class TonemapHDR(object):
"""
Tonemap HDR image globally. First, we find alpha that maps the (max(numpy_img) * percentile) to max_mapping.
Then, we calculate I_out = alpha * I_in ^ (1/gamma)
input : nd.array batch of images : [H, W, C]
output : nd.array batch of images : [H, W, C]
"""
def __init__(self, gamma=2.4, percentile=50, max_mapping=0.5):
self.gamma = gamma
self.percentile = percentile
self.max_mapping = max_mapping # the value to which alpha will map the (max(numpy_img) * percentile) to
def __call__(self, numpy_img, clip=True, alpha=None, gamma=True):
if gamma:
power_numpy_img = np.power(numpy_img, 1 / self.gamma)
else:
power_numpy_img = numpy_img
non_zero = power_numpy_img > 0
if non_zero.any():
r_percentile = np.percentile(power_numpy_img[non_zero], self.percentile)
else:
r_percentile = np.percentile(power_numpy_img, self.percentile)
if alpha is None:
alpha = self.max_mapping / (r_percentile + 1e-10)
tonemapped_img = np.multiply(alpha, power_numpy_img)
if clip:
tonemapped_img_clip = np.clip(tonemapped_img, 0, 1)
return tonemapped_img_clip.astype('float32'), alpha, tonemapped_img |