Spaces:
Sleeping
Sleeping
File size: 4,193 Bytes
96a9519 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
from PIL import Image
from PIL import ImageDraw
import numpy as np
def draw_points_on_image(image,
points,
curr_point=None,
highlight_all=True,
radius_scale=0.01):
overlay_rgba = Image.new("RGBA", image.size, 0)
overlay_draw = ImageDraw.Draw(overlay_rgba)
for point_key, point in points.items():
if ((curr_point is not None and curr_point == point_key)
or highlight_all):
p_color = (255, 0, 0)
t_color = (0, 0, 255)
else:
p_color = (255, 0, 0, 35)
t_color = (0, 0, 255, 35)
rad_draw = int(image.size[0] * radius_scale)
p_start = point.get("start_temp", point["start"])
p_target = point["target"]
if p_start is not None and p_target is not None:
p_draw = int(p_start[0]), int(p_start[1])
t_draw = int(p_target[0]), int(p_target[1])
overlay_draw.line(
(p_draw[0], p_draw[1], t_draw[0], t_draw[1]),
fill=(255, 255, 0),
width=2,
)
if p_start is not None:
p_draw = int(p_start[0]), int(p_start[1])
overlay_draw.ellipse(
(
p_draw[0] - rad_draw,
p_draw[1] - rad_draw,
p_draw[0] + rad_draw,
p_draw[1] + rad_draw,
),
fill=p_color,
)
if curr_point is not None and curr_point == point_key:
# overlay_draw.text(p_draw, "p", font=font, align="center", fill=(0, 0, 0))
overlay_draw.text(p_draw, "p", align="center", fill=(0, 0, 0))
if p_target is not None:
t_draw = int(p_target[0]), int(p_target[1])
overlay_draw.ellipse(
(
t_draw[0] - rad_draw,
t_draw[1] - rad_draw,
t_draw[0] + rad_draw,
t_draw[1] + rad_draw,
),
fill=t_color,
)
if curr_point is not None and curr_point == point_key:
# overlay_draw.text(t_draw, "t", font=font, align="center", fill=(0, 0, 0))
overlay_draw.text(t_draw, "t", align="center", fill=(0, 0, 0))
return Image.alpha_composite(image.convert("RGBA"),
overlay_rgba).convert("RGB")
def draw_mask_on_image(image, mask):
if mask is None:
mask = np.ones((image.height, image.width), dtype=np.uint8)
im_mask = np.uint8(mask * 255)
im_mask_rgba = np.concatenate(
(
np.tile(im_mask[..., None], [1, 1, 3]),
45 * np.ones(
(im_mask.shape[0], im_mask.shape[1], 1), dtype=np.uint8),
),
axis=-1,
)
im_mask_rgba = Image.fromarray(im_mask_rgba).convert("RGBA")
return Image.alpha_composite(image.convert("RGBA"),
im_mask_rgba).convert("RGB")
def draw_circle_on_mask(mask, x, y, radius, mode='add', inv=False):
H, W = mask.shape
J = np.arange(W, dtype=np.int32)
I = np.arange(H, dtype=np.int32)
I, J = np.meshgrid(I, J, indexing='ij')
dis = (I - y)**2 + (J - x)**2
if inv:
new_mask = dis > radius**2
else:
new_mask = dis <= radius**2
if mode == 'add':
return (mask + new_mask).clip(0, 1)
elif mode == 'mul':
return mask * new_mask
return (mask + new_mask).clip(0, 1) # default add mode
def draw_circle_on_image(image, x, y, radius, color=(255, 0, 0)):
H, W, C = image.shape
J = np.arange(W, dtype=np.int32)
I = np.arange(H, dtype=np.int32)
I, J = np.meshgrid(I, J, indexing='ij')
dis = (I - y)**2 + (J - x)**2
mask = dis <= radius**2
i_color = np.array(color, dtype=np.int32)
i_color = np.expand_dims(i_color, axis=[0, 1])
i_mask = mask.astype(np.int32)
i_mask = np.expand_dims(i_mask, axis=[2])
i_image = image.astype(np.int32)
i_image = image + i_mask * i_color
i_image = np.clip(i_image, 0, 255)
return i_image.astype(np.uint8) |