IgorSlinko's picture
Initial commit: Squircle corners prediction app with Gemini and YOLO
e97f848
Raw
History Blame Contribute Delete
2.6 kB
from pathlib import Path
from PIL import Image, ImageDraw
from .corners import Circle, Corners
DEFAULT_COLOR = (0, 255, 255, 255)
def draw_circle(draw: ImageDraw.Draw, circle: Circle, color: tuple, width: int = 3):
x1 = circle.x - circle.r
y1 = circle.y - circle.r
x2 = circle.x + circle.r
y2 = circle.y + circle.r
draw.ellipse([x1, y1, x2, y2], outline=color, width=width)
def draw_circles(
image: Image.Image,
corners: Corners,
color: tuple = DEFAULT_COLOR,
width: int = 3,
) -> Image.Image:
image = image.convert("RGBA")
overlay = Image.new("RGBA", image.size, (0, 0, 0, 0))
draw = ImageDraw.Draw(overlay)
for corner in [corners.top_left, corners.top_right, corners.bottom_left, corners.bottom_right]:
draw_circle(draw, corner, color, width)
result = Image.alpha_composite(image, overlay)
return result.convert("RGB")
def draw_crop_lines(
image: Image.Image,
corners: Corners,
color: tuple = DEFAULT_COLOR,
width: int = 2,
) -> Image.Image:
image = image.convert("RGBA")
overlay = Image.new("RGBA", image.size, (0, 0, 0, 0))
draw = ImageDraw.Draw(overlay)
x_left, y_top, x_right, y_bottom = corners.get_crop_bounds()
img_w, img_h = image.size
draw.line([(x_left, 0), (x_left, img_h)], fill=color, width=width)
draw.line([(x_right, 0), (x_right, img_h)], fill=color, width=width)
draw.line([(0, y_top), (img_w, y_top)], fill=color, width=width)
draw.line([(0, y_bottom), (img_w, y_bottom)], fill=color, width=width)
result = Image.alpha_composite(image, overlay)
return result.convert("RGB")
def visualize_corners(
image: Image.Image,
corners: Corners,
output_path: Path | None = None,
color: tuple = DEFAULT_COLOR,
) -> Image.Image:
image = image.convert("RGBA")
overlay = Image.new("RGBA", image.size, (0, 0, 0, 0))
draw = ImageDraw.Draw(overlay)
for corner in [corners.top_left, corners.top_right, corners.bottom_left, corners.bottom_right]:
draw_circle(draw, corner, color, width=3)
x_left, y_top, x_right, y_bottom = corners.get_crop_bounds()
img_w, img_h = image.size
draw.line([(x_left, 0), (x_left, img_h)], fill=color, width=2)
draw.line([(x_right, 0), (x_right, img_h)], fill=color, width=2)
draw.line([(0, y_top), (img_w, y_top)], fill=color, width=2)
draw.line([(0, y_bottom), (img_w, y_bottom)], fill=color, width=2)
result = Image.alpha_composite(image, overlay)
result = result.convert("RGB")
if output_path:
result.save(output_path)
return result