import cv2 import numpy as np import os def remove_photo_watermark_web(input_path, output_path, x, y, w, h, style="Standard AI Inpaint"): if not os.path.exists(input_path): return False img = cv2.imread(input_path) if img is None: return False img_h, img_w = img.shape[:2] # Safety check: Keep the coordinates inside the image x = max(0, min(x, img_w - 1)) y = max(0, min(y, img_h - 1)) w = max(1, min(w, img_w - x)) h = max(1, min(h, img_h - y)) if "Heavy Blur" in style: roi = img[y:y+h, x:x+w] k_size = max(15, min(w, h) // 2) if k_size % 2 == 0: k_size += 1 img[y:y+h, x:x+w] = cv2.GaussianBlur(roi, (k_size, k_size), 0) else: # THE MARGIN TRICK: We grab an extra 30 pixels of background around the logo margin = 30 y1 = max(0, y - margin) y2 = min(img_h, y + h + margin) x1 = max(0, x - margin) x2 = min(img_w, x + w + margin) roi = img[y1:y2, x1:x2] mask = np.zeros(roi.shape[:2], dtype=np.uint8) local_y = y - y1 local_x = x - x1 # We tell the AI EXACTLY where the logo is inside this bordered box cv2.rectangle(mask, (local_x, local_y), (local_x + w, local_y + h), 255, -1) if "Smart Text Eraser" in style: gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY) _, text_mask = cv2.threshold(gray, 180, 255, cv2.THRESH_BINARY) final_mask = cv2.bitwise_and(text_mask, mask) kernel = np.ones((3,3), np.uint8) final_mask = cv2.dilate(final_mask, kernel, iterations=1) cleaned_roi = cv2.inpaint(roi, final_mask, 3, cv2.INPAINT_TELEA) else: cleaned_roi = cv2.inpaint(roi, mask, 3, cv2.INPAINT_TELEA) # Paste the cleaned area perfectly back into the image img[y1:y2, x1:x2] = cleaned_roi cv2.imwrite(output_path, img) return True