import os from typing import List from PIL import Image, ImageDraw, ImageFont, ImageFilter from PIL.Image import composite from BlurMe.ml.element_detection import BoundBox DIR_PATH = os.path.dirname(os.path.realpath(__file__)) def show_image_with_boxes( in_image_path: str, bounding_boxes: List[BoundBox], out_image_path: str = None ): img = Image.open(in_image_path) draw = ImageDraw.Draw(img) font_path = DIR_PATH + "/assets/fonts/arial.ttf" font = ImageFont.truetype(font_path, 25) for i, box in enumerate(bounding_boxes): draw.rectangle(box.get_params(), outline="red", width=2, fill=None) draw.text((box.x1 + 5, box.y1 + 5), str(i + 1), fill="red", font=font) if not out_image_path: out_image_path = ( in_image_path.split(".")[0] + "_out." + in_image_path.split(".")[1] ) img.save(out_image_path) def blur_boxes_on_image( in_image_path: str, bounding_boxes: List[BoundBox], out_image_path: str = None ): img = Image.open(in_image_path) blur_img = img.filter(ImageFilter.GaussianBlur(radius=7)) mask = Image.new("L", img.size, 255) draw_mask = ImageDraw.Draw(mask) for box in bounding_boxes: if box.selected: if box.object == "plate": draw_mask.rectangle(box.get_params(), fill=0) elif box.object == "face": draw_mask.ellipse(box.get_params(), fill=0) mask = mask.filter(ImageFilter.GaussianBlur(radius=3)) img = composite(img, blur_img, mask) if not out_image_path: out_image_path = ( in_image_path.split(".")[0] + "_blurred." + in_image_path.split(".")[1] ) img.save(out_image_path)