diff --git a/cloud/image_enhancer.py b/cloud/image_enhancer.py index d8790bc..0ac8b75 100644 --- a/cloud/image_enhancer.py +++ b/cloud/image_enhancer.py @@ -1,23 +1,26 @@ import cv2 def enhance_image_for_ai(input_path: str) -> str: - """Enhances dark areas and contrast using CLAHE without blowing out bright areas.""" + """Smooths camera sensor noise and brightens dark areas for vision LLMs.""" img = cv2.imread(input_path) if img is None: return input_path - # Convert to LAB color space to modify luminance channel only - lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB) + # 1. Remove ISO sensor noise (grain) + denoised = cv2.fastNlMeansDenoisingColored(img, None, h=7, hColor=7, templateWindowSize=7, searchWindowSize=21) + + # 2. Convert to LAB color space for luminance enhancement + lab = cv2.cvtColor(denoised, cv2.COLOR_BGR2LAB) l, a, b = cv2.split(lab) - # Apply CLAHE to Lightness channel - clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8, 8)) + # 3. Apply softer CLAHE (lower clipLimit prevents noise amplification) + clahe = cv2.createCLAHE(clipLimit=1.8, tileGridSize=(8, 8)) cl = clahe.apply(l) - # Merge channels and convert back to BGR + # 4. Merge channels back limg = cv2.merge((cl, a, b)) enhanced = cv2.cvtColor(limg, cv2.COLOR_LAB2BGR) enhanced_path = input_path.replace(".jpg", "_enhanced.jpg") - cv2.imwrite(enhanced_path, enhanced) + cv2.imwrite(enhanced_path, enhanced, [cv2.IMWRITE_JPEG_QUALITY, 90]) return enhanced_path \ No newline at end of file