import glob import rawpy import cv2 import os import numpy as np import colour_demosaicing from tqdm import tqdm def process_raw(args, path, w_new, h_new): raw = rawpy.imread(str(path)).raw_image_visible if "_00200_" in str(path) or "_00100_" in str(path): raw = np.clip(raw.astype("float32") - 512, 0, 65535) else: raw = np.clip(raw.astype("float32") - 2048, 0, 65535) img = colour_demosaicing.demosaicing_CFA_Bayer_bilinear(raw, "RGGB").astype( "float32" ) img = np.clip(img, 0, 16383) # HistEQ start if args.histeq: img2 = np.zeros_like(img) for i in range(3): hist, bins = np.histogram(img[..., i].flatten(), 16384, [0, 16384]) cdf = hist.cumsum() cdf_normalized = cdf * float(hist.max()) / cdf.max() cdf_m = np.ma.masked_equal(cdf, 0) cdf_m = (cdf_m - cdf_m.min()) * 16383 / (cdf_m.max() - cdf_m.min()) cdf = np.ma.filled(cdf_m, 0).astype("uint16") img2[..., i] = cdf[img[..., i].astype("int16")] img[..., i] = img2[..., i].astype("float32") # HistEQ end m = img.mean() d = np.abs(img - img.mean()).mean() img = (img - m + 2 * d) / 4 / d * 255 image = np.clip(img, 0, 255) image = cv2.resize( image.astype("float32"), (w_new, h_new), interpolation=cv2.INTER_AREA ) if args.histeq: path = str(path) os.makedirs( "/".join(path.split("/")[:-2] + [path.split("/")[-2] + "-npy"]), exist_ok=True, ) np.save( "/".join( path.split("/")[:-2] + [path.split("/")[-2] + "-npy"] + [path.split("/")[-1].replace("cr2", "npy")] ), image, ) else: path = str(path) os.makedirs( "/".join(path.split("/")[:-2] + [path.split("/")[-2] + "-npy-nohisteq"]), exist_ok=True, ) np.save( "/".join( path.split("/")[:-2] + [path.split("/")[-2] + "-npy-nohisteq"] + [path.split("/")[-1].replace("cr2", "npy")] ), image, ) if __name__ == "__main__": import argparse parser = argparse.ArgumentParser() parser.add_argument("--H", type=int, default=int(640)) parser.add_argument("--W", type=int, default=int(960)) parser.add_argument("--histeq", action="store_true") parser.add_argument("--dataset_dir", type=str, default="/data/hyz/MID/") args = parser.parse_args() path_ls = glob.glob(args.dataset_dir + "/*/pair*/?????/*") for path in tqdm(path_ls): process_raw(args, path, args.W, args.H)