Artyom
IVL
e91104d verified
import cv2
import numpy as np
def perform_flash(source, a=5, target=-1, perform_gamma_correction=True):
rows, cols, _ = source.shape
v = np.max(source, axis=2)
vd = np.copy(v)
vd[vd == 0] = 1e-9
result = source / (a * np.exp(np.mean(np.log(vd))) + np.tile(np.expand_dims(vd, axis=2), (1, 1, 3)))
if perform_gamma_correction:
result **= 1.0 / 2.2
if target >= 0:
result *= target / np.mean((0.299 * result[:, :, 2] + 0.587 * result[:, :, 1] + 0.114 * result[:, :, 0]))
else:
result *= 255.0 / np.max(result)
return result
def perform_storm(source, a=5, target=-1, kernels=(1, 4, 16, 64, 256), perform_gamma_correction=True):
rows, cols, _ = source.shape
v = np.max(source, axis=2)
vd = np.copy(v)
vd[vd == 0] = 1e-9
lv = np.log(vd)
result = sum([source / np.tile(
np.expand_dims(a * np.exp(cv2.boxFilter(lv, -1, (int(min(rows // kernel, cols // kernel)),) * 2)) + vd, axis=2),
(1, 1, 3)) for kernel in kernels])
if perform_gamma_correction:
result **= 1.0 / 2.2
if target >= 0:
result *= target / np.mean((0.299 * result[:, :, 2] + 0.587 * result[:, :, 1] + 0.114 * result[:, :, 0]))
else:
result *= 255.0 / np.max(result)
return result