IgorSlinko's picture
Initial commit: Squircle corners prediction app with Gemini and YOLO
e97f848
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