Help me to darken the 3 human shadows in the glass make the shadows more darker and clear and reduce the background brightness
mkdir -p /tmp/workspace/shadow-edit && ls /tmp/workspace/shadow-edit/
cd /tmp/workspace/shadow-edit && curl -s -o original.jpg "https://d361swluvexzqs.cloudfront.net/chats-attachments/85910-1785168697027-qd6xb0.jpg" && echo "Downloaded" && python3 -c "from PIL import Image; img = Image.open('original.jpg'); print(img.size, img.mode)"
cd /tmp/workspace/shadow-edit && python3 << 'EOF' from PIL import Image, ImageEnhance, ImageFilter import numpy as np img = Image.open("original.jpg").convert("RGB") W, H = img.size print(f"Image size: {W}x{H}") arr = np.array(img, dtype=np.float32) # ---- Step 1: Reduce overall background brightness ---- # Apply a global darkening curve: gamma correction (gamma > 1 = darken) gamma = 1.5 arr_dark = np.clip((arr / 255.0) ** gamma * 255.0, 0, 255).astype(np.float32) # ---- Step 2: Identify shadow regions and darken further ---- # The 3 human reflections/shadows are approximately: # Shadow 1 (top-left head): x=[0,200], y=[400,780] (left large dark silhouette) # Shadow 2 (center reflection): x=[220,520], y=[480,800] (center area, overlapping pillar) # Shadow 3 (right head face): x=[530,800], y=[430,780] (right prominent head) # We'll work with the original dark-pixel detection to find and deepen shadows # A "shadow/reflection" pixel is one that is relatively dark and cool-toned # Build a per-pixel shadow score based on darkness and location shadow_mask = np.zeros((H, W), dtype=np.float32) # Define ROIs for each shadow (y_start, y_end, x_start, x_end) in original image coords # Shadow 1 - left dark figure (the large dark silhouette on left edge) shadow_mask[380:900, 0:260] = 1.0 # Shadow 2 - center ghostly reflection overlapping pillar area shadow_mask[420:900, 220:560] = 1.0 # Shadow 3 - right head/face reflection (most prominent dark head) shadow_mask[410:820, 500:820] = 1.0 # Also detect dark pixels in those regions using luminance threshold gray = 0.299 * arr[:,:,0] + 0.587 * arr[:,:,1] + 0.114 * arr[:,:,2] # Within shadow ROIs, pixels that are dark (lum < 120) are actual shadow pixels shadow_pixel_mask = (gray < 130).astype(np.float32) * shadow_mask # Smooth the shadow mask for a more natural look from PIL import ImageFilter shadow_img = Image.fromarray((shadow_pixel_mask * 255).astype(np.uint8)) shadow_img = shadow_img.filter(ImageFilter.GaussianBlur(radius=12)) shadow_pixel_mask = np.array(shadow_img).astype(np.float32) / 255.0 # Darken shadow pixels more aggressively: multiply by a factor < 1 shadow_darkening = 0.30 # reduce shadow pixels to 30% brightness for strong contrast arr_result = arr_dark.copy() for c in range(3): arr_result[:,:,c] = arr_dark[:,:,c] * (1.0 - shadow_pixel_mask * 0.70) # ---- Step 3: Slightly reduce brightness of the bright ceiling/interior ---- # Top area (ceiling with fluorescent lights) - reduce bright hotspots bright_zone = np.zeros((H, W), dtype=np.float32) bright_zone[0:600, :] = 0.5 # upper half - gentle darkening # only affect very bright pixels bright_pixels = (gray > 160).astype(np.float32) * bright_zone bright_mask_img = Image.fromarray((bright_pixels * 255).astype(np.uint8)) bright_mask_img = bright_mask_img.filter(ImageFilter.GaussianBlur(radius=20)) bright_pixels = np.array(bright_mask_img).astype(np.float32) / 255.0 for c in range(3): arr_result[:,:,c] = arr_result[:,:,c] * (1.0 - bright_pixels * 0.4) arr_result = np.clip(arr_result, 0, 255).astype(np.uint8) result = Image.fromarray(arr_result) result.save("output_enhanced.jpg", quality=95) print("Saved output_enhanced.jpg") EOF
cd /tmp/workspace/shadow-edit && python3 << 'EOF' # More refined approach - use contrast enhancement on shadow regions # and better shadow detection based on actual dark areas in the image from PIL import Image, ImageEnhance, ImageFilter import numpy as np img = Image.open("original.jpg").convert("RGB") W, H = img.size arr = np.array(img, dtype=np.float32) # Compute luminance gray = 0.299 * arr[:,:,0] + 0.587 * arr[:,:,1] + 0.114 * arr[:,:,2] # ---- STEP 1: Overall image - reduce background brightness ---- # Use S-curve: compress bright tones (darken highlights/midtones), preserve/deepen darks def s_curve_darken(x): """Darken the image: compress highlights and midtones, deepen shadows slightly""" x = x / 255.0 # Simple curve: darken by gamma on bright end out = np.where(x > 0.3, 0.3 + (x - 0.3) * 0.65, # compress highlights x * 0.85) # slightly deepen shadows return np.clip(out * 255.0, 0, 255) arr_bg = s_curve_darken(arr) # ---- STEP 2: Isolate shadow silhouettes and make them very dark/black ---- # The 3 human shadows are dark pixels in specific screen regions # Using actual luminance detection within ROIs # ROI for shadow 1: left side dark figure # ROI for shadow 2: center overlapping pillar # ROI for shadow 3: right head roi_masks = [ # (y1, y2, x1, x2) (300, 950, 0, 280), # shadow 1 - left figure (350, 900, 180, 600), # shadow 2 - center figure (350, 870, 460, 840), # shadow 3 - right face/head ] combined_shadow = np.zeros((H, W), dtype=np.float32) for (y1, y2, x1, x2) in roi_masks: roi_lum = gray[y1:y2, x1:x2] # Pixels darker than threshold in this ROI are shadow pixels # Use adaptive threshold - mean - offset roi_mean = roi_lum.mean() threshold = min(roi_mean * 0.85, 110) shadow_in_roi = (roi_lum < threshold).astype(np.float32) combined_shadow[y1:y2, x1:x2] = np.maximum(combined_shadow[y1:y2, x1:x2], shadow_in_roi) # Smooth mask edges shadow_img = Image.fromarray((combined_shadow * 255).astype(np.uint8)) shadow_img = shadow_img.filter(ImageFilter.GaussianBlur(radius=8)) combined_shadow_smooth = np.array(shadow_img).astype(np.float32) / 255.0 # Apply aggressive darkening to shadow pixels # Target: make shadows near-black (multiply by ~0.2) darken_strength = 0.75 # how much extra to darken shadow pixels (0=no change, 1=black) arr_result = arr_bg.copy() for c in range(3): arr_result[:,:,c] = arr_bg[:,:,c] * (1.0 - combined_shadow_smooth * darken_strength) # ---- STEP 3: Also slightly increase local contrast in shadow regions ---- # This makes edges of shadows cleaner arr_result = np.clip(arr_result, 0, 255).astype(np.uint8) result_img = Image.fromarray(arr_result) # Add a touch of sharpening to shadow edges sharpened = result_img.filter(ImageFilter.UnsharpMask(radius=1.5, percent=60, threshold=3)) sharpened.save("output_enhanced.jpg", quality=95) print(f"Saved. Shadow mean before: {gray[combined_shadow_smooth > 0.3].mean():.1f}") print("Done!") EOF
ls -lh /tmp/workspace/shadow-edit/
output enhanced
Image · JPG