|
import argparse |
|
import os |
|
import time |
|
import warnings |
|
from pathlib import Path |
|
|
|
import cv2 |
|
import numpy as np |
|
from tqdm import tqdm |
|
|
|
from raw_prc_pipeline import (expected_img_ext, expected_landscape_img_height, |
|
expected_landscape_img_width) |
|
from raw_prc_pipeline.pipeline import (PipelineExecutor, |
|
RawProcessingPipelineDemo) |
|
from utils import fraction_from_json, json_read |
|
|
|
warnings.filterwarnings("ignore") |
|
|
|
|
|
def parse_args(): |
|
parser = argparse.ArgumentParser( |
|
description= |
|
'Demo script for processing PNG images with given metadata files.') |
|
parser.add_argument( |
|
'-p', |
|
'--png_dir', |
|
type=str, |
|
default='data', |
|
help='Path of the directory containing PNG images with metadata files') |
|
parser.add_argument( |
|
'-o', |
|
'--out_dir', |
|
type=str, |
|
default=None, |
|
help= |
|
'Path to the directory where processed images will be saved. Images will be saved in JPG format.' |
|
) |
|
parser.add_argument( |
|
'-ie', |
|
'--illumination_estimation', |
|
type=str, |
|
default='gw', |
|
help= |
|
'Options for illumination estimation algorithms: "gw", "wp", "sog", "iwp".' |
|
) |
|
parser.add_argument( |
|
'-tm', |
|
'--tone_mapping', |
|
type=str, |
|
default='Storm', |
|
help= |
|
'Options for tone mapping algorithms: "Base", "Flash", "Storm", "Linear", "Drago", "Mantiuk", "Reinhard".' |
|
) |
|
parser.add_argument( |
|
'-n', |
|
'--denoising_flg', |
|
action='store_false', |
|
help= |
|
'Denoising flag. By default resulted images will be denoised with some default parameters.' |
|
) |
|
parser.add_argument('-m', |
|
'--camera_matrix', |
|
type=float, |
|
nargs=9, |
|
default=[ |
|
1.06835938, -0.29882812, -0.14257812, -0.43164062, |
|
1.35546875, 0.05078125, -0.1015625, 0.24414062, |
|
0.5859375 |
|
], |
|
help='Mean color matrix of Hauwei Mate 40 Pro') |
|
args = parser.parse_args() |
|
|
|
if args.out_dir is None: |
|
args.out_dir = args.png_dir |
|
|
|
return args |
|
|
|
|
|
class PNGProcessingDemo: |
|
def __init__(self, ie_method, tone_mapping, denoising_flg, camera_matrix, |
|
save_dir): |
|
self.camera_matrix = camera_matrix |
|
self.save_dir = save_dir |
|
self.pipeline_demo = RawProcessingPipelineDemo( |
|
illumination_estimation=ie_method, |
|
denoise_flg=denoising_flg, |
|
tone_mapping=tone_mapping, |
|
out_landscape_height=expected_landscape_img_height, |
|
out_landscape_width=expected_landscape_img_width) |
|
self.process_times = [] |
|
|
|
def __call__(self, png_path: Path, out_path: Path): |
|
|
|
raw_image = cv2.imread(str(png_path), cv2.IMREAD_UNCHANGED) |
|
|
|
metadata = json_read(png_path.with_suffix('.json'), |
|
object_hook=fraction_from_json) |
|
start_time = time.perf_counter() |
|
|
|
pipeline_exec = PipelineExecutor(raw_image, |
|
metadata, |
|
os.path.basename( |
|
str(png_path)).split('.')[0], |
|
self.pipeline_demo, |
|
save_dir=self.save_dir) |
|
|
|
output_image = pipeline_exec() |
|
end_time = time.perf_counter() |
|
self.process_times.append(end_time - start_time) |
|
|
|
|
|
output_image = cv2.cvtColor(output_image, cv2.COLOR_RGB2BGR) |
|
cv2.imwrite(str(out_path), output_image, |
|
[cv2.IMWRITE_JPEG_QUALITY, 100]) |
|
|
|
|
|
def main(png_dir, out_dir, illumination_estimation, tone_mapping, |
|
denoising_flg, camera_matrix): |
|
png_dir = Path(png_dir) |
|
out_dir = Path(out_dir) |
|
out_dir.mkdir(exist_ok=True) |
|
|
|
png_paths = list(png_dir.glob('*.png')) |
|
out_paths = [ |
|
out_dir / png_path.with_suffix(expected_img_ext).name |
|
for png_path in png_paths |
|
] |
|
|
|
png_processor = PNGProcessingDemo(illumination_estimation, tone_mapping, |
|
denoising_flg, camera_matrix, |
|
str(out_dir)) |
|
|
|
for png_path, out_path in tqdm(zip(png_paths, out_paths), |
|
total=len(png_paths)): |
|
png_processor(png_path, out_path) |
|
print("Average processing time: {:.2f}s".format( |
|
np.mean(png_processor.process_times))) |
|
|
|
|
|
if __name__ == '__main__': |
|
args = parse_args() |
|
main(**vars(args)) |
|
|