#!/usr/bin/env python3 import argparse from pathlib import Path import cv2 import numpy as np def odd_positive(value: str) -> int: kernel_size = int(value) if kernel_size < 1 or kernel_size % 2 == 0: raise argparse.ArgumentTypeError("kernel size must be a positive odd integer") return kernel_size def high_frequency_score(image: np.ndarray) -> float: gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) return float(cv2.Laplacian(gray, cv2.CV_64F).var()) parser = argparse.ArgumentParser(description="Apply Gaussian blur to an image with OpenCV.") parser.add_argument("input_image", type=Path) parser.add_argument("output_image", type=Path) parser.add_argument("--kernel", type=odd_positive, default=9) parser.add_argument("--sigma", type=float, default=0.0) args = parser.parse_args() image = cv2.imread(str(args.input_image), cv2.IMREAD_COLOR) if image is None: raise SystemExit(f"could not read image: {args.input_image}") blurred = cv2.GaussianBlur(image, (args.kernel, args.kernel), args.sigma) args.output_image.parent.mkdir(parents=True, exist_ok=True) if not cv2.imwrite(str(args.output_image), blurred): raise SystemExit(f"could not write image: {args.output_image}") before_score = high_frequency_score(image) after_score = high_frequency_score(blurred) print(f"input: {args.input_image}") print(f"kernel: {args.kernel}x{args.kernel}") print(f"sigma: {args.sigma:.1f}") print(f"high-frequency score before: {before_score:.2f}") print(f"high-frequency score after: {after_score:.2f}") print(f"output: {args.output_image}")