FRESCO / src /ebsynth /blender /histogram_blend.py
SingleZombie
upload files
ff715ca
raw
history blame contribute delete
No virus
1.75 kB
import cv2
import numpy as np
def histogram_transform(img: np.ndarray, means: np.ndarray, stds: np.ndarray,
target_means: np.ndarray, target_stds: np.ndarray):
means = means.reshape((1, 1, 3))
stds = stds.reshape((1, 1, 3))
target_means = target_means.reshape((1, 1, 3))
target_stds = target_stds.reshape((1, 1, 3))
x = img.astype(np.float32)
x = (x - means) * target_stds / stds + target_means
# x = np.round(x)
# x = np.clip(x, 0, 255)
# x = x.astype(np.uint8)
return x
def blend(a: np.ndarray,
b: np.ndarray,
min_error: np.ndarray,
weight1=0.5,
weight2=0.5):
a = cv2.cvtColor(a, cv2.COLOR_BGR2Lab)
b = cv2.cvtColor(b, cv2.COLOR_BGR2Lab)
min_error = cv2.cvtColor(min_error, cv2.COLOR_BGR2Lab)
a_mean = np.mean(a, axis=(0, 1))
a_std = np.std(a, axis=(0, 1))
b_mean = np.mean(b, axis=(0, 1))
b_std = np.std(b, axis=(0, 1))
min_error_mean = np.mean(min_error, axis=(0, 1))
min_error_std = np.std(min_error, axis=(0, 1))
t_mean_val = 0.5 * 256
t_std_val = (1 / 36) * 256
t_mean = np.ones([3], dtype=np.float32) * t_mean_val
t_std = np.ones([3], dtype=np.float32) * t_std_val
a = histogram_transform(a, a_mean, a_std, t_mean, t_std)
b = histogram_transform(b, b_mean, b_std, t_mean, t_std)
ab = (a * weight1 + b * weight2 - t_mean_val) / 0.5 + t_mean_val
ab_mean = np.mean(ab, axis=(0, 1))
ab_std = np.std(ab, axis=(0, 1))
ab = histogram_transform(ab, ab_mean, ab_std, min_error_mean,
min_error_std)
ab = np.round(ab)
ab = np.clip(ab, 0, 255)
ab = ab.astype(np.uint8)
ab = cv2.cvtColor(ab, cv2.COLOR_Lab2BGR)
return ab