treeextraction-ndvi / utils /image_processing.py
DynamicPacific
Add essential files for HF deployment
4b38b88
Raw History Blame Contribute Delete
2.16 kB
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)}")