from pathlib import Path import cv2 as cv import numpy as np input_path = Path("input/low-contrast.png") output_dir = Path("output") output_path = output_dir / "histogram-equalized.png" clahe_path = output_dir / "histogram-clahe.png" preview_path = output_dir / "histogram-equalize-preview.png" def write_image(path, data): path.parent.mkdir(parents=True, exist_ok=True) if not cv.imwrite(str(path), data): raise SystemExit(f"Could not write {path}") image = cv.imread(str(input_path), cv.IMREAD_GRAYSCALE) if image is None: raise SystemExit(f"Could not read {input_path}") equalized = cv.equalizeHist(image) clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) clahe_image = clahe.apply(image) preview = np.hstack((image, equalized, clahe_image)) write_image(output_path, equalized) write_image(clahe_path, clahe_image) write_image(preview_path, preview) print(f"input: min={image.min():3d} max={image.max():3d} std={image.std():5.2f}") print(f"equalized: min={equalized.min():3d} max={equalized.max():3d} std={equalized.std():5.2f}") print(f"clahe: min={clahe_image.min():3d} max={clahe_image.max():3d} std={clahe_image.std():5.2f}") print(f"saved: {output_path}") print(f"saved: {clahe_path}") print(f"saved: {preview_path}")