OneRestore / syn_data /syn_data.py
gy65896's picture
Upload 36 files
2940390 verified
raw
history blame
3.76 kB
import os, argparse, cv2, random
import numpy as np
from skimage import exposure
def guideFilter(I, p, winSize, eps):
mean_I = cv2.blur(I, winSize)
mean_p = cv2.blur(p, winSize)
mean_II = cv2.blur(I * I, winSize)
mean_Ip = cv2.blur(I * p, winSize)
var_I = mean_II - mean_I * mean_I
cov_Ip = mean_Ip - mean_I * mean_p
a = cov_Ip / (var_I + eps)
b = mean_p - a * mean_I
mean_a = cv2.blur(a, winSize)
mean_b = cv2.blur(b, winSize)
q = mean_a * I + mean_b
return q
def syn_low(img, light, img_gray, light_max=3,
light_min=2, noise_max=0.08, noise_min=0.03):
light = guideFilter(light, img_gray,(3,3),0.01)[:, :, np.newaxis]
n = np.random.uniform(noise_min, noise_max)
R = img / (light + 1e-7)
L = (light + 1e-7) ** np.random.uniform(light_min, light_max)
return np.clip(R * L + np.random.normal(0, n, img.shape), 0, 1)
def syn_haze(img, depth, beta_max=2.0, beta_min=1.0, A_max=0.9, A_min=0.6,
color_max=0, color_min=0):
beta = np.random.rand(1) * (beta_max - beta_min) + beta_min
t = np.exp(-np.minimum(1 - cv2.blur(depth,(22,22)),0.7) * beta)
A = np.random.rand(1) * (A_max - A_min) + A_min
A_random = np.random.rand(3) * (color_max - color_min) + color_min
A = A + A_random
return np.clip(img * t + A * (1 - t), 0, 1)
def syn_data(hq_file, light_file, depth_file, rain_file, snow_file, out_file,
low, haze, rain, snow):
file_list = os.listdir(hq_file)
rain_list = os.listdir(rain_file)
snow_list = os.listdir(snow_file)
num_rain = random.sample(range(0,len(rain_list)),len(rain_list))
num_snow = random.sample(range(0,len(snow_list)),len(snow_list))
for i in range(1, len(file_list)):
img = cv2.imread(hq_file+file_list[i])
w, h, _ = img.shape
light = cv2.cvtColor(cv2.imread(light_file + file_list[i]), cv2.COLOR_RGB2GRAY) / 255.0
depth = cv2.imread(depth_file + file_list[i]) / 255.0
rain_mask = cv2.imread(rain_file + rain_list[num_rain[i]]) / 255.0
rain_mask = cv2.resize(rain_mask,(h,w))
snow_mask = cv2.imread(snow_file + snow_list[num_snow[i]]) / 255.0
snow_mask = cv2.resize(snow_mask, (h, w))
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)/ 255.0
lq = img.copy()/255.0
color_dis = 1
if low:
lq = syn_low(lq, light, img_gray)
if rain:
lq = lq+rain_mask
if snow:
lq = lq*(1-snow_mask)+color_dis*snow_mask
if haze:
lq = syn_haze(lq, depth)
# out = np.concatenate((lq*255.0,img),1)
out = lq*255.0
cv2.imwrite(out_file + file_list[i], out)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
# load model
parser.add_argument("--hq-file", type=str, default = './data/clear/')
parser.add_argument("--light-file", type=str, default = './data/light_map/')
parser.add_argument("--depth-file", type=str, default = './data/depth_map/')
parser.add_argument("--rain-file", type=str, default = './data/rain_mask/')
parser.add_argument("--snow-file", type=str, default = './data/snow_mask/')
parser.add_argument("--out-file", type=str, default = './out/')
parser.add_argument("--low", action='store_true')
parser.add_argument("--haze", action='store_true')
parser.add_argument("--rain", action='store_true')
parser.add_argument("--snow", action='store_true')
args = parser.parse_args()
syn_data(args.hq_file, args.light_file, args.depth_file, args.rain_file,
args.snow_file, args.out_file, args.low, args.haze, args.rain, args.snow)