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