TIMBOVILL commited on
Commit
b1e3e6e
Β·
verified Β·
1 Parent(s): 1a346bf

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -32
app.py CHANGED
@@ -2,53 +2,59 @@ import gradio as gr
2
  from PIL import Image
3
  import numpy as np
4
 
5
- def white_from_brightness_overlay(fg_img, bg_img, invert_opacity=False):
6
- if fg_img is None or bg_img is None:
7
  return None
8
 
9
- # Resize fg to match bg
10
- bg = bg_img.convert("RGBA")
11
- fg = fg_img.convert("RGB").resize(bg.size)
 
12
 
13
- # Convert to NumPy arrays
14
- fg_np = np.array(fg).astype(np.float32)
15
- bg_np = np.array(bg).astype(np.float32) / 255.0
16
-
17
- # Calculate brightness
18
- brightness = np.dot(fg_np[..., :3], [0.299, 0.587, 0.114]) # shape (H, W)
19
  if invert_opacity:
20
  brightness = 255 - brightness
21
- alpha = (brightness / 255.0).clip(0, 1) # shape (H, W)
22
 
23
- # Create solid white with alpha from brightness
24
- white = np.ones_like(fg_np) # 255,255,255
25
- white_alpha = np.dstack((white, alpha * 255)).astype(np.uint8) # shape (H, W, 4)
 
 
 
 
 
 
 
26
  white_img = Image.fromarray(white_alpha, mode="RGBA")
27
- white_np = np.array(white_img).astype(np.float32) / 255.0
28
 
29
- # Blend white image over background using premultiplied alpha
30
- fg_a = white_np[..., 3:4]
31
- bg_a = bg_np[..., 3:4]
32
- out_a = fg_a + bg_a * (1 - fg_a)
33
- out_rgb = (white_np[..., :3] * fg_a + bg_np[..., :3] * bg_a * (1 - fg_a)) / np.maximum(out_a, 1e-6)
 
 
 
 
 
 
 
 
34
 
35
- # Final output
36
- result = np.dstack((out_rgb, out_a)).clip(0, 1) * 255
37
- return Image.fromarray(result.astype(np.uint8), mode="RGBA")
38
 
39
  # Gradio UI
40
  iface = gr.Interface(
41
- fn=white_from_brightness_overlay,
42
  inputs=[
43
- gr.Image(type="pil", label="Input Image (Used for Brightness Only)"),
44
- gr.Image(type="pil", label="Background Image (Can Have Transparency)"),
45
- gr.Checkbox(label="Invert Brightness", value=False)
46
  ],
47
- outputs=gr.Image(type="pil", label="Final Output"),
48
- title="✨ White Brightness-to-Alpha Overlay",
49
  description=(
50
- "Uses the brightness of the input image to generate alpha. RGB is replaced with white. "
51
- "Result is a smooth glowing white shape over your background, respecting transparency."
52
  )
53
  )
54
 
 
2
  from PIL import Image
3
  import numpy as np
4
 
5
+ def brightness_to_white_alpha(img, bg=None, invert_opacity=False):
6
+ if img is None:
7
  return None
8
 
9
+ # Convert image to RGB and get brightness
10
+ img = img.convert("RGB")
11
+ img_np = np.array(img).astype(np.float32)
12
+ brightness = np.dot(img_np[..., :3], [0.299, 0.587, 0.114]) # shape: (H, W)
13
 
 
 
 
 
 
 
14
  if invert_opacity:
15
  brightness = 255 - brightness
 
16
 
17
+ # Normalize brightness to alpha (0.0–1.0), then scale back to 0–255
18
+ alpha = (brightness / 255.0).clip(0, 1)
19
+ alpha = (alpha * 255).astype(np.uint8)
20
+
21
+ # Create pure white RGB
22
+ white = np.ones_like(img_np, dtype=np.uint8) * 255 # shape: (H, W, 3)
23
+
24
+ # Combine white RGB and computed alpha
25
+ white_alpha = np.dstack((white, alpha)).astype(np.uint8) # shape: (H, W, 4)
26
+
27
  white_img = Image.fromarray(white_alpha, mode="RGBA")
 
28
 
29
+ # If background is provided, overlay white on top
30
+ if bg:
31
+ bg = bg.convert("RGBA").resize(white_img.size)
32
+ white_np = np.array(white_img).astype(np.float32) / 255.0
33
+ bg_np = np.array(bg).astype(np.float32) / 255.0
34
+
35
+ fg_a = white_np[..., 3:4]
36
+ bg_a = bg_np[..., 3:4]
37
+ out_a = fg_a + bg_a * (1 - fg_a)
38
+ out_rgb = (white_np[..., :3] * fg_a + bg_np[..., :3] * bg_a * (1 - fg_a)) / np.maximum(out_a, 1e-6)
39
+
40
+ result = np.dstack((out_rgb, out_a)).clip(0, 1) * 255
41
+ return Image.fromarray(result.astype(np.uint8), mode="RGBA")
42
 
43
+ return white_img
 
 
44
 
45
  # Gradio UI
46
  iface = gr.Interface(
47
+ fn=brightness_to_white_alpha,
48
  inputs=[
49
+ gr.Image(type="pil", label="Input Image"),
50
+ gr.Image(type="pil", label="Optional Background Image"),
51
+ gr.Checkbox(label="Invert Brightness β†’ Alpha", value=False)
52
  ],
53
+ outputs=gr.Image(type="pil", label="White with Alpha"),
54
+ title="πŸŽ›οΈ Brightness to White Alpha Image",
55
  description=(
56
+ "Generates a pure white image where opacity = brightness of input. "
57
+ "Darker = more transparent, lighter = more opaque. Optional overlay on background."
58
  )
59
  )
60