import os import uuid import logging import numpy as np from PIL import Image, ImageEnhance, ImageFilter import cv2 def process_image(image_path, output_folder): """ Process the input image for geospatial analysis: - Convert to grayscale - Apply threshold to highlight features - Apply noise reduction - Apply edge detection Args: image_path (str): Path to the input image output_folder (str): Directory to save processed images Returns: str: Path to the processed image """ try: logging.info(f"Processing image: {image_path}") # Open the image img = Image.open(image_path) # Convert to RGB if it's not already if img.mode != 'RGB': img = img.convert('RGB') # Convert to numpy array for OpenCV processing img_array = np.array(img) # Convert to grayscale gray = cv2.cvtColor(img_array, cv2.COLOR_RGB2GRAY) # Apply Gaussian blur for noise reduction blurred = cv2.GaussianBlur(gray, (5, 5), 0) # Apply adaptive thresholding thresh = cv2.adaptiveThreshold( blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2 ) # Edge detection using Canny algorithm edges = cv2.Canny(thresh, 50, 150) # Morphological operations to clean up the result kernel = np.ones((3, 3), np.uint8) cleaned = cv2.morphologyEx(edges, cv2.MORPH_CLOSE, kernel) # Convert back to PIL Image processed_img = Image.fromarray(cleaned) # Save the processed image processed_filename = f"{uuid.uuid4().hex}_processed.png" output_path = os.path.join(output_folder, processed_filename) processed_img.save(output_path) logging.info(f"Image processing complete: {output_path}") return output_path except Exception as e: logging.error(f"Error in image processing: {str(e)}") raise Exception(f"Image processing failed: {str(e)}")